2014-11-04 65 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