Assembly 找出esp与程序上存储的返回地址之间的间隔字节数';s堆栈
我很难找到答案。从我读到的%ebp有32位,将%esp移到%ebp,你仍然有32位,然后减去70到32,剩下的我不懂。我是新手,所以我不是很熟练。请详细解释一下。谢谢大家! 下面是我遇到的问题 在这个指令序列的末尾,esp和程序堆栈上存储的返回地址之间的间隔是多少字节?假设我们使用标准32位x86调用约定调用此函数Assembly 找出esp与程序上存储的返回地址之间的间隔字节数';s堆栈,assembly,x86,att,cdecl,Assembly,X86,Att,Cdecl,我很难找到答案。从我读到的%ebp有32位,将%esp移到%ebp,你仍然有32位,然后减去70到32,剩下的我不懂。我是新手,所以我不是很熟练。请详细解释一下。谢谢大家! 下面是我遇到的问题 在这个指令序列的末尾,esp和程序堆栈上存储的返回地址之间的间隔是多少字节?假设我们使用标准32位x86调用约定调用此函数 804847c functioname: 804847c: push %ebp 804847d: mov %esp,%ebp 804847f: sub $0x70,%esp 8048
804847c functioname:
804847c: push %ebp
804847d: mov %esp,%ebp
804847f: sub $0x70,%esp
8048482: movl $0x0,0x4(%esp)
804848a: movl $0x8048580,(%esp)
sub$0x70,%esp
:在堆栈上保留0x70字节
movl$0x0,0x4(%esp)
:将一个32位的零值作为参数
movl$0x8048580,(%esp)
:放置一个地址。下一个ret将跳转到它
根据名为
cdecl
的标准调用约定,参数放在堆栈上,后跟被调用方应返回的地址。这似乎不正确。ESP已向下调整0x70(112字节)。在sub
指令之后,EBP的临时副本位于ESP+0x70,返回地址位于ESP+0x74。0x04(%esp)和(%esp)实际上指向使用sub$0x70,%esp
指令在堆栈上创建的局部变量区域。我认为,实际问题的答案是esp和返回地址之间的差异为0x70+0x04(4个字节用于EBP推送)。它是116十进制或0x74十六进制。应该指出movl
指令-我们不知道它们的用途。他们在问题中的实际包含实际上并没有改变ESP和回信地址之间的差异。事实上,他们只是在转移视线。这闻起来像是一个家庭作业,很可能是老师希望用最后两个说明来迷惑学生。@MichaelPetch你能详细解释一下你是如何得出这个答案的吗?比如为什么只使用“sub$0x70,%esp”和“movl$0x0,0x4(%esp)”这两个选项?为什么其他的没有计算?提前感谢您,我非常感谢您的输入。当调用函数functionme
时,call
指令将返回地址放在堆栈上。调用转移到functionme
ESP后,ESP指向堆栈顶部的返回地址<代码>推送%ebp将ESP减少4,并将ebp的副本放在那里。改变ESP的下一条指令是sub$0x70,%ESP
。这将从ESP中减去0x70(112)。两条movl
指令根本不会改变ESP,因此可以忽略。因此,当执行所有指令时,ESP的返回地址为0x70+0x04=0x74字节。此指令中的0x70
值sub$0x70,%ESP
符号扩展为32位,因此它也有32位,就像ESP
和ebp
一样。(虽然指令中的0x70
值在内部仅以8位编码,但这不是它的使用方式,这只是在这种特定情况下的存储优化)。使用的位数限制了可在这些位数中编码的不同值的数量,即8位可解释为0到255或-128到+127的值,或8个1位标志(开/关)。在您的问题中,这无关紧要,因为所有涉及的值都是32b。