似乎应该有一个标准化的解决方案。基本上,问题是,我想要能够计算,我是应该使用近跳还是远跳。如:
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>近跳操作码似乎是两个字节,而远跳操作码似乎是五个字节。问题是,如果跳转标签是在(实际操作码)之后出现的,我如何知道使用哪一个呢?是否有一个标准化的算法来计算像这样的严格依赖关系的东西,特别是在这种情况下,可能会有很多跳转,其中一个操作码大小的改变可能会影响其他跳转。
发布于 2014-06-19 17:21:57
我并不是说这是唯一的解决方案,但对于我编写的特定领域语言的几个编译器,我成功地使用了以下策略:
对于所有的前向跳跃,最初假设可以通过短距离跳跃达到目标。
稍后,在背部修补过程中,如果目标最终无法通过短距离跳转,则将该跳跃标记为需要近距离跳转,并为所述例程重新启动代码。
-
也可以(是的,我实际上已经这样做了)发出所有的近跳(长形式),然后记录任何需要在块中修复的信息,以防您稍后发现您可以并希望将特定的跳转从最近的形式转换为简短的形式。
-
第一种策略的实施通常要简单得多。
https://stackoverflow.com/questions/24312439
复制相似问题