2015-04-04 72 views
0

我想了解什么会在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)中的内联汇编,所以我理解内联汇编语法。

你能给我一个提示如何完成我上面写的结果汇编?

谢谢!

回答

1

有两个输入操作数,并且您已正确处理它们两个,所以在开始时没有任何丢失。

您有一个输出变量ppid,它使用约束条件a并且您已经知道是指eax寄存器。这意味着编译器希望ppid的值在asm块后面的eax之内。因此,类似于movl %eax, ppid或者ppid是局部变量,那么当然使用来自espebp的正确偏移,例如movl %eax, 4(%esp)

+0

所以当你写“int ppid”时,编译器不会生成任何操作寄存器的汇编代码? – SyndicatorBBB 2015-04-04 12:46:05

+0

不是这样,不,但是在函数开始时它将为所有局部变量分配空间。所以从这个意义上说,是的,在开始时有一些东西,即'subl $ 4,%esp',其中分配的金额取决于所有局部变量的大小以及平台的对齐要求。 – Jester 2015-04-04 12:50:04

+1

非常感谢! – SyndicatorBBB 2015-04-04 16:47:45