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

标签 intel x86-16 microprocessors emu8086

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

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 视为我们在任何高级语言中使用的数组索引。在汇编编程中,我们只在数组中使用位移,也就是偏移量

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

关于intel - 将十六进制数组转换为十进制数英特尔 8086 汇编语言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42187107/

相关文章:

delphi - 为什么某些汇编指令没有记录在案

assembly - 在 TASM 理想模式下设置数据段的对齐方式

c - 我怎样才能导致指令缓存未命中?

python - 使用 PySerial/Matplotlib 的微处理器到 RS-232 实时绘图?

Clapper,在 C 中更改配置位

c++ - simd 指令中不接受索引

assembly - ARM 和 Intel 汇编指令映射

x86 - AVX2 中的 channel 内交叉 64 位元素数据移动

c - 使用 SGX 在 C 语言中编写 Hello world

assembly - 8086 塔斯马 : Illegal Indexing Mode