【问题标题】:Converting an array of hexadecimal to decimal numbers Intel 8086 Assembly Language将十六进制数组转换为十进制数 Intel 8086 汇编语言
【发布时间】:2017-02-12 11:38:35
【问题描述】:

以下是我的代码。 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

【问题讨论】:

    标签: intel x86-16 microprocessors emu8086


    【解决方案1】:
    MOV AX,NUM[DI]
    LEA SI,RES[DI]
    LEA DX,RES[DI]
    

    您将DI 视为数组索引,就像我们在任何高级语言中使用的一样。在汇编编程中,我们只在数组中使用 displacements 又名 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
    

    【讨论】:

    • 我按照您的建议将 INC DI 替换为 ADD 并更改了 RES 以便它始终像缓冲区一样运行。它仍然给出了错误的答案。
    • 您是否为每个输出使用 $ 字符终止了字符串?
    • 你确定你的汇编程序不需要你写 MOV AX, @DATA MOV DS,AX 吗?所以添加 @.
    • 谢谢。 HEX2DEC 的更新确实帮助它工作。仍然必须弄清楚为什么。猜猜这需要一些时间? 1个疑问。 'TEST AX, AX' 在函数中的作用是什么?
    • test ax, ax 指令在功能上与cmp ax, 0 相同。你可以写:CMP AX, 0JNE LOOP1 用于循环,只要ax 不为零。 (就像在你原来的问题中一样,只要 ax 大于 9 就循环)
    猜你喜欢
    • 2014-03-24
    • 2019-05-16
    • 2012-04-02
    • 2012-06-02
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    • 1970-01-01
    相关资源
    最近更新 更多