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 - 你是心靈上能夠調試,只是:) –