我写这段代码打印一个十进制的整数作为用户输入,但我不明白哪一步是错的?

时间:2017-04-03 18:46:20

标签: assembly x86-16 dos

.MODEL SMALL
.STACK 100H
.DATA
    MSG1 DB " Enter first number  : ",0Ah,0Dh,'$'
    MSG2 DB " The number is: ",0ah,0dh,'$'
.CODE
   MAIN PROC
        MOV AX,@DATA
        MOV DS,AX
        LEA DX,MSG1
        MOV AH,09H
        INT 21H

    L1:  
        MOV AH,01H
        INT 21H
        XOR AH,AH
        CMP AL,13
        JE L2
        MOV DX,0H
        MOV DX,AX
        ADD DX,30H
        PUSH DX
        JMP L1

    L2:
        LEA DX,MSG2
        MOV AH,09H
        INT 21H

    L3: POP DX
        MOV AH,02H
        INT 21H
    LOOP L3

        MOV AH,4CH
        INT 21H
        END MAIN
    MAIN ENDP

1 个答案:

答案 0 :(得分:1)

进气部分有许多多余的指示,无法计算你所做的PUSH的数量。

L1:  
    MOV AH,01H
    INT 21H
    XOR AH,AH         <<< Superfluous
    CMP AL,13
    JE L2
    MOV DX,0H         <<< Superfluous
    MOV DX,AX         <<< Superfluous
    ADD DX,30H        <<< Superfluous
    PUSH DX
    JMP L1

这是一个更好的版本:

    XOR CX,CX      <<< This you need
L1:  
    MOV AH,01H
    INT 21H        <<< gives AL
    CMP AL,13
    JE L2
    PUSH AX        <<< AL is already a character! No need to add 30H.
    INC CX         <<< This you need
    JMP L1

要使用LOOP指令,您需要事先设置CX寄存器(参见上文)。如果没有输入数字,CX将为零,所以你必须测试它:

    JCXZ L4
L3:
    POP DX         <<< DL is a character
    MOV AH,02H
    INT 21H
    LOOP L3
L4:
    MOV AH,4CH
    INT 21H

正如@ Tommylee2k已经说过的那样,输出将是相反的。这可能不是你的意图。然而,要做到这一点,使用堆栈不是最佳解决方案。最好使用简单的内存缓冲区。