크리에이티브 커먼즈 라이센스

홈페이지HOME

PHP

JavaScript

HTML

CSS

드롭다운메뉴

제로보드4

도   움   말

백지 건강강좌/자가임상체험

물박사(자가면역질환...)^미러

전동명(천연물질사전)^미러

竹田 장승옥(블로그)^글목록

계산환산(계산기)^ 단위변환

관주성경 TTS 일반파일 TTS

바이블로 Bible_ro 다운로드

다운로드>폰에 복사
>파일선택...설치됩니다.

[도움말 보기] 바로가기

개선 요구, 충고는
아래 관리자 연락
전화/메일 부탁 드립니다.
최대한 빨리 처리하고
업데이트 올리겠습니다.


asm_87.


나눗셈 명령 DIV,IDIV


     38 이형문 buju8t 01/13 873

    11 나눗셈 명령 DIV,IDIV 를 알아 보자..



 나눗셈 명령에는 부호없는 나눗셈을 하는 DIV(divide)명령과 ,부호가

붙은 나눗셈을 하는 IDIV(integer divide)명령 등이 있읍니다.

나눗셈 명령은 다른 명령에 없는 귀찮은 성질이 있는데, 그것은

나눌 수 없는 경우의 처리입니다. 정수끼리의 나눗셈을 하였을 때,

깨끗이 나눠져 결과가 얻어진다고 말할 수 없읍니다. 그래서 8086 CPU

에서는 나눗셈의 결과는 몫과 나머지로 나누어 2개의 레지스터에 저장

합니다.






+-------------------------------------------------------------+

16비트 /8비트  

 피젯수  젯수

나머지  몫


 +----+ +------------------+

+----+  +----+  

AX  /  8비트의

레지스터  ---> AH  AL

 +----+ 혹은

메모리  +----+  +----+  

+------------------+



32비트 /16비트  

 피젯수  젯수

나머지  몫


+----+----+ +------------------+ +----+

 +----+  

 DX  AX  /  8비트의 레지스터  --->

AH  AL

+----+----+ 혹은

메모리  +----+  +----+  

+------------------+


+-------------------------------------------------------------+


이 경우의 DX:AX 레지스터 표현은 지금까지와 마찬가지로 32 비트 레지스터

로 사용되고 있읍니다.결과가 漬

나머지라는 형태로 된다는 것외에는 곱셈과 비슷합니다.






 부호가 있는 나눗셈의 경우에 8086CPU 는 피젯수의 부호와 나눗셈의 부호

가 일치하는 결과를 구하도록 되어 있읍니다.

+-  -+

범용

레지스터 (8/16BIT)

 DIV  

 IDIV 메모리  (8/16

BIT

+-  -+


 여기서 문제가 되는 것은 ,0에의한 나눗셈과 오버플로우(자리 넘침)인

경우입니다. 나눗셈에 젯수로서 0을 지정한 경  우

, 나눗셈을 할 수가 없

읍니다. 이와 같은 경우에는 명령실행을  중단하고 INT 0 인터럽트를 발생

하여 0 에 의한 나눗셈처리 루틴으로 실행으로 실행을 옮깁니다.

또한 나눗셈을 실행할 때에 오버플로우가 발생하는 경우가 있읍니다.

이것은 나눗셈의 결과를 저장하는 레지스터의 크기가 정해져 있기 때문에,

예를 들면  16비트 /8비트일 경우 에 있어서

FFFF/1 ---->FFFF

로 된 경우 ,결과가 8비트로 된 AL레지스터에 들어가지 않으므로 오버

플로우가 발생합니다.

이와 같은 경우에도 8086 에서는 INT 0 을 발생하여 실행을 중단합니다.






* 삼각형의 중심을 구하는 문제


CODE  SEGMENT

ASSUME CS:CODE,DS:DATA

MOV AX,DATA

MOV DS,AX

;

MOV AL,A.X

CBW

MOV BX,AX

MOV AL,B.X

CBW

ADD BX,AX

MOV AL,C.X

CBW

ADD AX,BX

MOV BH,3

IDIV BH

MOV M.X,AL

;

MOV AL,A.Y

CBW

MOV BX,AX

MOV AL,B.Y

 CBW

ADD BX,AX

MOV AL,C.Y

CBW

ADD AX,BX

MOV BH,3

IDIV BH

MOV M.Y,AL

;

MOV  AH,4CH

INT 21H

;

CODE ENDS

;

DATA SEGMENT

P STRUC

X DB ?

Y DB ?

P ENDS

;

A P <12,41>

B P <-53,-19>

C P <25,-11>

M P <?,?>

;

DATA  ENDS

END


구해진 좌표는 실제의 좌표보다 2/3 만큼 원점에서 떨어져 있읍니다.

가능한한 가까운 좌표의 점을 구하려면 나머지를 2로 나누어  몫이

+1 또는 -1일 경우에는  위에서 구한 몫에 +1,-1 을 더하면 됩니다.






다음은 초를 시간,분,초로 바꾸는 프로그램입니다.


CODE  SEGMENT

ASSUME CS:CODE, DS:DATA

SIXTY EQU 60

;

MOV AX,DATA

MOV DS,AX

;

MOV SI, OFFSET SECOND

MOV AX,[SI]

MOV DX,[SI+2]

아래

설명과 같이 처음의 16비트가 하위워드,다음의 16비트가

 상위워드로

되어 있어서 초기치를 DX:AX레지스터로 전송

 하기 위해서는

위와 같이 해야 됩니다.

MOV BX,SIXTY

DIV BX

MOV TIME2.SEC,DL

 나머지

DX 레지스터를 바이트 형 변수인 TIME2.SEC에 저장할 수

 없으나,다행히

젯수가 60이고 나머지는 60미만으로 정해져 있으

 므로 하위

8비트만으로 나머지가 얻어질 수 있읍니다.

 그래서

DL레지스터의 내용을 TIME2.SEC로 전송이 가능합니다.

MOV BL,SIXTY

DIV BL

MOV TIME2.MIN,AH

MOV TIME2.HOUR,AL

;

MOV AH,4CH

INT 21H

;

CODE  ENDS

;

DATA  SEGMENT

TIME  STRUC

HOUR  DB ?

MIN DB ?

SEC DB ?

TIME  ENDS

;

SECOND  DD 72912

TIME2 TIME <,,>

DATA  ENDS

END


여기서 주의할 점은 ,DD에 의해 정의된 숫자는 메모리  상에서는 1바이트씩

완저나게 순서대로 나열된다는 것입니다.






+--------------------------------------------------+

 72912(10진수) = 00 01 1C D0  (16진수)

 


메모리 상의 데이터 D0 1C 01 00  

 하위

16비트  상위 16비트

(역워드)

 (역워드)

+--------------------------------------------------+

-G=0,23


AX=4C14  BX=003C  CX=0037  DX=000C  SP=0000  BP=0000

 SI=0000  DI=0000

DS=15C3  ES=15B0  SS=15C0  CS=15C0  IP=0023 NV

UP EI NG NZ NA PO CY

15C0:0023 CD21INT 21  

-D0,6  

15C3:0000  D0 1C 01 00 14 0F 0C  .......

 

-Q  


따라서 결과는 14H= 20시 ,0FH = 15QNS ,0CH= 12초가 됩니다.



ID:
PW:

     0 분
     1 분

자유게시판

건강백과 HOME

홈페이지 HOME

조   약     HOME

생활지혜 HOME

서식양식 HOME

법원 전산양식 검색

In Na zum

비공개 HOME

백과넷 포탈 : 건강/법률(메인)/홈피/서식/조약/생활지혜

◁ 2002.9.1.~2021.4.11. ▷

관리자 연락(저작권 의심 신고) : 김병희 010-6204-4973 k8z7@hanmail.net