C中的内联汇编 - 了解编译结果

时间:2015-04-04 10:20:41

标签: c gcc assembly x86 inline-assembly

我试图了解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 个答案:

答案 0 :(得分:1)

有两个输入操作数,你已经正确处理了它们,所以开头没有任何缺失。

您有一个输出变量ppid,它使用约束a,您已经知道它引用了eax寄存器。这意味着编译器期望ppid的值在asm块之后位于eax。因此,movl %eax, ppidppid是局部变量,当然使用espebp的正确偏移量,例如movl %eax, 4(%esp)。< / p>