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

コードが機能しないのはなぜですか? 結果として数値が得られるわけではなく、通常は円周率の文字が得られます。

4

1 に答える 1

1

「a」を入力するとどうなりますか? 第二に、なぜあなたは使用していaxますか?入力した文字は で返されますがalaxゴミが含まれている可能性があります。第三に、なぜ 32 を引いているのですか? 入力した文字から 48 を引いて、入力した ASCII 番号の 10 進数バージョンを取得する必要があります。

これは間違っています:

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

次のようにする必要があります。

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

NUM1それ以外の場合は、最後のint 21呼び出しで返されたものにあなたを追加しています。

の後にcmp無条件が必要ですjmp。そうしないと、常に追加されます。

番号sub ax, 32を取得するためのsub al, 48最初の 2 回int 21の通話の後、オペレーターを取得するための最後のint 21通話の後は、入力したオペレーターが既に正しいため、何も減算する必要はありません。これらの問題を修正すると、機能します。

* 編集 * これは 10 未満の結果 (1 桁の結果) でのみ機能し、10 以上 (2 桁の結果) の結果は現在のコードでは機能しません。別の方法で結果を ASCII に変換する必要があります。

于 2013-07-09T04:34:13.450 に答える