DSEG SEGMENT
INPUT1 DB 0, 0, 0 ; 첫번째 입력
INPUT2 DB 0, 0, 0 ; 두번째 입력
YEONSANJA DB 0 ; 연산자
OUTPUT DB 0, 0, 0, 0 ; 출력
TEMP DB 0, 0, 0 ; 임시
DSEG ENDS
SSEG SEGMENT STACK
DW 100H DUP(?)
SSEG ENDS
CSEG SEGMENT 'CODE'
ASSUME CS:CSEG, DS:DSEG, SS:SSEG
START:
MOV AX, DSEG
MOV DS, AX ; 형식적 데이터segment 주소시정
MOV AH, 1
INT 21H
MOV BX, OFFSET YEONSANJA
MOV [BX], AL ; 연산자 입력받기
MOV AH, 1
INT 21H
MOV BX, OFFSET INPUT1
MOV [BX], AL;10의자리 넣고
MOV AH, 1
INT 21H
MOV [BX+1], AL ;1의자리 넣고
MOV AH,1
INT 21H
MOV BX, OFFSET INPUT2
MOV [BX], AL ;10의자리 넣고
MOV AH,1
INT 21H
MOV [BX+1], AL ;1의자리넣고
;여기부터 처음 인풋1의 16*1의자리 의처리
;--------------------------------------------------
MOV CL, 0FH ;16진수니까 곱하기 16해주려고 넣어줌
MOV BX, OFFSET INPUT1
MOV AL, [BX]
CMP AL, '9'
JA EXPHEX1
SUB AL, '0'
;우리가 넣은 수는 아스키코드로 저장되어서
;아스키코드표를 참조하여 0(48)을 빼줘서 원래수를 찾음
MUL CL ; 16의1승의 자리로 가기위해 16곱해줌
MOV DH, AL
RETURN1:MOV AL, [BX+1]
CMP AL, '9'
JA EXPHEX2
SUB AL, '0' ;16의 0승의 자리수는 빼주기만하고
ADD DH, AL ;넣어줌<완전한 수가 되었음>
;인풋2의 16*1의자리 의처리
;------------------------------------------------
RETURN2:
MOV CL, 0FH ;16진수니까 곱하기 16해주려고 넣어줌
MOV BX, OFFSET INPUT2
MOV AL, [BX]
CMP AL, '9'
JA EXPHEX3
SUB AL, '0'
;우리가 넣은 수는 아스키코드로 저장되어서
;아스키코드표를 참조하여 0(48)을 빼줘서 원래수를 찾음
MUL CL ; 16의1승의 자리로 가기위해 16곱해줌
MOV DH, AL
RETURN3:MOV AL, [BX+1]
CMP AL, '9'
JA EXPHEX4
SUB AL, '0' ;16의 0승의 자리수는 빼주기만하고
ADD DL, AL ;넣어줌<완전한 수가 되었음>
RETURN4:
;연산자를 구분하기
CMP YEONSANJA, '+'
JZ PLUS
CMP YEONSANJA, '-'
JZ MINUS
CMP YEONSANJA, '*'
JZ MULTI
CMP YEONSANJA, '/'
JZ DIVIDE
CMP YEONSANJA, '%'
JZ NAMOJI
;우리는 데이터를 DH, DL에 넣어두었고
;연산자는 주소<레이블>를 불러와서 비교를 해준다.
EXPHEX1:
SUB AL, '7' ; 10이상의 수는 아스키코드 7을 빼줌
MUL CL ; 16의1승의 자리로 가기위해 16곱해줌
MOV DH, AL
JMP RETURN1
EXPHEX2:
SUB AL, '7' ; 10이상의 수는 아스키코드 7을 빼줌
ADD DH, AL
JMP RETURN2
EXPHEX3:
SUB AL, '7' ; 10이상의 수는 아스키코드 7을 빼줌
MUL CL ; 16의1승의 자리로 가기위해 16곱해줌
MOV DL, AL
JMP RETURN3
EXPHEX4:
SUB AL, '7' ; 10이상의 수는 아스키코드 7을 빼줌
ADD DL, AL
JMP RETURN4
PLUS :
ADD DH, DL
MOV AH, 0
MOV AL, DH
JMP GOGO
MINUS:
SUB DH, DL
MOV AH, 0
MOV AL, DH
JMP GOGO
MULTI:
MOV AL, DH
MUL DL
JMP GOGO
DIVIDE:
MOV AL, DH
DIV DL
JMP GOGO
NAMOJI:
MOV AL, DH
DIV DL
MUL DL
SUB DH, AL
MOV AL, DH
JMP GOGO
GOGO:
MOV BX, OFFSET OUTPUT
MOV DX, 0H
MOV CX, 0AH
MOV [BX], DL
MOV DX, 0H
DIV CX
CMP AL,'9'
JA EXPGOGO1
ADD DL, '0'
MOV [BX], DL
RETURN5:
MOV DX, 0H
DIV CX
CMP AL,'9'
JA EXPGOGO2
ADD DL, '0'
MOV [BX+1], DL
JMP PRINT
EXPGOGO1:
ADD AL, '7'
MOV [BX], AL
JMP RETURN5
EXPGOGO2:
ADD AL, '7'
MOV [BX+1], AL
JMP PRINT
PRINT:
MOV BX, OFFSET OUTPUT
MOV DL, [BX+1]
MOV AH, 2
INT 21H
MOV DL, [BX]
MOV AH, 2
INT 21H
JMP EXIT
EXIT:
MOV DL, 0AH
MOV AH,2
INT 21H
MOV DL, 0DH
MOV AH,2
INT 21H
MOV AX, 4C00H
INT 21H
CSEG ENDS
END START
댓글 0