(gdb) l main
1 #include <stdio.h>
2
3 int main(void)
4 {
5 int i = 6;
6 printf("%d",sizeof(unsigned short));
7 return 0;
8 }
(gdb) disas main
Dump of assembler code for function main:
0x0000000000400498 <main+0>: push %rbp
0x0000000000400499 <main+1>: mov %rsp,%rbp
0x000000000040049c <main+4>: sub $0x10,%rsp
0x00000000004004a0 <main+8>: movl $0x6,-0x4(%rbp)
0x00000000004004a7 <main+15>: mov $0x2,%esi
0x00000000004004ac <main+20>: mov $0x4005c8,%edi
0x00000000004004b1 <main+25>: mov $0x0,%eax
0x00000000004004b6 <main+30>: callq 0x400398 <[email protected]>
0x00000000004004bb <main+35>: mov $0x0,%eax
0x00000000004004c0 <main+40>: leaveq
0x00000000004004c1 <main+41>: retq
我有兩個疑惑:大會分析問題
- 對於
int i = 6
,只有4
字節是必要的,爲什麼16
字節分配呢? - 一些函數使用棧傳遞參數(通過
push xxx
),但爲什麼printf
使用esi
和edi
來做到這一點?
UPDATE
似乎printf
不從esi
和edi
取:
(gdb) disas printf
Dump of assembler code for function [email protected]:
0x0000000000400398 <[email protected]+0>: jmpq *0x2004c2(%rip) # 0x600860 <_GLOBAL_OFFSET_TABLE_+24>
0x000000000040039e <[email protected]+6>: pushq $0x0
0x00000000004003a3 <[email protected]+11>: jmpq 0x400388
對於2,函數如果知道從哪裏得到參數,如果有多個分支? – gdb 2011-03-29 03:28:22
對於1,返回地址不應該是8字節,比如「0x00000000004004ac」? – gdb 2011-03-29 03:30:02
這個答案完全是假的。您可能會注意到,在* frame指針被壓入後,16個字節保留在堆棧*上。 – 2011-03-29 03:37:52