2017-01-01 62 views
3

我正在编写我的8086汇编程序。 问题在于汇编程序通过。汇编程序通过问题

在通1你计算相对于片段每个标签的位置。

我们做到这一点每个指令的大小必须被计算并添加到偏移。

在8086一些指令应更小,如果标签的位置的范围内。例如,“jmp _label”会选择一个短暂的跳跃,如果它不能跳转的话。

现在问题出现在第1遍标签尚未到达,因此它不能确定指令的大小,因为“jmp short _label”小于“jmp near _label”指令。

所以我怎么能决定耐候“JMP _label”变成了“JMP短_label”与否?

三道也可能是一个问题,因为我们需要的电流指令,甚至给偏移之前需要了解每一个指令的大小。

谢谢

+0

我想过一个可能的解决方案,让我知道你是否同意? – NibbleBits

+0

我想过一个可能的解决方案让我知道,如果你同意? 我能做的就是猜测并选择短暂的跳跃。在它完成计算段的大小后,它会追溯并查看它们是否是一个错误,如果它们是它会纠正每个指令抵消?这将是缓慢的,但会工作,如果任何人有更好的方式,请让我知道 – NibbleBits

+0

我正在编写一个8086的汇编程序。因为我写了一个编译器,从那里生成汇编程序将创建机器代码。 – NibbleBits

回答

3

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

在实现这一点,你应该避免在内存扩展跳转指令时,移动代码。这将严重拖慢组装。您不应该重新汇编程序集源代码。

您也可以预先计算某种跳跃和标签之间的相互关系表,所以你可以跳过标签和跳转指令通过扩展跳转指令的影响。

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

+0

我在我自己的帖子的评论中提出了一个相似的东西,你的文章是一个更深入的解决方案谢谢。当我改变一跳时,我也会想到自己,这可能会影响到其他人,你完全正确。我很高兴有人同意我的意见,这意味着我走在正确的轨道上。非常感谢:) – NibbleBits

+0

我不认为你可以帮助我的其他问题吗?没有人回答,并且已经有一个月左右的时间了:http://stackoverflow.com/questions/41022380/omfobject-module-format-length-field-appears-incorrect – NibbleBits

+0

跟踪开放可能 - 近跳跃不应该花太多时间时间,因为它通常只有一个手工满(Alexey提到<64),它可以防止你移动内存块。我希望通过一个(也许是巨大的)交叉链接相关跳转列表来选择这个选项。你可以预测:如果2个跳转是打开的,并且已经使用了'128-2x(打开跳转数)'字节,则两个跳转都会很长 – Tommylee2k