0
TITLE
;--------------------------------------------------------------

.MODEL SMALL
.STACK 64
.DATA

    MSGA    DB 13, 10, "Input expression: ","$$$"               ;asks the user input expression ie. 5+2
    MSGADD  DB 13, 10, "The sum is: ","$"                       
    MSGSUB  DB 13, 10, "The difference is :","$"
    MSGMUL  DB 13, 10, "The product is: " ,"$"
    MSGDIV  DB 13, 10, "The quotient is: ","$" 


    NUM1 db ?
    NUM2 db ?
    OP db ?

    .CODE


    MAIN PROC NEAR


        MOV AX,@DATA 
        MOV DS,AX

        LEA DX,MSGA   
        MOV AH,09H      ;reads the user input
        INT 21H

        MOV AH,01H      ; scan NUM1
        INT 21H         ;interruption
        SUB AH,32
        MOV NUM1,AH


        MOV AH,01H      ; also reads from the keyboard
        INT 21H         ; scan NUM2
        SUB AH,32
        MOV NUM2,AH

        ;MOV NUM2,AL

        MOV AH,01H      ; also reads from the keyboard
        INT 21H         ; scan OP
        SUB AH,32
        MOV OP,AH




        CMP AX,'+'
        je @ADD

        CMP AX,'-'
        ;je @SUB

        CMP AX,'*'
        ;je @MUL

        CMP AX,'/'
        ;je @DIV

            @ADD:

                ADD AH,NUM1 ;add first number
                ADD AH,NUM2
                MOV NUM1,AH
                ADD NUM1,32

                LEA DX,MSGADD
                MOV AH,09h
                INT 21h

                MOV DL,NUM1
                MOV AH,02h
                INT 21h

            @DIV:
            XOR AX,AX ;EXAMPLE ON THE BOARD
            MOV AX,83H
            MOV BL,2H
            DIV BL

        MOV AH,4CH    ;for exiting purpose
        INT 21H

    @endif:

MAIN ENDP
;---------------------------------------------------------------
END MAIN

为什么我的代码不起作用?结果它没有给出数字,而是通常给出一个 pi 字符。

4

1 回答 1

1

您绝对没有错误检查,如果我输入“a”会发生什么?第二,你为什么用ax?输入的字符在 中返回alax可能包含垃圾。第三,为什么要减去 32?您应该从输入的字符中减去 48 以获得输入的 ASCII 数字的十进制版本。

这是错误的:

ADD AH,NUM1 ;add first number
ADD AH,NUM2

应该:

mov AH,NUM1 ;add first number
ADD AH,NUM2

否则,您会将您添加到上次通话NUM1中返回的任何内容中。int 21

在你cmp的 s 之后,你需要一个无条件的,jmp否则它总是会添加。

在您的前 2 次呼叫以获取号码后将您更改sub ax, 32为,在您最后一次呼叫以获取运营商之后,您无需减去任何内容,因为输入的运营商已经正确。解决这些问题,它将起作用。sub al, 48int 21int 21

* 编辑 * 这仅适用于小于 10 的结果(1 位结果),任何 10 或更多(2 位)的结果都不适用于当前代码,您需要以不同的方式将结果转换为 ASCII。

于 2013-07-09T04:34:13.450 回答