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
Почему обратный адрес '0x0000000000400457' составляет 8 байтов, но зарегистрировать' rsp (0x7fffffffe960 ) 'всего 6 байтов? –
@ compile-fan, это не 6 байтов, это 8. Это только _displaying_ 6, но это будет decisio, который делает отладчик. Этот обратный адрес будет по-прежнему иметь 8 байтов, даже если он написан как 0x400457 (без начальных нулей). – paxdiablo
На самом деле это 0x00007fffffffe960, что составляет восемь байтов, если вы хотите подсчитать. Некоторые очень умные люди когда-то решили, что ведущие нули могут быть опущены – hirschhornsalz