【问题标题】:Inline assembly in C - Understand the compilation resultC 中的内联汇编 - 了解编译结果
【发布时间】:2015-04-04 20:42:55
【问题描述】:

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

能否请您提示我如何完成我上面写的结果编译?

谢谢!

【问题讨论】:

    标签: c gcc assembly x86 inline-assembly


    【解决方案1】:

    有两个输入操作数,并且您都正确处理了它们,所以一开始没有任何遗漏。

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

    【讨论】:

    • 那么当你写“int ppid”时,编译器不会生成任何操作寄存器的汇编代码?
    • 不是这样,不,但在函数的开头,它会为所有局部变量分配空间。所以从这个意义上说,是的,开头有一些东西,即subl $4, %esp,其中分配的数量取决于所有局部变量的大小和平台的对齐要求。
    猜你喜欢
    • 2013-07-23
    • 2019-02-04
    • 2019-10-03
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多