我在处理这些汇编代码:
在调用foo之前使用地址***%rsp = 0x7FFFFFFFDE88***
调用函数foo后,新元素被压入堆栈帧%rsp,因此%rsp的地址现在应该是***0x7FFFFFFFDE80***,并且它应该包含 callq 指令之后的指令地址。在函数foo的入口中,它从$0x38减到%rsp以压入更多元素,因此%rsp现在是***0x7FFFFFFFDE48***。我对指令 67e 有一些疑问:当movq $0x2(%rsp)时,是否将其移动到地址***0x7FFFFFFFDE48***,即%rsp的开始?
1条答案
按热度按时间hs1rzwqc1#
是的。这是堆栈的样子:
请注意,在
6d0: e8 95 ff ff ff callq 66a <foo>
行,之后的地址是6d5
,如果从66a
中减去6d5
,则得到0xFFFFFF95
(在符号扩展时,它是foo
中第一行代码之间的相对距离)。