将十六进制数组转换为十进制数Intel 8086汇编语言

时间:2017-02-12 11:38:36

标签: intel x86-16 microprocessors emu8086

以下是我的代码。 hex2dec中的块可以成功地将单个十六进制数转换为十进制数。如果有人能指出我在使用数组时出错了,那将会非常有用。感谢。

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

1 个答案:

答案 0 :(得分: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