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字符。
发布于 2013-07-09 04:34:13
你绝对没有错误检查,如果我输入一个"a“会发生什么?第二,你为什么要使用ax
?输入的字符在al
中返回,ax
可能包含垃圾。第三,你为什么要减去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
之后,您需要一个无条件的jmp
,否则它总是会添加。
在前两次int 21
调用后将sub ax, 32
更改为sub al, 48
以获取数字,在最后一次int 21
调用以获取运算符之后,您不需要减去任何内容,因为输入的运算符已经正确。修复这些问题,它就会正常工作。
*编辑*这将仅适用于小于10的结果(1位数结果),任何10位或更多(2位数)的结果将不适用于当前代码,您需要以不同的方式将结果转换为ASCII码。
https://stackoverflow.com/questions/17539654
复制