Assembly 如何';这里的RSP下降了吗?
通过调试,我发现在Assembly 如何';这里的RSP下降了吗?,assembly,gdb,Assembly,Gdb,通过调试,我发现在main中调用func时,RSP从0x7fffffe960到0x7fffffe958减少了8: (gdb) disas func Dump of assembler code for function func: 0x0000000000400448 <func+0>: push %rbp 0x0000000000400449 <func+1>: mov %rsp,%rbp 0x000000000040044c <func+4
main
中调用func
时,RSP
从0x7fffffe960
到0x7fffffe958
减少了8
:
(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
这是因为返回地址的大小也是64位(例如,
0x000000000040457
)。调用func
时,该值被放入堆栈,堆栈指针按该值递减。为什么返回地址0x000000000040457
为8字节,而寄存器rsp(0x7fffffffe960)
仅为6字节?@compile fan,不是6字节,而是8字节。它只显示6,但这将是调试器做出的决定。即使写为0x400457(不带前导零),返回地址仍然是8个字节。实际上,它是0x00007FFFFFE960,如果要计数,它是8个字节。一些非常聪明的人不久前决定可以省略前导零
(gdb) x/4x 0x7fffffffe960
0x7fffffffe960: 0x00000000 0x00000000 0xf401d994 0x00000034