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

标签 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 ) 中阅读了有关内联汇编的内容,因此我确实了解内联汇编语法。

您能给我一个提示,如何完成我上面写的结果编译吗?

谢谢!

最佳答案

有两个输入操作数,并且您已正确处理它们,因此开头没有丢失任何内容。

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

关于c - C 中的内联汇编 - 了解编译结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29445247/

相关文章:

c - 定义具有硬地址的指针时 volatile 关键字的必要性

签名中带有数组类型的 ccall 从 Julia 调用 C 中的结构

c - 如何设置外部变量的值?

c - 如何优化KASUMI算法的S盒?

c - fgets() : Ok by console, 管道错误

c++ - 这些 GCC/G++ 参数是什么?

c++ - 通过 SFINAE GCC 错误测试 std::ostream operator<< 是否存在?

c - AVR-GCC Makefile 链接问题

assembly - MIPS 错误地址/异常

assembly - 汇编jmp内存表达式