我目前正在处理 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] 时,它会将其替换为引用该位置的汇编表达式,例如
%rax
或16(r3)
。操作数符号的 [name] 部分是可选的。如果你不给它,GCC 给操作数名称 0, 1, 2,…, 所以汇编代码会用 %0, %1, %2,...
关于c - 了解 C 中的 x86 ASM 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52541246/