2011-03-28 2 views
0

Через отладки, я обнаружил, что, когда func называется в main, RSP уменьшается 8 от 0x7fffffffe960 до 0x7fffffffe958:Как здесь снизился 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 func сделает rsp снижение на 8?

UPDATE

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

ответ

1

Это потому, что адреса возврата также 64 бит размера (например. 0x0000000000400457). Когда вы вызываете func, это значение помещается в стек, а указатель стека уменьшается на эту величину.

+0

Почему обратный адрес '0x0000000000400457' составляет 8 байтов, но зарегистрировать' rsp (0x7fffffffe960 ) 'всего 6 байтов? –

+0

@ compile-fan, это не 6 байтов, это 8. Это только _displaying_ 6, но это будет decisio, который делает отладчик. Этот обратный адрес будет по-прежнему иметь 8 байтов, даже если он написан как 0x400457 (без начальных нулей). – paxdiablo

+0

На самом деле это 0x00007fffffffe960, что составляет восемь байтов, если вы хотите подсчитать. Некоторые очень умные люди когда-то решили, что ведущие нули могут быть опущены – hirschhornsalz

Смежные вопросы