【问题标题】:Assembler passes issue汇编程序通过问题
【发布时间】:2017-01-01 20:00:55
【问题描述】:

我正在编写的 8086 汇编器有问题。 问题出在汇编程序通行证上。

在第 1 阶段,您计算每个标签相对于段的位置。

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

如果标签的位置在一个范围内,8086 中的某些指令应该更小。例如,“jmp _label”会选择短跳转,如果可以,会选择近跳转。

现在问题是在第 1 步中,标签尚未到达,因此它无法确定指令的大小,因为“jmp short _label”小于“jmp near _label”指令。

那么我如何确定天气“jmp _label”是否成为“jmp short _label”?

三遍也可能是个问题,因为我们需要知道当前指令之前每条指令的大小才能给出偏移量。

谢谢

【问题讨论】:

  • 我想到了一个可能的解决方案,如果您同意,请告诉我?
  • 我想到了一个可能的解决方案,如果您同意,请告诉我?我能做的是让它猜测并选择一个短跳。在计算完段的大小后,它将回溯并查看它们是否是错误的,如果它们会纠正每个指令偏移量吗?这会很慢,但会起作用,如果有人有更好的方法,请告诉我
  • 我正在为 8086 编写一个汇编器。因为我已经编写了一个编译器,它从那里生成汇编,汇编器将创建机器代码。
  • 这里的人可以帮助你。 board.flatassembler.net 如果有机会,请与 Tomasz 交谈并询问他。
  • 谢谢你的链接。

标签: algorithm assembly x86-16


【解决方案1】:

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

在实现这一点时,您应该避免在扩展跳转指令时将代码移动到内存中。它会严重减慢组装速度。您也不应该重新解析汇编源代码。

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

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

【讨论】:

  • 我在我自己的帖子的评论中提出了一个类似的建议,您的帖子是一个更深入的解决方案,谢谢。我也想,当我改变一个跳跃的那一刻,它可能会影响其他跳跃,你完全正确。我很高兴有人同意我的观点,这一定意味着我在正确的轨道上。非常感谢:)
  • 我想你不能帮助我解决我的其他问题,可以吗?没有人回答,大约一个月了:stackoverflow.com/questions/41022380/…
  • 跟踪打开的可能接近跳跃不应该花费太多时间,因为它通常只是一个手满(正如 Alexey 提到的 128-2x(number of jumps open) 字节,那么两者都会很长
猜你喜欢
  • 1970-01-01
  • 2011-02-19
  • 2011-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多