2013-07-09 170 views
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字符。使用汇编代码

+0

欢迎堆栈溢出!请不要只是要求我们为您解决问题。我们展示如何_you_试图自行解决问题,然后告诉我们_exactly_什么结果,并告诉我们为什么你觉得它没有工作。请参阅“[您尝试过什么?](http://whathaveyoutried.com/)”,以获得一篇您最近需要阅读的优秀文章。 –

+0

@JohnSaunders对不起,我真的尝试了所有我可以。我只是汇编语言的新手。这就是为什么我无望寻求帮助。 – user2562953

+0

尝试通过指令在调试器指令中逐步完成它。汇编语言很好,因为所有东西都在你的眼前。 –

回答

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之后,您需要一个无条件的jmp否则它会一直添加。

更改您的sub ax, 32sub al, 48后你的第一个2个int 21电话拿到号码,你上次int 21调用来获取操作后,你不需要加减自进入运营商已经是正确的。解决这些问题,它会工作。

*编辑* 这将只对结果小于10(1位结果),任何结果10个或更多(2位)将不会与当前的代码打交道的工作,你需要将结果转换为ASCII以不同的方式。