2015-10-14 51 views
-2

我認爲錯誤是在循環或某處期待指針類型

.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

'loop'可能期望一個標籤,而不是一個數字。另外,你不能期望寄存器在調用'int 21h'的時候保持它們的值。返回時,他們很可能會有全新的價值。 –

+0

我不知道。你是否可以在你的問題中增加更多的信息,以便我們更清楚地知道你在問什麼?我自己的代碼片段,尤其是彙編中的代碼片段不夠好。另外,你沒有提到你正在嘗試做什麼。 –

+0

嘿@BoPersson - 你是心靈上能夠調試,只是:) –

回答

1

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!