我正在编写的8086汇编程序有一个问题。问题是汇编程序通过。
在传递1期间,您可以计算每个标签相对于区段的位置。
为此,必须计算每个指令的大小并将其添加到偏移量中。
如果标签的位置在一个范围内,则8086中的一些指令应该更小。例如,如果可以,"jmp _label“会选择短距离跳转,如果不能的话,它将选择近距离跳转。
现在问题是在传递1标签还没有到达,因此它不能确定指令的大小,因为"jmp短_label“小于"jmp近_label”指令。
那么,我如何确定"jmp _label“是否会变成"jmp短_label”呢?
三次通过可能也是一个问题,因为我们需要知道每条指令的大小之前,目前的指令,甚至提供一个抵消。
谢谢
发布于 2017-01-02 02:27:23
你能做的是从一个假设开始,一个短距离跳跃就足够了。如果当你发现跳跃的距离(或它的变化)时,这个假设变得无效,你会将你的短距离扩展到一个近距离的跳跃。在展开之后,您必须调整扩展跳转后标签的偏移量(由近跳指令的长度减去短跳指令的长度)。这一调整可能会使一些其他短距离跳跃不足,它们也将不得不改变为近跳。所以,可能有几次迭代,超过2次。
在实现此操作时,当展开跳转指令时,您应该避免在内存中移动代码。它将严重减慢装配速度。您也不应该对程序集源代码进行分析。
您还可以预先计算跳转和标签之间的某种相互依赖表,这样您就可以跳过标签和跳转指令,而不会受到扩展的跳转指令的影响。
要考虑的另一件事是,短距离跳转的前向距离为127字节,当以下指令超过127字节时,目标标签仍未遇到,这时可以将跳转更改为近跳。请记住,在任何时候,您可能有多达64向前短距离跳跃,可能会变得接近这种方式。
https://stackoverflow.com/questions/41418521
复制相似问题