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



계산기 2자리정수에만 해당하는 계산기 만들엇는데
값도 안나오고 문제가 뭔지 모르겠어요. ㅠ

연산자, 2자리정수, 2자리 정수 로 입력하는거에요