Loop 0107
显然应该是一个绝对跳转只是为了偏移,但loop
只能执行相对跃过-128的距离 - +127个字节。这个指令在这个地方的机器码是E2 EE
,这意味着:“从这里跳回16个字节”(更准确地说:“从下一条指令跳回18个字节”)。你可以这个程序:loop $-16
。 $
代表“here”,所以是“这里减去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
不要忘了参数/t
的TLINK.EXE!
'loop'可能期望一个标签,而不是一个数字。另外,你不能期望寄存器在调用'int 21h'的时候保持它们的值。返回时,他们很可能会有全新的价值。 –
我不知道。你是否可以在你的问题中增加更多的信息,以便我们更清楚地知道你在问什么?我自己的代码片段,尤其是汇编中的代码片段不够好。另外,你没有提到你正在尝试做什么。 –
嘿@BoPersson - 你是心灵上能够调试,只是:) –