Ken*_*ico 1 c++ assembly g++ x86-64 calling-convention
假设我们得到一个简单的程序
#include <cstdio>
int main(int argc, char* argv[]) {
int n = argc;
if (n > 1) {
n = 1;
}else {
n = -1;
}
printf("%d\n", n);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
g++ main.cpp -S -O1在ubuntu x64下使用Windows子系统生成的汇编代码和汇编代码段
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
Run Code Online (Sandbox Code Playgroud)
既push没有访问内存的指令,也没有访问内存的指令。因此,n必须通过传递参数%edx。现在,我想知道c库函数如何__printf_chk知道其中%edx包含期望的参数?更一般而言,它如何知道已使用了哪个寄存器?
这由平台的ABI(应用程序二进制接口)指定。编译器已编译__printf_chk为遵循您的平台ABI(在本例中为amd64 SysV ABI),从而使其期望参数位于某些位置。为了进一步阅读,请查看此ABI文档。
| 归档时间: |
|
| 查看次数: |
81 次 |
| 最近记录: |