如果你有一个向前跳跃的指令,有没有办法计算一个偏移地址,或者你只计算第二次传递的绝对跳跃?
像这样:
Jump to Label
Move 0 to 64bit Register 1
Label:
Move 0 to 64bit Register 2
编译器是否只在这些情况下使用绝对跳转?我的意思是可以在这样一个简单的情况下计算偏移量,但是随着标签越来越多,它会变得越来越昂贵,更不用说相互嵌套的跳跃和标签......
答案 0 :(得分:2)
这是一个很好的问题,但并不难解决。解决方案不是使用绝对跳跃 - 甚至不能解决任何问题。您必须知道目标的地址,如果您知道您可能也知道当前地址,那么您可以进行相对跳转。这是一个死胡同。
一个简单的解决方案是在代码上进行两次传递(或#34;一次半"),在第一次传递中,您收集所有地址(您无法发出代码,因为在这一点你还不知道有关前向引用的任何信息),在第二遍中你使用这些信息发出带分支和所有内容的所有代码。 "一个半" pass发出分支的代码和占位符,然后返回填写分支的偏移量。这样可以避免再次解析。
但是有一个问题,第一遍不能决定它是使用短跳还是普通跳,所以它实际上不能知道代码大小。但它可能需要猜测,然后您可以通过用更宽的分支替换该分支来迭代地修复引用其范围之外的标签的每个分支。你也可以反过来,从完全跳跃开始,然后尝试用更短的替换它们。