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 를 초과 한다면 이는 에러가 날것입니다.
시스템마다 이러한 예외를 처리하는 부분이 있습니니다. (인터럽트 핸들러 )
'공부,일 > 어셈블리' 카테고리의 다른 글
어셈블리 수업 기초 (0) | 2021.08.24 |
---|---|
스택 ebp ,esp레지스터 , 함수 호출 , return(수업준비) (0) | 2021.08.20 |
ch4 4.3 Multiplication Instructions (0) | 2021.08.18 |
ch4. 2 Integer Addition and Subtraction Instructions (0) | 2021.08.17 |
ch.4 - mov 완전정리 ( copy data) (0) | 2021.08.17 |
댓글