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

Inline assembly in C - Understand the compilation result

我想了解以下代码在 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) 上阅读了有关内联汇编的内容,因此我确实了解内联汇编语法。

能否请您指点一下如何完成我上面写的结果编译?

谢谢!

有两个输入操作数,您都正确处理了它们,因此开头没有遗漏任何内容。

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