汇编程序通过问题

时间:2017-01-01 20:00:56

标签: algorithm assembly x86-16

我写的是我的8086汇编程序的问题。 问题在于汇编程序传递。

在第1遍期间,您将计算每个标签相对于细分的位置。

现在要做到这一点,必须计算每条指令的大小并将其添加到偏移量中。

如果标签的位置在一个范围内,8086中的某些说明应该更小。例如" jmp _label"如果可能的话会选择短跳,如果它不能接近跳跃。

现在问题出在第1阶段,标签尚未到达,因此无法确定指令的大小为" jmp short _label"小于_label附近的" jmp"指令。

那我怎么能决定天气" jmp _label"成为一个" jmp短_label"不是吗?

三次传递也可能是一个问题,因为我们需要在当前指令之前知道每条指令的大小,甚至给出一个偏移量。

由于

1 个答案:

答案 0 :(得分:3)

你能做的就是假设短跳是足够的。如果在找到跳跃距离时(或者当它发生变化时)假设变得无效,则将短跳跃扩展到近似跳跃。在此扩展之后,您必须在扩展跳转之后调整标签的偏移量(通过近跳转指令的长度减去短跳转指令的长度)。这种调整可能会使其他一些短跳不足,并且它们也必须改为接近跳跃。因此,实际上可能会有多次迭代,超过2次。

实现此操作时,应避免在扩展跳转指令时在内存中移动代码。这将严重减慢组装速度。您也不应重新组装汇编源代码。

您也可以在跳转和标签之间预先计算某种相互依赖关系表,这样您就可以跳过不受扩展跳转指令影响的标签和跳转指令。

另一件需要考虑的事情是,你的短跳转的前向距离为127个字节,当下面的指令超过127个字节并且仍然没有遇到目标标签时,你可以将跳转更改为近跳转那么。请记住,在任何时候你都可能有多达64个向前跳跃,可能会以这种方式接近。

相关问题