2017-02-12 247 views
3

以下是我的代碼。 hex2dec中的塊可成功將單個十六進制數轉換爲十進制數。如果有人能夠指出我在使用陣列時出錯的地方,那將會非常有幫助。謝謝。將十六進制數組轉換爲十進制數Intel 8086彙編語言

DATA SEGMENT 
    NUM DW 1234H,9H,15H 
    RES DB 3*10 DUP ('$','$','$') 
    SIZE DB 3 
DATA ENDS 

CODE SEGMENT 
    ASSUME DS:DATA, CS:CODE 
START: 
    MOV AX, DATA 
    MOV DS,AX 
    MOV DI,0 
    LOOP3: 
    MOV AX,NUM[DI] 
    LEA SI,RES[DI] 
    CALL HEX2DEC 
    LEA DX,RES[DI] 
    MOV AH,9 
    INT 21H 
    INC DI 
    CMP DI,3 
    JL LOOP3 
    MOV AH,4CH ; end program 
    INT 21H 
CODE ENDS 

HEX2DEC PROC NEAR 
    MOV CX,0 
    MOV BX,10 
    LOOP1: 
    MOV DX,0 
    DIV BX 
    ADD DL,30H 
    PUSH DX 
    INC CX 
    CMP AX,9 
    JG LOOP1 
    ADD AL,30H 
    MOV [SI],AL 
    LOOP2: 
    POP AX 
    INC SI 
    MOV [SI],AL 
    LOOP LOOP2 
    RET 
HEX2DEC ENDP 
END START 

回答

2
MOV AX,NUM[DI] 
LEA SI,RES[DI] 
LEA DX,RES[DI] 

你是治療DI作爲數組索引就像我們在任何的高級語言使用。在彙編編程中,我們只使用位移又名偏移在數組中。

在你的程序中,由於NUM陣列組成的話,你需要先後給DI寄存器中的值0,2和4

ADD DI, 2 
CMP DI, 6 
JB LOOP3 

而且這將是最好不要將RES視爲一個數組。只要考慮它是一個緩衝區,並從一開始就使用它。

RES DB 10 DUP (0) 
... 
LEA SI, RES 
CALL HEX2DEC 
LEA DX, RES 

一個更好的版本HEX2DEC的避免了難看的前綴「0」的單個數字:

HEX2DEC PROC NEAR 
    XOR CX, CX  <--- Same as MOV CX,0 
    MOV BX,10 
LOOP1: 
    XOR DX, DX  <--- Same as MOV DX,0 
    DIV BX 
    ADD DL, 30H 
    PUSH DX 
    INC CX 
    TEST AX, AX 
    JNZ LOOP1 
LOOP2: 
    POP AX 
    MOV [SI], AL 
    INC SI 
    LOOP LOOP2 
    MOV AL, "$"  <--- Add this to use DOS function 09h 
    MOV [SI], AL 
    RET 
HEX2DEC ENDP 
+0

我更換了INC DI與地址由你的建議也改變RES,使其始終像緩衝區一樣運行。它仍然給出了錯誤的答案。 – Anurag

+0

您是否以每個輸出的** $ **字符結束字符串? –

+0

你確定你的彙編器不需要你寫'MOV AX,@ DATA''MOV DS,AX'嗎?所以加入** @ **。 –

相關問題