gpt4 book ai didi

c - 了解 C 中的 x86 ASM 函数

转载 作者:太空宇宙 更新时间:2023-11-04 01:46:42 27 4
gpt4 key购买 nike

我目前正在处理 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com