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

, 그것은 내가 같은 시간에 일의 무리를 시도하고 있기 때문에, BTW 내 계산기 help.Any 주석보다 큰 10 덕분에 결과를 계산하지 않습니다 그냥 감사하겠습니다.

+0

_ "피연산자 유형이 일치하지 않음"_ mean? 프로그램에 어떤 정보를 입력 했습니까? 예상 결과는 무엇입니까? 실제 결과는 무엇입니까? – Michael

+0

글쎄, 오류가 발생하기 때문에 컴파일되지 않습니다. 내가 연구 한 것처럼, 그것은 약간의 차이점이지만 나는 그것을 고치는 방법을 알 수 없었다. 내 오류 123-125-126 줄에 추가로 있습니다 – Emre

+0

정확히 어떤 오류 메시지가 나타 납니까? – Michael

답변

0

Ups, 모든 linenumbers를 숫자로 표시하는 것은 어렵습니다.

코드를 데이터 세그먼트 내에 배치하는 것이 가장 좋은 방법은 아닙니다. 이 다음 명령은?

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