1

如果你有一条向前跳转的指令,有没有办法计算偏移地址,或者你只是在第二次通过时计算绝对跳转?

像这样:

Jump to Label
Move 0 to 64bit Register 1
Label:
Move 0 to 64bit Register 2

在这种情况下,编译器是否只使用绝对跳转?我的意思是可以在这样的简单情况下计算偏移量,但是随着标签的增多,它的成本会成倍增加,更不用说相互嵌套的跳转和标签了......

4

1 回答 1

2

这是一个很好的问题,但并不难解决。解决方案是不使用绝对跳跃——这甚至不能解决任何问题。您必须知道目标的地址,如果您知道您可能还知道当前地址,那么您可以进行相对跳转。所以这是一个死胡同。

一个简单的解决方案是对代码进行两次传递(或“一次半”),在第一次传递中,您收集所有地址(您不能发出代码,因为此时您对转发一无所知参考),在第二遍中,您使用此信息发出所有带有分支的代码和所有内容。“一个半”传递发出分支的代码和占位符,然后返回填充分支的偏移量。这避免了再次解析。

但这有一个问题,第一遍无法决定是短跳转还是普通跳转,所以它实际上无法知道代码大小。但这可能需要猜测,然后您可以通过用更宽的分支替换该分支来迭代地修复每个引用超出其范围的标签的分支。你也可以反过来,从完整的跳跃开始,然后尝试用较短的跳跃来代替它们。

于 2015-04-14T15:29:25.760 回答