问题
I get the message "(76)Relative jump out of range by 000Eh bytes" and (79)Relative jump out of range by 0007h bytes" whenever I input CMP octal, '3'. I'm supposed to do up until the 7th octal number but it always gives me an error when I try to do the 3rd octal number. I can only do 0,1, and 2 until it gives me an error. I don't know what I'm supposed to do. I've tried everything that I can as far as I've been taught but I still can't get any results. Please help me. I'm new to assembly. P.S. I'm using DOSBox 0.74
.Model small
.data
txt1 db "Octal to Binary Converter$"
txt2 db "Enter an Octal Symbol: $"
title0 db "000$"
title1 db "001$"
title2 db "010$"
title3 db "011$"
title4 db "100$"
title5 db "101$"
title6 db "110$"
title7 db "111$"
mess db "Press ESC to exit...$"
invalid db "Input is invalid. Try again.$"
keypress db ?
octal db ?
.code
Start:
Mov AX, @data
Mov ds, ax
sys_st:
Mov AH, 6
Mov AL, 0
Mov BH, 15
Mov ch, 0
Mov cl, 0
Mov DH, 100
Mov DL , 100
Int 10H
Mov AH, 2
Mov BH, 0
Mov DL, 5
Mov DH, 5
Int 10H
Mov AH, 9
Lea DX, txt1
Int 21H
JMP sys_st2
sys_st2:
Mov AH, 2
Mov BH, 0
Mov DL, 5
Mov DH, 8
Int 10H
Mov AH, 9
Lea DX, txt2
Int 21H
Mov AH, 1
Int 21H
Mov octal, AL
CMP octal, '0'
JE sys_0
CMP octal, '1'
JE sys_1
CMP octal, '2'
JE sys_2
CMP octal, '3'
JE sys_3
CMP octal, '0'
JNE sys_invalid
CMP octal, '1'
JNE sys_invalid
CMP octal, '2'
JNE sys_invalid
CMP octal, '3'
JNE sys_invalid
sys_0:
Mov AH, 2
Mov BH, 0
Mov DL, 11
Mov DH, 11
Int 10H
Mov AH, 9
Lea DX, title0
Int 21H
Mov AH, 2
Mov BH, 0
Mov DL, 5
Mov DH, 15
Int 10H
JMP sys_exit
sys_1:
Mov AH, 2
Mov BH, 0
Mov DL, 11
Mov DH, 11
Int 10H
Mov AH, 9
Lea DX, title1
Int 21H
Mov AH, 2
Mov BH, 0
Mov DL, 5
Mov DH, 15
Int 10H
JMP sys_exit
sys_2:
Mov AH, 2
Mov BH, 0
Mov DL, 11
Mov DH, 11
Int 10H
Mov AH, 9
Lea DX, title2
Int 21H
Mov AH, 2
Mov BH, 0
Mov DL, 5
Mov DH, 15
Int 10H
JMP sys_exit
sys_3:
Mov AH, 2
Mov BH, 0
Mov DL, 11
Mov DH, 11
Int 10H
Mov AH, 9
Lea DX, title3
Int 21H
Mov AH, 2
Mov BH, 0
Mov DL, 5
Mov DH, 15
Int 10H
JMP sys_exit
sys_invalid:
Mov AH, 2
Mov BH, 0
Mov DL, 5
Mov DH, 11
Int 10H
Mov AH, 9
Lea DX, invalid
Int 21H
Mov AH, 1
Int 21H
JMP sys_st
sys_exit:
Mov AH, 2
Mov BH, 0
Mov DL, 5
Mov DH, 14
Int 10H
Mov AH, 9
Lea DX, mess
Int 21H
Mov AH, 1
Int 21H
Mov keypress, AL
CMP keypress, 27
JNE sys_exit
JMP exit
Exit:
Mov AH, 4ch
Int 21H
End Start
回答1:
Add a .386 directive to your file to be able to use relative jump instructions with larger offsets introduced with the 80386. Alternatively, find the offending jump and replace it with something like this:
jnz foo ; this jump is too long
replace with
jz bar ; opposite conditional
jmp foo ; unconditional jumps can have larger offsets
bar:
...
来源:https://stackoverflow.com/questions/39427980/relative-jump-out-of-range-by