2013-07-09 90 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以不同的方式。