|
Memory Addressing Mode는 CPU가 명령어를 처리할 때, 필요한 데이터를 위치시키는 방법이다. 특히 C/C++ code에서 array나 pointer 연산이 많은 데, 이러한 pointer나 array가 가리키고 있는 특정 주소에 저장된 데이터를 Check하는 일은 debugging시 빈번히 나타날 것이다. Addressing mode는 base, displacement, index나 scale로 이뤄진다. 보통, [eax] 와 같은 형태에서 eax가 base 이다. Eax가 가리키고 있는 address에 data가 존재하는 경우이다. 8d8570ffffff lea eax,[ebp-90h] 이러한 pattern은 [ebp-90h] 와 같은 경우는 (ebp-offset이므로,) local variable의 형태인데, base인 ebp에 displacement에 해당하는 offset값이 90h 가 조합된 형태로, base+displacement 형태인데, lea 즉, ebp-90h이 가리키는 데이터를 eax register에 load 하는 경우이다. 35 00411491 8b8564ffffff mov eax,dword ptr [ebp-9Ch] 35 00411497 8b8d64ffffff mov ecx,dword ptr [ebp-9Ch] 35 0041149d 8a540dac mov dl,byte ptr [ebp+ecx-54h] 35 004114a1 88940570ffffff mov byte ptr [ebp+eax-90h],dl [ebp+ecx-54h]의 경우는 ecx가 index에 해당한다. 그러므로, base+index+displacement 형태인데, 보통, array 연산에서 쉽게 볼 수 있다. 예를 들어 상위의 연산은 아래와 같은 c code의 disassemble 한 경우이다. tmpCopy[j] = tmp[j]; 즉, j 변수에 해당하는 값이 array의 index에 해당하는 데, 이것이 ecx나 eax값으로 사용되고 있다. 또한, base+(index*scale)+displacement 와 같은 구조도 나올 수 있다. 51 00411613 8b450c mov eax,dword ptr [ebp+0Ch] 51 00411616 8b4d08 mov ecx,dword ptr [ebp+8] 51 00411619 8b1481 mov edx,dword ptr [ecx+eax*4] 51 0041161c 83c219 add edx,19h [ecx+eax*4] 에서 4는 scale에 해당한다. Ecx는 ebp+8의 address값이므로, parameter값이다. 하지만, 이것이 pointer인지라, index에 해당하는 eax(이 역시 parameter로 전달받은 값이다.)에 pointer size 인 4만큼 자리이동을 한 위치를 가리키고 있다. 마지막에 19h를 add하는 operation이 존재하는 데, 이는 다시 19h 만큼 displacement 하고 있다. 이유는 ebp+8의 parameter가 구조체 형태로 19h offset에 해당하는 address에 대한 연산을 하고 있기 때문이다. (kp command) 0012fdc8 004114f2 mAddrModetest!AddAddrSeoulKorea(struct tagF ** param = 0x0012ff50, int idx = 1) 0:000> dv /V 0012fdd0 @ebp+0x08 param = 0x0012ff50 0012fdd4 @ebp+0x0c idx = 1 0:000> dt tagF mAddrModetest!tagF +0x000 name : [20] Char +0x014 sex : [5] Char +0x019 address : [100] Char +0x080 age : Int4B 상위는 아래와 같은 c code의 disassemble 한 경우이다. bool AddAddrSeoulKorea (F** param, int idx) { /*..... 중략*/ strcpy(param[idx]->address, "Seoul Korea") ;
|
카테고리
이글루링크
최근 등록된 덧글
그러세요
by 강세윤 at 12/15 오늘 많이 헤매다..알게 .. by youna at 12/14 글 잘 읽었습니다 . 전 .. by 위시 at 11/26 어렷다 by klhk at 11/09 dhjjgbem by kl at 11/09 17번부터 어떻게 접는지.. by tykim0131 at 10/28 ATL이나 MFC를 이용하.. by 김명신 at 09/24 복원되었군요.. 제 RSS.. by 강세윤 at 09/24 허걱, 하고 있는 것으로.. by 강세윤 at 09/15 RSS 주소 서비스는 안 .. by 정성태 at 09/15 이글루 파인더
| |||