我正在尝试了解堆栈机制。
从我所看到的理论来看,在调用函数之前,它的参数被压入堆栈。
但是,在下面的代码中调用 printf 时,它们都不会被推送:
#include<stdio.h>
int main(){
char *s = " test string";
printf("Print this: %s and this %s \n", s, s);
return 1;
}
我在 gdb 中对 printf 指令进行了中断,并且在显示堆栈时,没有 3 个参数被推入堆栈。
唯一推入堆栈的是字符串地址 s,如下面的反汇编代码所示:
0x000000000040052c <+0>: push %rbp
0x000000000040052d <+1>: mov %rsp,%rbp
0x0000000000400530 <+4>: sub $0x10,%rsp
0x0000000000400534 <+8>: movq $0x400604,-0x8(%rbp) // variable pushed on the stack
0x000000000040053c <+16>: mov -0x8(%rbp),%rdx
0x0000000000400540 <+20>: mov -0x8(%rbp),%rax
0x0000000000400544 <+24>: mov %rax,%rsi
0x0000000000400547 <+27>: mov $0x400611,%edi
0x000000000040054c <+32>: mov $0x0,%eax
0x0000000000400551 <+37>: callq 0x400410 <printf@plt>
0x0000000000400556 <+42>: mov $0x1,%eax
0x000000000040055b <+47>: leaveq
实际上,到目前为止,反汇编代码中出现的唯一参数是当“打印这个:%s 和这个 %s \n”被放入 %edi...
0x0000000000400547 <+27>: mov $0x400611,%edi
所以我的问题是:为什么我的三个参数中的每一个都没有看到 3 个推送指令?
uname -a: 3.8.0-31-generic #46-Ubuntu SMP Tue Sep 10 20:03:44 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux