我试图了解以下代码在 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
的值位于 eax
在 asm block 之后。因此类似movl %eax, ppid
,或者,如果ppid
是一个局部变量,那么当然使用 esp
的正确偏移量或ebp
如movl %eax, 4(%esp)
.
关于c - C 中的内联汇编 - 了解编译结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29445247/