使用移动目标计算偏移的最佳方法

时间:2014-06-19 17:08:10

标签: algorithm assembly

似乎应该有一个标准化的解决方案。基本上问题是我想能够计算我是否应该使用近跳或远跳。如:

jump_to_near:
  ; ... lots of ops ...

jump_to_near:
    e9 24 ff ff ff          jmpq   1f22 <jump_to_far>
    eb f9                   jmp    1ff9 <jump_to_near>

近跳操作码似乎是两个字节,而远跳操作码是五个。问题是,如果跳转标签在实际操作码之后 ,我怎么知道使用哪一个?有没有一个标准化的算法来计算具有严格依赖性的东西,特别是考虑到这种情况可能会有很多跳转,其中改变一个的操作码大小可能会影响其他跳跃。

1 个答案:

答案 0 :(得分:1)

我不是说这是唯一的解决方案,但对于我编写的几种针对特定领域语言的编译器,我已成功使用以下策略:

对于所有前向跳跃,最初假设可以通过短跳跃到达目标。

稍后,在反向修补期间,如果目标在使用短跳后终于无法到达,请将该跳转标记为需要近似跳转并为相关例程启动代码生成。

-

也可以(是的,我实际上已经这样做)发出所有近似跳跃(长形式),然后记录需要在块中修复的任何信息,以防您以后发现可以并且想要将特定跳转从近似转换为短形式。

-

第一种策略通常更容易实施。