|
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") ;
|
카테고리
이글루 링크
최근 등록된 덧글
17.18.19번은 어떻게 접나요?
by 종이 at 01/06 ㅇ ㅏ 이겅2년전인가 1년.. by 종이접기고修 at 12/20 wkekcke? by foobjidlrk at 11/30 ktlrjfd:,rmjsmvehuref.. by ,kkkkkkk at 11/30 kkkkkkkkkkkkkkk.. by ,kkkkkkk at 11/30 이 글귀는 너무 멋지고 .. by 지나가다가 at 11/25 어려 by fgd at 11/17 시 ㅇㄴㅁㄻ발 by 아이아 at 10/29 너무어렷다 by 기ㅣ샤갬-ㅓㅕ먀겨ㅓ at 10/27 에라이 9번에서막ㅎ~~.. by 왕찬명 at 10/08 이글루 파인더
| |||