본문 바로가기
공부,일/어셈블리

ch4 4.4 Division Instructions

by fromnothing1 2021. 8. 18.

idiv(signed),div(unsigned)

나눗셈의 경우 lenth 를 2배로 증가 시킨다음 나눈후에 각각의 byte 에 몫과 나머지를 할당하다.

위 예시를 보면 divisor (1 byte ) -> dividend ( AX 2byte) 이다.  즉 dividend 의 크기는 2배가 된다. 

몫과 제수는 각각 1byte 의 레지스터에 저장된다.

 

dividend size 를 2배로 늘리기 때문에 예비동작이 필요하다. 즉 acccumate 레지스터의 상위 byte(또는 edx) 를 0 또는 1로 set 시켜줘야한다. 

(음수의 경우 상위 byte 는 모두 1) 

 

때문에 86x80 의 경우 이를 위한 명령어를가진다. 

 

cbw  -> byte to word 

cwd  -> word  to dword 

cdq  -> dword  to qword

 

 

 

mul 과 같이 1개의 operand 를 가진다. 

ex)

idiv source

div source

-자동으로 accumulate 

 mov eax , 100
 mov ebx , 13
 mov edx , 0 ; 나누기 전에는 edx 를 0 으로 해줘야한다. 
 div ebx

idiv (singed)

부호있는 나누기의 경우 제수와 나머지의 부호가 항상 일정하다. 

 

ex)

    100 = (−7) * (−13) + 9 (100/−13, quotient −7, remainder 9)

−100 = (−7) * 13 + (−9) (−100/13, quotient −7, remainder −9)

−100 = 7 * (−13) + (−9) (−100/−13, quotient 7, remainder −9)

 

−511= 15 * (−32) + (−31) 

65025 = 255 * 255 + 0

error 처리 

나누기 또한 여러가지 에러를 발생시킬 수 있습니다. 

0으로 나눌때 에러가 발생하며 

2byte 제수를 나누면 1byte 의 몫과 나머지가 발생하는데 만약 몫이 1byte 를 초과 한다면 이는 에러가 날것입니다. 

 

시스템마다 이러한 예외를 처리하는 부분이 있습니니다. (인터럽트 핸들러 ) 

 

 

댓글