我认为错误是在循环或某处
.model small
Org 100h
.code
Mov cx, 0ah
Mov ah, 02h
Mov dl, 39h
Int 21h
Mov bl, dl
Mov dl, 0ah
Int 21h
Mov dl, 0dh
Int 21h
Mov dl, bl
Dec dl
Loop 0107
Int 20h
End
我这样做是对还是错?
答案 0 :(得分:1)
Loop 0107
显然应该只是一个偏移的绝对跳转,但是loop
只能在-128 - +127个字节的距离内执行相对跳转。这个地方的这个指令的机器代码是E2 EE
,意思是:"从这里跳回16个字节" (更确切地说:"从下一条指令跳回18个字节")。您可以对此进行编程:loop $-16
。 $
代表"此处",因此$-16
是"此处减去16个字节" ="从这里返回16个字节"。您必须考虑此指令必须保持在完全相同的位置,并且不能之前插入代码,否则来自此处的" 16字节"不会瞄准正确的地方。
更好的是定义标签并跳转到那里。 TASM计算距离并生成正确的loop
:
; The order of `.MODEL - .CODE - ORG - start` is relevant!
.MODEL tiny ; .model small was wrong
.CODE
ORG 100h
start: ; Start label
Mov cx, 0ah
Mov ah, 02h
Mov dl, 39h
my_107: ; Loop label
Int 21h
Mov bl, dl
Mov dl, 0ah
Int 21h
Mov dl, 0dh
Int 21h
Mov dl, bl
Dec dl
Loop my_107 ; Loop to label `my_107`
Int 20h
END start ; End of program with start label
请勿忘记TLINK.EXE的参数/t