assembly 包含在%rsp寄存器中的值

2lpgd968  于 2023-01-09  发布在  其他
关注(0)|答案(1)|浏览(153)

我在处理这些汇编代码:

在调用foo之前使用地址***%rsp = 0x7FFFFFFFDE88***
调用函数foo后,新元素被压入堆栈帧%rsp,因此%rsp的地址现在应该是***0x7FFFFFFFDE80***,并且它应该包含 callq 指令之后的指令地址。在函数foo的入口中,它从$0x38减到%rsp以压入更多元素,因此%rsp现在是***0x7FFFFFFFDE48***。我对指令 67e 有一些疑问:当movq $0x2(%rsp)时,是否将其移动到地址***0x7FFFFFFFDE48***,即%rsp的开始?

hs1rzwqc

hs1rzwqc1#

是的。这是堆栈的样子:

0x7FFFFFFFDE48: 02 00 00 00 00 00 00 00
0x7FFFFFFFDE50: 03 00 00 00 00 00 00 00
0x7FFFFFFFDE58: 05 00 00 00 00 00 00 00
0x7FFFFFFFDE60: 07 00 00 00 00 00 00 00
0x7FFFFFFFDE68: ?? ?? ?? ?? ?? ?? ?? ?? (Your code never wrote to this memory)
0x7FFFFFFFDE70: ?? ?? ?? ?? ?? ?? ?? ?? (Your code never wrote to this memory)
0x7FFFFFFFDE78: ?? ?? ?? ?? ?? ?? ?? ?? (Your code never wrote to this memory)
0x7FFFFFFFDE80: D5 06 00 00 00 00 00 00 (return address)
0x7FFFFFFFDE88: ?? ?? ?? ?? ?? ?? ?? ?? (Your code never wrote to this memory)

请注意,在6d0: e8 95 ff ff ff callq 66a <foo>行,之后的地址是6d5,如果从66a中减去6d5,则得到0xFFFFFF95(在符号扩展时,它是foo中第一行代码之间的相对距离)。

相关问题