assembly 处理控制传输时的堆栈字节分配

pgccezyw  于 2023-01-17  发布在  其他
关注(0)|答案(1)|浏览(117)

在阅读《计算机系统程序员方法》一书时,我看到了下面的章节,书中显示了一些汇编代码和%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个字节?

wztqucjr

wztqucjr1#

但它在第一次调用时分配2字节,然后在下一次调用时分配8字节
它总是分配8个字节,不依赖于地址0x 400560的小值。
注解中的数字是十六进制的(因为0x前缀)!

0x7fffffffe820
- 0x7fffffffe818
  --------------
               8

  0x7fffffffe818
- 0x7fffffffe810
  --------------
               8

相关问题