我试图制作一个代码,当你在最后时,它会问你是否想再试一次。如果按“' y”,则会在程序开头直接跳回1000行。
很明显,它没有成功,因为我得到错误"跳出相对超出范围"。所以我每50次跳跃,共有20次跳跃,比如start:
.
s20: jmp start
.
.
.
s2: jmp s3
.
s1: jmp s2
.
jmp s1
现在这样做之后,我运行了程序,当我按下'时,TASM就冻结了。它只显示最后一个屏幕,其中包含' y'输入,闪烁_。我不能再按一个角色了。
答案 0 :(得分:6)
在x86中,您不需要级联跳转序列,因为jmp
可以跳过整个段。像jne
这样的条件跳转范围有限。因此,您可以将错误的条件跳转更改为无条件近似跳转和条件短跳转的组合:
举个例子,改变
.MODEL small
.STACK 1000h
.CODE
main:
top:
mov ax, 1
jmp bottom
ORG 1000h ; A big block between top and bottom
bottom:
cmp ax, 0
je top ; **Error** Relative jump out of range by 0F85h bytes
mov ax, 4C00h ; Return 0
int 21h
END main
到
.MODEL small
.STACK 1000h
.CODE
main:
top:
mov ax, 1
jmp bottom
ORG 1000h ; A big block between top and bottom
bottom:
cmp ax, 0
jne skip ; Short conditional jump
jmp top ; Near unconditional jump
skip:
mov ax, 4C00h ; Return 0
int 21h
END main
TASM可以为您自动完成。放置一个" JUMPS"在文件的开头(或你需要的地方):
JUMPS
.MODEL small
.STACK 1000h
.CODE
main:
top:
mov ax, 1
jmp bottom
ORG 1000h ; A big block between top and bottom
bottom:
cmp ax, 0
je top ; TASM will change this line to a JNE-JMP combination
mov ax, 4C00h ; Return 0
int 21h
END main
80386指令集(ISA)具有近条件跳转的指令。如果您的模拟器支持80386 ISA(DOSBox),您可以告诉TASM使用它。插入.386
指令:
.MODEL small
.386 ; Use 80386 instruction set
.STACK 1000h
.CODE
main:
top:
mov ax, 1
jmp bottom
ORG 1000h ; A huge block between top and bottom
bottom:
cmp ax, 0
je top ; Correct jump because of '.386'
mov ax, 4C00h ; Return 0
int 21h
END main