2011-03-28 62 views
0

經過調試,我發現,當調用mainfuncRSP80x7fffffffe9600x7fffffffe958下降:RSP如何減少?

(gdb) disas func 
Dump of assembler code for function func: 
0x0000000000400448 <func+0>: push %rbp 
0x0000000000400449 <func+1>: mov %rsp,%rbp 
0x000000000040044c <func+4>: mov $0x1,%eax 
0x0000000000400451 <func+9>: leaveq 
0x0000000000400452 <func+10>: retq 
End of assembler dump. 
(gdb) disas main 
Dump of assembler code for function main: 
0x0000000000400453 <main+0>: push %rbp 
0x0000000000400454 <main+1>: mov %rsp,%rbp 
0x0000000000400457 <main+4>: callq 0x400448 <func> 
0x000000000040045c <main+9>: mov $0x6,%eax 
0x0000000000400461 <main+14>: leaveq 
0x0000000000400462 <main+15>: retq 

爲什麼calla func8使rsp下降?

UPDATE

(gdb) x/4x 0x7fffffffe960 
0x7fffffffe960: 0x00000000 0x00000000 0xf401d994 0x00000034 

回答

1

這是因爲返回的地址也在64位大小(例如0x0000000000400457)。當您調用func時,該值將被放置到堆棧上並且堆棧指針會減少該量。

+0

爲什麼返回地址0x0000000000400457是8字節,但寄存器rsp(0x7fffffffe960 )只有6個字節? – 2011-03-28 15:47:36

+0

@編譯風扇,它不是6字節,它是8.它只是_displaying_ 6,但這將是調試器的決定。即使寫入0x400457(沒有前導零),該返回地址仍然是8個字節。 – paxdiablo 2011-03-28 16:11:11

+0

實際上它是0x00007fffffffe960,如果你想計算,它是八個字節。一些非常聰明的人早些時候決定可以省略前導零 – hirschhornsalz 2011-03-28 16:27:56