似乎应该有一个标准化的解决方案。基本上问题是我想能够计算我是否应该使用近跳或远跳。如:
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>
近跳操作码似乎是两个字节,而远跳操作码是五个。问题是,如果跳转标签在实际操作码之后 ,我怎么知道使用哪一个?有没有一个标准化的算法来计算具有严格依赖性的东西,特别是考虑到这种情况可能会有很多跳转,其中改变一个的操作码大小可能会影响其他跳跃。
答案 0 :(得分:1)
我不是说这是唯一的解决方案,但对于我编写的几种针对特定领域语言的编译器,我已成功使用以下策略:
对于所有前向跳跃,最初假设可以通过短跳跃到达目标。
稍后,在反向修补期间,如果目标在使用短跳后终于无法到达,请将该跳转标记为需要近似跳转并为相关例程启动代码生成。
-
也可以(是的,我实际上已经这样做)发出所有近似跳跃(长形式),然后记录需要在块中修复的任何信息,以防您以后发现可以并且想要将特定跳转从近似转换为短形式。
-
第一种策略通常更容易实施。