8086汇编代码出现Relative jump out of range错误求助
8086汇编车库门控制代码跳转范围错误解决方法
问题情况
编写的8086汇编车库门控制代码中,第160行出现Relative jump out of range by 0008h bytes错误,第164行出现偏移为0010h的同类型错误。尝试用jmp near、jmp far替换je指令后出现其他逻辑错误。
错误原因
8086架构里,je这类条件短跳转指令的跳转范围被限制在当前指令的±127字节内。当目标标签(比如closedoor)超出这个范围时,汇编器就会抛出跳转范围错误。直接用无条件的jmp near/far替换je会破坏原有的条件判断逻辑——je是根据标志位状态决定是否跳转,而jmp是强制跳转,不管条件是否满足,所以会引发新的逻辑错误。
解决方法
采用反向条件跳转+无条件长跳转的方案,既保留条件判断逻辑,又解决跳转范围问题:
- 把原有的
je 目标标签改成jne 临时标签(反向判断,短跳转到附近的临时标签) - 在
jne后添加无条件的jmp near ptr 目标标签(用near跳转跨过长距离) - 新增临时标签,继续执行原逻辑
具体修改示例
第160行附近代码修改
原代码:
cmp bl, 00000001b je closedoor
修改为:
cmp bl, 00000001b jne skip_closedoor1 jmp near ptr closedoor skip_closedoor1:
第164行附近代码修改
原代码:
cmp bl, 00010000b ; check for timeout (5 minutes) je closedoor
修改为:
cmp bl, 00010000b ; check for timeout (5 minutes) jne skip_closedoor2 jmp near ptr closedoor skip_closedoor2:
补充说明
因为代码使用.model tiny(单段模型),所以用jmp near ptr即可完成段内长跳转,不需要用far(far用于跨段跳转,会导致额外的段地址操作,引发错误)。
修改后的核心代码片段
entering: mov cl,0 in al, inadd_word mov bl, al and bl, 00000001b cmp bl, 00000001b jne skip_closedoor1 jmp near ptr closedoor skip_closedoor1: mov bl,al and bl, 00010000b cmp bl, 00010000b ; check for timeout (5 minutes) jne skip_closedoor2 jmp near ptr closedoor skip_closedoor2: mov bl, al and bl, 00000100b cmp bl, 00000100b ; check for car jne nc00 mov ah, 1 nc00: mov bl, al and bl, 00001000b cmp bl, 00001000b ; check for inner IR jne entering cmp ah, 1 jne nc01 inc count call lcd_update nc01: in al, inadd_word mov bl, al and bl, 00001000b cmp bl, 00001000b ; debounce je nc01 jmp garageopen
内容的提问来源于stack exchange,提问作者Sumedh
相关产品推荐
相关产品推荐

