【发布时间】:2018-09-27 16:17:45
【问题描述】:
我目前正在处理 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](小写)从何而来。我已经阅读了一些文档,但没有找到答案。希望得到一些帮助!
谢谢
【问题讨论】:
-
文档是here。您可以在以 "The following i386 example uses the asmSymbolicName syntax" 开头的段落之后找到类似的语法
-
[arg0]和[number]只是程序员给出的用户定义名称(它们是别名)。相同的名称用于替换扩展程序集本身。名称可以是您选择的任何标识符。如果没有它们,扩展的内联程序集将显示为"pushl %1; pushl %0; int $0x30; addl $8, %%esp。而不是使用像%0和%1这样的位置值,这些名称使代码更具可读性和可维护性。