본문 바로가기
어셈블리어 공부용/x86 어셈블리어(ASSEMBLY)

emu8086을 이용한 어셈블리어 연습 [16진수를 입력하여 16진수로 저장하기]

by Redoutable 2019. 8. 15.
반응형

어셈블리어에선 사용자가 어떤 값을 입력하면

그 값에 대응하는 아스키코드값을 저장하게 됩니다.

 

가령 'A'를 입력받으면 레지스터엔 41이 저장되게 됩니다.

때문에 저장받은 후에

또다른 처리를 해주어야 합니다.

 

.MODEL SMALL
.CODE
ORG 100h   

ERRORMSG DB 'ERROR!$'

START:

INPUTNUM PROC NEAR

INPUT:  
MOV AH, 1     ; 문자 하나를 입력받는 기능번호 1번을 수록합니다.
INT 21h       ;
CMP AL, 0Dh   ; 엔터키(아스키코드:0Dh)가 입력되면 입력을 종료하고 메인루틴으로 돌아가는 역활을 합니다.
JE CRLF       ; 입력받은 키가 엔터키라면 먼저 띄워쓰기 루틴(CRLF)으로. 그 다음 메인루틴으로 이동하게 됨.
SUB AL, 30h   ; 아스키코드상태에서 30h를 빼줍니다.
JL ERROR      ; 만일 0보다 작은 무언가가 입력되었다면 30을 뺐을 때, 음수가 됩니다. 음수라면 에러로 보냅니다.
CMP AL, 16h   ; Fh보다 큰 수가 입력되면 오류이므로 에러로 보냅니다.
JG ERROR      ; 에러로 이동.
CMP AL, 9     ; 이제 9보다 큰지 작은지 비교합니다.
JLE TODECA    ; 작거나 같다면 TODECA로 보냅니다.

CMP AL, 11h   ; 크다면 다시 11h(:)와 비교합니다.
JL ERROR      ; 작다면 수를 입력한게 아니므로 오류로 보냅니다.
AND AL, 00001111b ; 16진수의 A~F 수들은 30을 빼도 상위 4비트(EX)0001,0011)에 값이 남아있는 상태이므로 제거.
ADD AL,9h     ; 9를 더해주어서 문자형태로 만듦니다.

TODECA: CBW   ; 바이트자료형태를 워드 자료형으로 바꾸어줍니다. (위에서 9이하의 수들은 여기로 바로 내려옵니다.)
XCHG AX,BX    ; AX레지스터와 BX레지스터의 값을 맞바꿉니다.
MOV CX, 16    ; 16진수를 입력받았으니까 16단위로 단위가 올라가야합니다. 16을 곱합니다.
MUL CX        ; CX에 수록된 16으로 AX레지스터에 있는 값에 곱하기를 수행합니다.
XCHG AX,BX    ; 곱하기가 완료된 결과물을 다시 BX에게 주고,

ADD BX,AX     ; 이제 새 수가 들어갈 자리가 생겼으니 더해줍니다.
JMP INPUT     ; 새로운 수를 입력받으로 맨 처음으로 돌아갑니다.

ERROR:        ;잘못된 수가 입력되면 오류처리하는 곳입니다.
CALL CRLF
LEA DX, ERRORMSG
MOV AH, 9
INT 21h
CALL CRLF
MOV AX,0000h
MOV BX,0000h
JMP START

INPUTNUM ENDP

CRLF PROC NEAR ;수 입력이 끝나면 캐리지 리턴(CR) 과 라인 피드(LF)를 실행합니다.
MOV AH, 2
MOV DL, 0Dh
INT 21h
MOV DL, 0Ah
INT 21h
RET
CRLF ENDP

즉 이 프로그램은

사용자가 입력하는 수를 16진수로 판단하고

그것을 그대로 BX 레지스터에 저장합니다.

10을 입력하면

십진수 10이 아니라 16진수 10이 입력됩니다.

 

사용자가 16진수 외의 문자를 입력하면

ERROR 메세지를 출력하고 맨 처음으로 되돌리는

기능까지 탑재되어 있습니다.

다만, 출력은 하지 않습니다.

반응형

댓글