어셈블리 cdq

어셈블리2017. 12. 1. 23:46

음 ... 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 으로 셋팅된다. 


'어셈블리' 카테고리의 다른 글

오늘 공부한 내용 날림 나 혼자 보려고 끄적인 것  (0) 2018.01.22
네이버 풀이  (0) 2017.12.22
랜덤 어셈블리  (0) 2017.12.01
네이버  (0) 2017.11.20
포인터 접근 방식  (0) 2017.11.14