【发布时间】:2018-04-15 15:52:08
【问题描述】:
假设我们有一个简单的程序
#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;
}
以及在ubuntu x64(Windows子系统)下使用g++ main.cpp -S -O1生成的汇编代码sn-p
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 包含预期参数的?更一般地说,它如何知道使用了哪些寄存器?
【问题讨论】:
标签: c++ assembly g++ x86-64 calling-convention