gpt4 book ai didi

assembly - 8086 汇编问题,这段代码是做什么的

转载 作者:行者123 更新时间:2023-12-02 19:22:00 32 4
gpt4 key购买 nike

我在 assembly 类(class)中收到了这个问题:

这个程序的作用是什么
以及应该如何调用它?

push ebp
mov ebp, esp
push esi

mov esi, [ebp+4]
mov eax, [esi]
sub eax, [esi+4]
add esi, 8
mov [ebp+4], esi

pop esi
pop ebp
ret

看起来[ebp+4]是一个参数而不是返回地址,所以应该用“jmp”而不是“call”来调用它。我真的不明白在 [esi+4]esi+8 (返回地址)上应该找到什么嗯,我真的很困惑,希望你能帮助我
提前致谢。

最佳答案

正如您正确地注意到的,如果使用 call 调用此例程,则 [ebp+4] 是返回地址。这并不意味着这是一个坏主意。

假设例程是通过call调用的。此时,压入堆栈的“返回地址”是紧跟在call操作码之后的字节的地址。我们将此地址称为x。然后该例程从地址x中提取两个32位字,一个在地址x处,一个在地址x+4处。它从第一个单词中减去第二个单词,并将结果存储在eax中。最后,例程将值x+8存储回堆栈槽[ebp+4]中,最终效果是当ret到达后,执行会在地址 x+8 处恢复。根据这个假设,例程看起来像是一种减去位于代码中间的整数的方法,如下所示:

call yourroutine
dd 56478634
dd 18943675
mov ebx, eax ; an example instruction

这里,call 返回到 mov 指令,此时 eax 包含值 37534959(即 56478634 减去 18943675) .

作为代码例程,它并不是很有用,因为它是一种用硬编码的常量值加载 eax 的复杂方法(代码空间在执行期间通常是只读的)。人们可能会想象这样的例程可能会作为某些体系结构上动态链接的运行时支持的一部分出现(动态链接是一个棘手的主题)。

现在,我们假设该例程是通过 jmp 调用的。 [ebp+4] 现在指定此时堆栈顶部的任何内容。该例程采用该值(我们称之为y),获取地址yy+4处的两个单词,将减法结果计算为eax,然后将y+8存储回[ebp+4]槽中。最后,ret 将该槽解释为返回地址,即执行应跳转到的某些代码的地址。该地址的生成过程中不涉及任何call操作码,这并不重要;尽管如此,ret 仍会跳转到它。这次,调用代码可能如下所示:

    push   foobar
jmp yourroutine
... ; unreached code

foobar:
dd 56478634
dd 18943675
mov ebx, eax ; an example instruction

这一次,这看起来像是一个带有一些eax固有加载的参数化跳转。类似的代码可能存在于某些 interpreters for threaded code 的实现中。然而,作为一个家庭作业问题,我很确定这不是我们想要的(线程代码解释器甚至比动态链接更毛茸茸的)。

关于assembly - 8086 汇编问题,这段代码是做什么的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6327973/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com