我试图了解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)中的内联汇编,因此我理解了内联汇编语法。
你能否告诉我如何完成我上面写的结果汇编?
谢谢!
答案 0 :(得分:1)
有两个输入操作数,你已经正确处理了它们,所以开头没有任何缺失。
您有一个输出变量ppid
,它使用约束a
,您已经知道它引用了eax
寄存器。这意味着编译器期望ppid
的值在asm块之后位于eax
。因此,movl %eax, ppid
或ppid
是局部变量,当然使用esp
或ebp
的正确偏移量,例如movl %eax, 4(%esp)
。< / p>