在阅读《计算机系统程序员方法》一书时,我看到了下面的章节,书中显示了一些汇编代码和%rsp寄存器在存储地址以传递控制时的状态(从底部开始):
<leaf>:
lea 0x2(%rdi), %rax. //%rsp at 0x7fffffffe810 storing 0x4004e
retq
<top>:
sub $0x5,%rdi. //%rsp at 0x7fffffffe818 storing 0x400560
callq 400540 <leaf>.
add %rax,%rax
retq
<main>:
callq 400545 <top> //%rsp at 0x7fffffffe820
mov %rax,%rax
其中所存储的地址用于每次调用之后的下一指令。
我看不出这里分配给%rsp的字节背后的逻辑,分配3个字节是有意义的,因为这足以表示地址,但是它在第一次调用时分配2个字节,然后在下一次调用时分配8个字节。%rsp是否指向未使用的空间,这就是为什么它只能减少2个字节?那么为什么它在调用leaf时减少8个字节?
1条答案
按热度按时间wztqucjr1#
但它在第一次调用时分配2字节,然后在下一次调用时分配8字节
它总是分配8个字节,不依赖于地址0x 400560的小值。
注解中的数字是十六进制的(因为
0x
前缀)!