如何缩短代码解决汇编Relative jump out of range相对跳转超限问题
解决汇编相对跳转超出范围问题
问题原因
x86汇编里,jz这类条件跳转指令默认是短跳转,只能在当前指令前后-128~+127字节的范围内跳转。你的jz restart指令要跳转到的restart标签,和该指令的相对距离已经超过了这个限制,所以触发报错。
至于修改代码后超出范围反而变大:你简化的那段代码(把mov di, offset xxx + push di改成直接push offset xxx)缩短了restart到jz restart之间的代码长度,导致jz restart的内存地址更往restart标签的反方向偏移,两者的相对距离变得更远,超出范围的字节数自然也就更大。
解决方法
x86没有直接的条件近跳转指令,你可以用“反向判断+无条件近跳转”的方式绕开短跳转的范围限制:
cmp [dir], 'r' jnz skip_restart ; 若不是'r',跳过跳转逻辑 jmp restart ; 无条件近跳转,不受短跳转范围限制 skip_restart:
如果你的汇编器(比如MASM)支持扩展语法,也可以直接指定近跳转:
cmp [dir], 'r' jz near ptr restart
另外,要是能调整代码布局,把restart标签移到jz restart指令的127字节范围内,也能解决问题,但这种方法灵活性较差,不如上面的方法通用。
内容的提问来源于stack exchange,提问作者yarden
相关产品推荐
相关产品推荐

