본문 바로가기

Malware Analysis/- Knowledge storage

assembly div, idiv, cdq

32bit의 나눗셈을 한다고 가정해보자. 명령어 div(부호가 없는 나눗셈), idiv(부호가 있는 나눗셈)은 많이 알고 있는 개념이다.

그 외에 알아야할 개념은 2가지 정도이다.

피제수와 cdq이다. 피제수는 나눔을 당하는 수 즉, dividied이다.

 

17과 5를 (32bit data라 가정) 나눈다고 하면 eax에 17을 넣고, ebx(다른 레지스터나 메모리도 상관은 없다)에 5를 넣는다. 그리고 div나 idiv연산을 하면 잘 될 거같지만 그렇지 않다. 제수가 32bit data라면 피제수는 64bit가 되어야한다. 그래서  피제수의 bit를 확장해 줘야하는데 그것이 cdq 연산이다. eax를 eax(상위16비트):edx(하위32비트)로 바꿔준다. 그리고 idiv 연산을 하면 몫은 eax 나머지는 edx에 들어간다.