我正在编写的8086汇编器有问题。问题出在汇编器传递。
在通道1中,您将计算每个标签相对于线段的位置。
现在,要执行此操作,必须计算每条指令的大小并将其添加到偏移量中。
如果标签的位置在一定范围内,则8086中的某些说明应较小。例如,“ jmp _label”将选择短距离跳跃,如果不能,则将选择近距离跳跃。
现在问题出在传递1中,标签尚未到达,因此无法确定指令的大小,因为“ jmp short _label”小于“ jmp near _label”指令。
因此,如何确定天气“ jmp _label”是否变为“ jmp short _label”?
三遍可能也是一个问题,因为我们需要在当前指令之前知道每条指令的大小,甚至给出偏移量。
谢谢
您可以做的是假设一个短距离跳跃就足够了。如果在找到跳跃距离(或改变距离)时假设变为无效,则将短距离跳跃扩展为近距离跳跃。扩展之后,必须在扩展的跳转之后调整标签的偏移量(通过近跳转指令的长度减去短跳转指令的长度)。此调整可能会使其他一些短距离跳跃不足,因此也必须将其更改为近距离跳跃。因此,实际上可能有几次迭代,超过2次。
实现此功能时,在扩展跳转指令时应避免在内存中移动代码。它将严重减慢组装速度。您也不应重新解析程序集源代码。
您还可以预先计算跳转和标签之间的某种相关性表,因此您可以跳过标签和不受扩展跳转指令影响的跳转指令。
要考虑的另一件事是,您的短跳转的前向距离为127字节,并且当以下指令总计超过127字节且仍未遇到目标标签时,可以立即将跳转更改为近跳转。请记住,在任何时候,您可能会有多达64个向前的短距离跳跃,这种跳跃可能会接近。