Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 找出esp与程序上存储的返回地址之间的间隔字节数';s堆栈_Assembly_X86_Att_Cdecl - Fatal编程技术网

Assembly 找出esp与程序上存储的返回地址之间的间隔字节数';s堆栈

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

我很难找到答案。从我读到的%ebp有32位,将%esp移到%ebp,你仍然有32位,然后减去70到32,剩下的我不懂。我是新手,所以我不是很熟练。请详细解释一下。谢谢大家!

下面是我遇到的问题

在这个指令序列的末尾,esp和程序堆栈上存储的返回地址之间的间隔是多少字节?假设我们使用标准32位x86调用约定调用此函数

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。