2016-02-29 147 views
0

我的問題是關於在彙編8086語言打印數組。 我使用'emu8086'程序。打印陣列 - 得到奇怪的輸出(emu8086)

下面這段看似正常,我(我是初學者),但結果我得到的是: * P000,而不是12345

Main: 

A DB 1,2,3,4,5 //my array 

SUB SI, SI //SI stands for counter and index here 
LEA BX, A 

loop3: 
MOV DX, [BX + SI] 

ADD DX, 30h //converting digit into character 
MOV Ah, 2h 
int 21h //displaying the character in console window 

INC SI 
CMP SI, 5 
JNE loop3    

end Main 

你能不能,請解釋一下什麼是錯的與我的功能? 提前謝謝!

回答

0

您需要驗證DS寄存器是否加載了適當的值,否則您的內存讀取將來自錯誤的段。

+0

嗨。我已經應用了您所建議的更改,但沒有任何更改。它又是一樣的輸出。 –

1

該問題中的程序不完整。有兩條重要線缺失:

MOV AX, @DATA 
    MOV DS, AX 

Here我找到了這些的目的。


下面列出了讓我改變程序的東西。

  1. 我發現一個good assembly program on this topic,基於此,我可以逐步分析每行代碼,並理解其含義。我認爲這個程序解釋了一切。

有一些事情我發現:


所以我的計劃現在看起來是這樣的:

.MODEL SMALL 
    .STACK 100H 

    .DATA 
    A DW 1, 2, 3, 4 ; it's my array 

    .CODE 

    MAIN PROC 

     MOV AX, @DATA 
     MOV DS, AX 


     LEA SI, A ;set SI as offset address of A (of my array) 
     MOV BX, 4 ;store the number of digits in BX register 
     MOV CX, BX ;CX is used as a loop counter 

     LOOP1: 

      MOV DX, [SI] ; Line 1 
      ADD DX, 30h ;convert digit to char and store in DX 

      ;Print character stored in DX 
      MOV AH, 2h 
      INT 21h 

      ;Store in DX the ASCII code for 'space' character 
      MOV DX, 20h 
      ;Print ' ' = space 
      INT 21h 


      ADD SI, 2 ;SI = SI + 2 

     LOOP LOOP1 ; jump to label 'LOOP1' while CX != 0 

    MAIN ENDP 
  • 線的意義1我發現here
  • Here我發現了用於打印字符的所有說明以及所有解釋。
  • ASCII Table很有幫助。
  • 關於LOOP指令。
+2

你學到了很多東西,但是你忽略了DOS顯示函數__only在DL寄存器而不是DX寄存器___上運行的事實。 – Fifoernik

+2

爲什麼你的小程序甚至懶得使用BX寄存器? – Fifoernik

+0

@Fifoernik謝謝你的評論。我想我應該更多地瞭解組裝。 –

0
.MODEL SMALL 
.DATA 

    ARRAY DW 1,2,3,4,5 
.CODE 
.STARTUP 

    MOV CX,5  

MOV SI,OFFSET ARRAY 

LOP: 
    MOV DX,[SI] 
    ADD DX,30H 

    MOV AH,2H 
    INT 21H 

    INC SI 
    INC SI 

LOOP LOP 
.EXIT 
END 

試試這個