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