c - 了解 C 中的 x86 ASM 函数

标签 c assembly x86

我目前正在处理 pintos 项目,对该项目包含的一些汇编宏有疑问

#define syscall1(NUMBER, ARG0)                                           \
({                                                               \
  int retval;                                                    \
  asm volatile                                                   \
    ("pushl %[arg0]; pushl %[number]; int $0x30; addl $8, %%esp" \
       : "=a" (retval)                                           \
       : [number] "i" (NUMBER),                                  \
         [arg0] "g" (ARG0)                                       \
       : "memory");                                              \
  retval;                                                        \
})

这个宏被调用来为只有一个参数的系统调用设置堆栈。我们将一个参数,系统调用号和陷阱推送到内核。我们只传递 NUMBER 和 ARG0,我想知道 [number] 和 [arg0](小写)从何而来。我已经阅读了一些文档,但没有找到答案。希望得到一些帮助!

谢谢

最佳答案

在 GCC 的扩展汇编语法中,符号 [name] "constraints"(表达式) 说:

  • 使表达式可用于汇编代码。
  • 表达式放在满足约束的地方。 约束 描述了可接受的使用位置,例如通用处理器寄存器、浮点寄存器和内存。它们还可能包括告诉 GCC 表达式将被汇编代码更改或同时读取和更改的符号。 (对于输出操作数,表达式应该是一个左值,以便它为要写入的新值提供一个位置。)
  • 使用名称 作为地点的名称。然后,当 GCC 在汇编代码中看到 %[name] 时,它会将其替换为引用该位置的汇编表达式,例如%rax16(r3)。操作数符号的 [name] 部分是可选的。如果你不给它,GCC 给操作数名称 0, 1, 2,…, 所以汇编代码会用 %0, %1, %2,...

关于c - 了解 C 中的 x86 ASM 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52541246/

相关文章:

arrays - 在 Assembly (x86) 中添加 2D 数组

assembly - 页面结构缓存性能事件

x86 - 如何制作汇编程序?

c - 是否可以在 GDB 调试器中使用 "jump"/"skip"?

c - 访问 C 中列表中的结构成员

c++ - 内联汇编会影响可移植性吗?

assembly - 参加汇编类(class),陷入DOS!

gcc - 尝试使用具有多个替代约束的内联汇编在 amd64 中实现 128 位添加

c - C中实用的延续传递风格?

c - 将在函数中创建的字符串分配给在 main 中创建的 typedef 结构数组