음 ... cdq 가 뭔지 궁금했다. 그래서 디버깅 해서 어떻게 동작하는지 눈으로 확인했다.
# include <stdio.h>
int main(void) {
__asm {
cdq;
mov eax, 0x10;
mov ebx, 0x3;
div ebx;
leave;
retn;
}
}
----------------------------------------------------
step .1
EAX = 0F842730 EBX = 00212000 ECX = 00000001 EDX = 00417558 ESI = 00411041 EDI = 00411041 EIP = 00411519 ESP = 0019FEB8 EBP = 0019FF04 EFL = 00000202
----------------------------------------------------
step .2 [cdq;] 라인이 실행되고 난 후
EAX = 0F842730 EBX = 00212000 ECX = 00000001 EDX = 00000000 ESI = 00411041 EDI = 00411041 EIP = 0041151A ESP = 0019FEB8 EBP = 0019FF04 EFL = 00000202
EDX 레지스터의 값이 0x0 로 초기화 됬다.
----------------------------------------------------
step .3 [mov eax, 0x10;] 라인이 실행되고 난 후
EAX = 00000010 EBX = 00212000 ECX = 00000001 EDX = 00000000 ESI = 00411041 EDI = 00411041 EIP = 0041151F ESP = 0019FEB8 EBP = 0019FF04 EFL = 00000202
----------------------------------------------------
step .4 [mov ebx, 0x3;] 라인이 실행되고 난 후
EAX = 00000010 EBX = 00000003 ECX = 00000001 EDX = 00000000 ESI = 00411041 EDI = 00411041 EIP = 00411524 ESP = 0019FEB8 EBP = 0019FF04 EFL = 00000202
----------------------------------------------------
step .5 [div ebx;] 라인이 실행되고 난 후
(* EAX 레지스터에 몫에 결과가 EDX 레지스터에 나머지 결과가 적재)
EAX = 00000005 EBX = 00000003 ECX = 00000001 EDX = 00000001 ESI = 00411041 EDI = 00411041 EIP = 00411526 ESP = 0019FEB8 EBP = 0019FF04 EFL = 00000202
----------------------------------------------------
결론 cdq 를 사용하기 전에는 반드시 xor edx, edx or mov edx, 0x0 라는 명령어를 사용해야만 했다. 하지만 cdq 를 사용하면 edx 레지스터의 값이 0x0 으로 셋팅된다.