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

emu8086으로 어셈블리어 연습 [10진수를 입력받아 16진수로 저장하기.]

by Redoutable 2019. 8. 15.
반응형

 

START:       ; START 라벨입니다. 저장처리가 끝나고나면 돌아와서 또 다른수를 입력하러 돌아옵니다.
MOV AH, 01   ; 한 문자를 입력받는 기능번호 1번을 AH레지스터에 저장.
INT 21h      ;
SUB AL, 30h  ; 문자 하나를 입력받은뒤 30h를 빼줍니다. 이유는 아래에서 설명하겠습니다.
JL ENDPROG   ; 연산결과가 0보다 작다면 ENDPROG로 분기합니다. (수가 아닌 다른 문자 입력했다는 뜻.)
CMP AL,9     ; 만일 9와 비교해서 수가 크다면?
JG ENDPROG   ; ENDPROG로 분기해줍니다.(수가 아닌 다른문자 입력했다는 뜻.)
CBW          ; AL레지스터값을 AX값으로 만들어 줍니다. 이유는 아래에서 설명하겠습니다.

XCHG AX,BX   ; AX값과 BX값을 맞바꾸어 줍니다. 최초입력시 BX값은 0입니다.
MOV CX,10    ; CX레지스터에 10을 수록합니다.
MUL CX       ; AL 레지스터에 10(CX레지스터에 수록한 값.)을 곱합니다.
XCHG AX,BX   ; AX값과 BX값을 다시 바꾸어 줍니다.

ADD BX,AX    ; AX레지스터의 연산결과를 BX에 더해줍니다.
JMP START    ; 맨 처음으로 돌아갑니다.

ENDPROG: HLT ; 잘못된 값이 입력되면 프로그램을 중단시킵니다.

 

 

 

1, 2, 3, 을 차례대로 입력하면

결과적으로 '123'을 16진수로 BX레지스터에 저장합니다.

 

 코드 상세설명 입니다.

SUB AL, 30h

이 코드는 한마디로 1을 입력했다면 레지스터에 1을 저장하게하는 코드입니다.

무슨 뜻이냐 하면, 1을 입력하면 1의 아스키코드인 31이 레지스터에 입력됩니다.

여기서 30을 빼면 1을 얻을 수 있습니다.

('근데 그게 무슨 의미가 있냐')

MOV CH ,10

MUL CX

이 두가지 코드로 10단위씩 자리올림을 하게됩니다.

만약에 3이 아니라 33을 자리올림 해버리면 330이라는 상당히 이상한 결과를 얻게됩니다.

하지만 30을 뺀 뒤에, 3에 10을 곱하면 30이 되어 뒤에 오는 수를 정상적으로 더할 수 있게됩니다.

CBW

이 코드는 바이트를 워드(2바이트)로 변환시켜주는 명령입니다.

AL에 저장되어있던 결과를 BX에 더해주어야하는데

ADD 명령은 바이트자료(AL)를 워드 자료(BX)에 더해주지 못합니다.

때문에 먼저 워드형태로 바꾸어 주는 것입니다.

저도 상당히 헷갈리네요. 디버그 프로그램으로 천천히 한 줄 한 줄 살펴보시며

BX레지스터와 AX레지스터의 값을 살펴보시기 바랍니다.

 

 

반응형

댓글