본문 바로가기
어셈블리어 공부용/emu8086 REPORT (오류보고)

emu8086에서 나눗셈이 이상할 때.

by Redoutable 2019. 8. 17.
반응형

emu 8086에서 나눗셈을 하면 정상적인 값이 아니라,

이상한 값이 출력되는 경우가 있습니다.

 

예를 들어서 16진수 Bh를 십진수로 진수 변환하고자 할 때,

몫이 0이 될 때 까지 10으로 계속 나누면서

나머지를 얻은 순서를 역순으로 나열하는

작업을 하게 됩니다.

 

MOV AL, 0Bh ;16진수 11을 10진수로 변환하기.
MOV BX,10  ;제수 10을 BX 레지스터에 넣기.

DIV BX     ; AX레지스터를 10나누기
PUSH DX    ; 나머지를 스택에 쌓기 (나머지가 DX레지스터에 리턴된다.)
DIV BX     ; 10나누기
PUSH DX    ; 나머지를 스택에 쌓기

 

이렇게 작성한 다음

스택에서 수를 차례대로 꺼내어 출력하면 될것 같습니다.

 

스택의 칸칸에는 1 그리고 1이 들어있을 겁니다.

하지만 이 코드를 직접 작성해서 실행해보면 이상하게 동작합니다.

 

 

AX에 피제수(0Bh)를 넣고 BX에 10(제수)을 넣어서 진수 변환을 준비합니다.

 

 

첫 번째 나눗셈입니다. [DIV BX]

몫(AX) : 1 나머지(DX): 1

정상적인 연산입니다.

(몫은 AX 레지스터에 리턴, 나머지는 DX 레지스터에 리턴.)

 

 

하지만 두 번째 연산부터 갑자기 이상한 값이 나오기 시작합니다.

 

 

 

원인은 DX레지스터에 남아있는 값에 있습니다.

DIV 연산 시에 16비트 값으로 나눗셈을 시도하면

(나눗셈으로 16비트 레지스터를 사용하면)

 

피제수로 DX:AX 레지스터를 사용하기에,

DX를 비워주셔야 정삭적인 결과를 얻을 수 있습니다.

 

 

MOV AL,0Bh ;16진수 B를 10진수로 변환하기.
MOV BX,10

DIV BX
PUSH DX  ; 스택에 나머지값 저장
MOV DX,0 ; DX레지스터값은 나누기에 쓰지 않을 것이므로 청소해줌.
DIV DX
PUSH DX  ; 스택에 나머지값 저장
MOV DX,0 ; DX레지스터를 청소

코드를 수정해 주었습니다.

DX 레지스터 값을 비워주는 코드를 추가했습니다.

 

정상적으로 나눗셈이 진행되어

원하는 값을 얻을 수 있게 되었습니다.

반응형

댓글