将十六进制数组转换为十进制数英特尔 8086 汇编语言

Converting an array of hexadecimal to decimal numbers Intel 8086 Assembly Language

以下是我的代码。 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
MOV AX,NUM[DI]
LEA SI,RES[DI]
LEA DX,RES[DI]

您正在将 DI 视为我们在任何高级语言中使用的数组索引。在汇编编程中,我们只在数组中使用 displacements aka offsets

在你的程序中,由于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