假设汇编器自动使用短编码或普通编码。乍一看,如果可能,总是切换到短编码似乎没问题,但实际上有可能这样做,以便必须再次将某些其他分支更改为长编码。
例如(未经测试或其他任何东西,只是为了得到想法):
jmp _skip ; relative offset depends on
the size of "other code", which may include other jumps
; other code
_skip:
所以你不能做一个“前向”传球来确定尺寸 - 当你在那个跳跃时,你还不知道它是否适合,因为你还没有决定如何处理还有其他的跳跃。
那么倒退? (未经测试或其他任何东西,只是为了得到这个想法)
.fill 124
jmp _somewhere ; 2 bytes, or 5?
jmp _quiteFarAway ; relative offset is either 130 or 127
.align 256
_quiteFarAway:
不,也不能向后传递,在决定跳转到 _quiteFarAway 的编码时,您还不知道它是否适合,因为您还没有决定如何处理其他跳转。
做到你的第 2 点很难,有很多不同的方法可以解决这个问题。例如采用显式“短”修饰符、显式“长”修饰符、进行安全猜测并最终得到在极少数情况下不需要的长版本等。