[Subject Prev][Subject Next][Thread Prev][Thread Next][Subject Index][Thread Index]

Re: what followin code is doin?



>     pls tell me what is the meaning of this code
>
> -------------------------------------------------------
> int exec_interrupt(const char *filename, const arg[], const char *envp[])
>
> {
>       long __res;
>       __asm__ volatile("int $0x80" :a" (__res): "0"
(__NE_exec_call),"b"((long)(filename),"c" ((long)(argv)),"d"((long)(envp)));
>
>        return (int __res);
> }
>

After a few corrections(more or less trivial ones), the code is:

int exec_interrupt(const char *filename, const argv[], const char *envp[]) {
long __res;
 __asm__ volatile("int $0x80" : "=a" (__res) : "0" (__NR_execve),
                            "b" ((long)(filename)), "c" ((long)(argv)),
                           "d"((long)(envp)));
       return (int) __res;
}
There is no such thing as __NE_exec_call(unless you've
defined them yourselves). <asm/unistd.h> defines __NR_execve.

This seems to be doing is calling interrupt 0x80(Linux system call
interrupt) with the following arguments :
. The value __NR_execve(system call number) in whatever "0"
  specifies [ register EAX on x86]
. The filename pointer in EBX ("b")
. argv in ECX("c")
. envp in EDX("d")
. output on returning would be in the whatever "=a" specifies [EAX]

This, btw, is the syntax for Extended Asm of gcc. Basically gcc
doesn't parse through whatever code is present in the __asm__ block.
It just emits code from this block into the asm it generates. But this
causes a major problem wrt compiler optimizations. So this is a way to
let the compiler know as to what the __asm__ block is changing.

You can check out <asm/unistd.h> and the Linux kernel source for a lot more
similar
examples. Also take a look at info gcc.C Extensions.Extended Asm.

Regards,
ankur
PS: Are you the same guy, who was very interested in the Beowulf
architecture?