2014-11-04 67 views
-1

我想在TASM中做一個簡單的計算器,它還沒有完成,我試圖找出另外的部分,但我卡住,因爲操作數類型不匹配,這裏是我有什麼;TASM:生成一個簡單的計算器

;FILENAME: SimpleClc.asm 
;FILE FORMAT: EXE 
PAGE 55,132 
.386 

STACK_SEG SEGMENT STACK USE16 

     DB 100 DUP(?) 

STACK_SEG ENDS 

DATA_SEG SEGMENT 'DATA' USE16 

ADDITION MACRO Result,Char1,Char2 


     MOV AX,Char1 
     CWD 
     ADD AX,Char2, 
     MOV Result,AX 

ENDM 

SUBTRACTION MACRO Char1, Char2 

     SUB Char1,Char2 
ENDM 

DIVISION MACRO Char1, Char2 

     DIV Char1,Char2 
ENDM 

MULTIPLICATION MACRO Char1, Char2 

     MUL Char1,Char2 
ENDM 

Mainmsg DB 'Please enter a algebraic command line: $' 
ErMessage DB 'Error!!', 0DH, 0AH 
      DB 'INPUT FORMAT:Operand1 Operator Operand',0DH, 0AH 
      DB 'Operand: Decimal Numbers',0DH, 0AH 
      DB 'Operator: + -' 

INCHAR DB 21 
Res  DB 10 dup('$') 
INCDAT DB 21 dup('$') 
VarX DB 10 dup('$') 
VarY DB 10 dup('$') 



DATA_SEG ENDS 

CODE_SEG SEGMENT PARA 'CODE' PUBLIC USE16 

ASSUME CS:CODE_SEG, DS:DATA_SEG, SS:STACK_SEG 

MAIN PROC FAR 

     PUSH DS ;INITIATE THE PROGRAM 
     XOR AX,AX 
     PUSH AX 
     MOV AX,DATA_SEG 
     MOV DS,AX 

    AGAIN: 

     LEA DX,Mainmsg ;PRINT MESSAGE 
     MOV AH,9 
     INT 21H 

     MOV DX, OFFSET INCHAR 
     MOV AH,0AH 
     INT 21H 

     MOV DX, OFFSET INCHAR 
     MOV AH,0AH 
     INT 21H 

     LEA DX,INCDAT ;Writing the incoming input 
     MOV AH,9 
     INT 21H 

     MOV DI,OFFSET INCDAT 



     MOV AL, [DI] 
     CMP AL, 9 
     JLE OPERAND  ; jump if less or equal 
     JG ERRORMESSAGE ; jump if not less or equal 
     INC DI 

     OPERAND: 
     MOV AL, [DI] 
     CMP AL, '+' 
     JE LASTOPERAND 
     CMP AL, '-' 
     JE LASTOPERAND 
     CMP AL, '*' 
     JE LASTOPERAND 
     CMP AL, '/' 
     JE LASTOPERAND 
     JMP ERRORMESSAGE 

     INC DI 

     LASTOPERAND: 
     MOV AL, [DI] 
     CMP AL, 9 
     JLE OPERATION ; jump if less or equal 
     JG ERRORMESSAGE ; jump if not less or equal 

     OPERATION: 

     CMP AL, '+' 
     JE ADDITION1 
     JMP AGAIN 
ADDITION1: 
      MOV DI,OFFSET INCDAT 
      MOV AL,[DI] 
      MOV VarX,AL 
      MOV AL,[DI+2] 
      MOV VarY,AL 
      ADDITION Res,VarX,VarY 
      JMP AGAIN 
     CMP AL, '-' 
     JE SUBTRACTION1 
     JMP AGAIN 
SUBTRACTION1: 

     CMP AL, '*' 
     JE MULTIPLICATION1 
     JMP AGAIN 
MULTIPLICATION1: 

      JMP AGAIN 

     CMP AL, '/' 
     JE DIVISION1 
     JMP AGAIN 
DIVISION1: 



     ERRORMESSAGE: 
     LEA DX,ErMessage ;PRINT MESSAGE 
     MOV AH,9 
     INT 21H 


MAIN ENDP 
CODE_SEG ENDS 
END MAIN 

我知道它看起來相當混亂,現在,它僅僅是因爲我在同一時間試圖一堆東西,順便說一句我的計算器將不計算結果大於10,感謝help.Any評論將不勝感激。

+0

_「操作數類型不匹配」_是什麼意思?你給你的程序輸入了什麼,你的預期結果是什麼,實際結果是什麼? – Michael 2014-11-04 08:53:17

+0

好吧,因爲我得到錯誤,它不會編譯。正如我所研究的,這是有點差異,但我無法弄清楚如何解決這個問題。我的錯誤是在123-125-126行,那是另外的1 – Emre 2014-11-04 08:55:38

+0

你得到的錯誤信息到底是什麼? – Michael 2014-11-04 08:56:08

回答

0

Ups,很難將所有的亞麻布數字數字化。

將代碼置於數據段中並不是最好的主意。

爲了什麼這樣下面的指令都不錯?:

PUSH DS ; pushing the old address of DS to the stack 
    XOR AX,AX 
    PUSH AX ; pushing a zero word to the stack 

,最後如何終止PROGRAMM?

我不確定,但也許會出現使用標籤名的錯誤,這些標籤名的啓動類似於彙編器助記符的名稱。

爲什麼使用輸入函數一個接一個地重寫相同的緩衝區?

MOV DX, OFFSET INCHAR 
    MOV AH,0AH 
    INT 21H 

    MOV DX, OFFSET INCHAR 
    MOV AH,0AH 
    INT 21H