반응형
어셈블리어에선 사용자가 어떤 값을 입력하면
그 값에 대응하는 아스키코드값을 저장하게 됩니다.
가령 '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 메세지를 출력하고 맨 처음으로 되돌리는
기능까지 탑재되어 있습니다.
다만, 출력은 하지 않습니다.
반응형
'어셈블리어 공부용 > x86 어셈블리어(ASSEMBLY)' 카테고리의 다른 글
emu8086으로 어셈블리어 연습하기 [로또번호용 난수 6자리 뽑기] (1) | 2019.08.15 |
---|---|
emu8086으로 어셈블리어 연습 [16진수를 10진수로 변환 후 출력하기] (0) | 2019.08.15 |
emu8086으로 어셈블리어 연습 [10진수를 입력받아 16진수로 저장하기.] (0) | 2019.08.15 |
emu8086 어셈블러로 어셈블리어 연습 [소문자는 대문자로, 대문자는 소문자로 바꾸어 출력하게 하기] (0) | 2019.08.15 |
DOS DEBUG로 어셈블리어 연습 [z에서 a까지 역순으로 알파벳 출력하기] (0) | 2019.08.15 |
댓글