다 하셨다면,, ㅈㅅ합니다만 어셈좀 알려주세용.


DSEG SEGMENT

INPUT1 DB 0, 0 ; 첫번째 입력

INPUT2 DB 0, 0 ; 두번째 입력

YEONSANJA DB ? ; 연산자

OUTPUT DB 0, 0, 0 ; 출력

TEMP DB 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 ; 입력2 10의자리수

MOV BX, OFFSET INPUT1

MOV [BX], AL

;--------------------

MOV AH, 1

INT 21H

MOV [BX+1], AL ;입력2 1의자리수

;---------------------------------------

MOV AH, 1

INT 21H; 입력3 10의자리수

MOV BX, OFFSET INPUT2

MOV [BX], AL

;--------------------

MOV AH, 1

INT 21H; 입력3 1의자리수

MOV [BX+1], AL



;--------------------------------------------------

;여기부터 처음 인풋1의 16*1의자리 의처리

;--------------------------------------------------

MOV CL, 0FH ;16진수니까 곱하기 16해주려고 넣어줌

MOV BX, OFFSET INPUT1

MOV AL, [BX] ;INPUT1의 10의자리를 불러옴

CMP AL, '10' ;혹시 10이상이니?

JAE EXPHEX1 ;10이상이면 점프, 아니면 계속 순차실행


SUB AL, '0' 

;우리가 넣은 수는 아스키코드로 저장되어서

;아스키코드표를 참조하여 0(48)을 빼줘서 원래수를 찾음

MUL CL ; 16의1승의 자리로 가기위해 16곱해줌

MOV DH, AL


RETURN1:MOV AL, [BX+1]

CMP AL, '10'

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, '10'

JAE EXPHEX3


SUB AL, '0' 

;우리가 넣은 수는 아스키코드로 저장되어서

;아스키코드표를 참조하여 0(48)을 빼줘서 원래수를 찾음

MUL CL ; 16의1승의 자리로 가기위해 16곱해줌

MOV DH, AL


RETURN3:MOV AL, [BX+1]

CMP AL, '10'

JAE EXPHEX4

SUB AL, '0' ;16의 0승의 자리수는 빼주기만하고

ADD DL, AL ;넣어줌<완전한 수가 되었음>

RETURN4:


;연산자를 구분하기


CMP YEONSANJA, '+'

JE PLUS


CMP YEONSANJA, '-'

JE MINUS


CMP YEONSANJA, '*'

JE MULTI


CMP YEONSANJA, '/'

JE DIVIDE


CMP YEONSANJA, '%'

JE 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 : 


MOV AL, DH

MOV DH, 0

MOV AH, 0

ADD AX, DX

JMP GOGO


MINUS:

MOV AL, DH

MOV DH, 0

MOV AH, 0

SUB AX, DX

JMP GOGO


MULTI:

MOV AL, DH

MOV DH, O

MOV AH, 0

MUL DX

JMP GOGO

DIVIDE:

MOV AX, DH

MOV DH, 0

DIV DX

JMP GOGO


NAMOJI:

MOV AL,DH

MOV DH, 0

MOV AH, 0

MOV EX, AX

DIV DX

MUL DX

SUB EX, AX

MOV AX, EX

JMP GOGO


GOGO:

MOV BX, OFFSET OUTPUT

MOV DX, 0H

MOV CX, 0FH

DIV CX

JMP PRINT

PRINT:

MOV BX, OFFSET OUTPUT1

MOV DL, [BX+3]

MOV AH, 2

INT 21H

MOV DL, [BX+2]

MOV AH, 2

INT 21H

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



GOGO레이블하고 PRINT레이블이 너무 헷갈림
GOGO레이블은
이제 연산다된 수를 다시 16진수뭐시기 처리하는 역할이고
PRINT레이블은 출력하는거에영..ㅠ
2자리 정수 받아서<16진수> 계산기 역할 하는건데..

너무어려워여.

코세아저씨말대로 사칙연산은 구현했어요