2016-12-09 35 views
0

我學習彙編語言的一本書定義了下面的例子,將#符號改爲$符號。但是,當我在emu8086中嘗試這個時,它不起作用。這篇文章是否正確?

當我點擊效仿這一代碼它顯示我像(18)錯誤的參數LEA [二]錯誤,笛子

問題是什麼?

.MODEL SMALL 
    .STACK 64 

    .DATA 
    DIZI DB 'LDA#305A' 

    .CODE 
    ANA PROC FAR 
     MOV AX, @DATA 
     MOV DS, AX 
     CLD 
     MOV AL, '#' 
     MOV BH, '$' 
     MOV CX, 9 
     LEA DS:DI, DIZI 
     REPNE SCASB 
     JNE CIK 
     MOV BYTE PTR[DI-1], BH 

    CIK: MOV AH, 4CH 
     INT 21H   

    ANA ENDP 
     END ANA 
+1

請擴大「它不工作」。 –

+0

刪除「DS:」,只留下DI。 –

+0

@Jose Manuel AbarcaRodríguez它仍然以這種方式在字符串中顯示#符號。 – NoWeDoR

回答

1

盲目嘗試修復代碼emu8086:

.MODEL SMALL 
    .STACK 64 

    .DATA 
    DIZI DB 'LDA#305A' 

    .CODE 
    ANA PROC FAR 
     MOV AX, @DATA 
     MOV ES, AX ; es for SCASB 
     CLD 
     MOV AL, '#' 
     MOV BH, '$' 
     MOV CX, 9 
     LEA DI, [DIZI] 
     REPNE SCASB   ; should now work over correct ES:DI memory. 
     JNE CIK 
     MOV [ES:DI-1], BH ; try ES:[DI-1] in case of syntax err. 
     ; ^^ needs now "ES:" prefix, because I don't set "DS" 

    CIK: MOV AH, 4CH 
     INT 21H   

    ANA ENDP 
     END ANA 

另一種選擇是同時設置dses,像這樣:

ANA PROC FAR 
     MOV AX, @DATA 
     MOV DS, AX ; ds for default memory access 
     MOV ES, AX ; es for SCASB 
... 
... then modifying the char can be done without "ES:" prefix, using default "DS:" 
     JNE CIK 
     MOV [DI-1], BH 
... 

而且閱讀很重要您使用的指示的詳細說明。例如,SCASB非常特殊,它固定爲ES:DI內存指針,並且不能被任何段前綴覆蓋(與80%其他指令相反,其可以從默認DS/SS加到其他任何指令的前綴)。

的「弦」按照壓家庭(其中SCASB所屬)是特別棘手,因爲源指針DS:SI可以被覆蓋,即:

MOVSB ; moves single byte from [DS:SI] to [ES:DI], ++SI, ++DI 

    SS:MOVSB ; moves single byte [SS:SI] to [ES:DI], ++SI, ++DI 

通常以驗證對你的假設的任何指令的最簡單方法是要進入谷歌「x86 <name_of_instruction>」,並尋找一些域名,你會認識到隨着時間的推移將原始的英特爾文檔轉換成HTML。像這樣的例子:http://x86.renejeschke.de/

+0

我沒注意你的評論。它必須有ES:[DI-1]。謝謝! – NoWeDoR

+0

@NoWeDoR我現在習慣了NASM語法,其中段前綴放在'[]'裏面。一旦你對於指令可以做什麼以及它們*可能會看起來怎麼樣更加舒服,你就會開始忽略這些微小的語法差異,並且當有人會建議你時,你將能夠正確地修復它們。其他彙編語法的意外。 (所生成的機器代碼當然是同一個,所以如果您將通過調試器進行反彙編,您將得到一種更加不同的語法,這次是反彙編使用的語法) – Ped7g

+0

「...將[DS:SI ]到[ES:DI],++ SI,++ DI ...「通常這些符號表示* pre-increment *,但所有字符串基元只允許*後遞增*和*後遞減* –