我想了解什么会在C以下代码的编译结果:内联汇编用C - 了解编译结果
int ppid;
#define SYS_getppid 23
asm volatile("int %1" : "=a" (ppid) : "i" (T_SYSCALL), "a" (SYS_getppid));
哪里T_SYSCALL是恒定的64
这我到目前为止:
? // I know something is missing here but I'm not sure what it is
mov $(SYS_getppid), %eax // "a" (SYS_getppid)
int $(T_SYSCALL) // T_SYSCALL = 64 in xv6
? // I know something is missing here but I'm not sure what it is
我不知道如何处理ppid变量。在声明时我应该在哪里保存它,以及如何在内联汇编代码的结果中为这个变量赋值(我想我应该在某处使用间接寻址)。
注意我试图使用GCC编译器为了创建一个汇编文件出c文件,但结果太复杂,我不知道我是否理解正确(我试图拿出最简单的编译结果)。
另外我读了关于GNU网站(https://gcc.gnu.org/onlinedocs/gcc/Using-Assembly-Language-with-C.html#Using-Assembly-Language-with-C)中的内联汇编,所以我理解内联汇编语法。
你能给我一个提示如何完成我上面写的结果汇编?
谢谢!
所以当你写“int ppid”时,编译器不会生成任何操作寄存器的汇编代码? – SyndicatorBBB 2015-04-04 12:46:05
不是这样,不,但是在函数开始时它将为所有局部变量分配空间。所以从这个意义上说,是的,在开始时有一些东西,即'subl $ 4,%esp',其中分配的金额取决于所有局部变量的大小以及平台的对齐要求。 – Jester 2015-04-04 12:50:04
非常感谢! – SyndicatorBBB 2015-04-04 16:47:45