반응형
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 레지스터 값을 비워주는 코드를 추가했습니다.
정상적으로 나눗셈이 진행되어
원하는 값을 얻을 수 있게 되었습니다.
반응형
'어셈블리어 공부용 > emu8086 REPORT (오류보고)' 카테고리의 다른 글
emu8086에서 DB 나 DW 등 사용시 주의해야 할 점. (0) | 2019.08.17 |
---|---|
emu8086 어셈블후에 실행시 라벨을 이용한 분기가 제대로 안될 때. (0) | 2019.08.16 |
댓글