2017-02-12 108 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'吗?所以加入** @ **。 –

相关问题