被调用方如何知道参数是通过寄存器而不是堆栈传递的
How does callee know arguments are passed through registers instead of stack
假设我们得到一个简单的程序
#include <cstdio>
int main(int argc, char* argv[]) {
int n = argc;
if (n > 1) {
n = 1;
}else {
n = -1;
}
printf("%dn", n);
return 0;
}
以及在 ubuntu x64(Windows 子系统(下使用 g++ main.cpp -S -O1
生成的汇编代码片段
subq $8, %rsp
cmpl $1, %edi
setg %dl
movzbl %dl, %edx
leal -1(%rdx,%rdx), %edx
movl $.LC0, %esi
movl $1, %edi
movl $0, %eax
call __printf_chk
movl $0, %eax
addq $8, %rsp
ret
既没有访问和写入内存的push
也没有任何指令。所以n
的论点必须通过%edx
传递。现在我想知道 c 库函数__printf_chk
如何知道%edx
包含预期的参数?更一般地说,它如何知道使用了哪些寄存器?
这由平台的 ABI(应用程序二进制接口(指定。 编译器已编译__printf_chk
以遵循您的平台 ABI(在本例中为 amd64 SysV ABI(,导致它期望参数位于某些位置。 如需进一步阅读,请查看此 ABI 文档。
相关文章:
- 本质:使用__128寄存器
- 将寄存器设计成可由C和C++访问的外设的最佳实践
- 在模拟器中使用并集来模拟CPU寄存器有多合适
- 使用英特尔 PIN 修改寄存器
- AVX 指令中寄存器和指针之间的客观差异
- 如何确定我的处理器有多少个 AVX 寄存器?
- 除非使用某些寄存器,否则函数挂钩会崩溃
- 寄存器上的管道计算
- 其中关于内存和寄存器的左值和右值
- 有没有办法强制C++编译器将变量存储在寄存器中?
- "变量":函数中函数作用域不允许初始化的自动或寄存器变量'naked'
- 被调用方如何知道参数是通过寄存器而不是堆栈传递的
- Freertos 硬故障分析 - 堆栈寄存器
- 尝试使用引脚工具从堆栈中打印寄存器的值
- 汇编函数调用是否会导致所有寄存器被推送到堆栈中
- C++内存堆栈/寄存器范围
- 为什么 MSVC 在寄存器中返回一个小结构时不必要地使用堆栈
- 如何停止线程并将其寄存器刷新到堆栈中
- 如何知道变量是在寄存器中,还是在堆栈上?
- 编写自定义纯虚拟处理程序:调用堆栈和寄存器时的状态是什么