프로그램이 수행되기 위해서는 여러 가지 메모리 주소가 필요하다. 우선 현재 수행되고 있는 명령어의 위치를 나타내는 값, 프로그램이 사용하는 데이터가 있는 메모리 값, 그리고 함수 호출 등을 위한 스택의 위치를 나타내는 값 등이다.
8086은 어드레스 버스가 20비트로 구성되어 있어서 1MByte까지 메모리 번지를 나타낼 수 있으나 8086에 있는 레지스터는 16비트밖에 되지 않아서 어떤 명령이 수행되어 메모리를 참조할 때에는 항상 다음의 표와 같이 암시적 또는 명시적으로 세그먼트 레지스터가 개입되게 된다.
예를 들어 [mov ax, word ptr 1032h]라는 명령은 현재 데이터 세그먼트의 오프셋 1032H번지, 즉 DS:1032번지의 값을 AX 레지스터에 집어넣는다. 만일 데이터 세그먼트가 아니라 보조 세그먼트를 액세스하고 싶으면 [mov ax, word ptr es:1032h]와 같이 명시적으로 세그먼트를 지정해 주면 된다.
그리고 위의 표에서 알 수 있듯이 각종 레지스터들은 오프셋 값으로 사용할 때에도 암시적으로 레지스터와 연결된다. 즉 AX, BX, CX, DX, SI, DI는 DS와 조합되고 BP, SP는 SS와 조합된다. 이 역시 ES:BX와 같이 써서 강제로 다른 레지스터와 조합시킬 수도 있다.
또한 현재 수행되고 있는 명령의 위치는 명령 포인터(IP) 레지스터가, 스택의 위치는 스택 포인터(SP) 레지스터가 가지고 있으나 이 역시 암시적으로 현재 수행되는 명령은 CS(Code Segment)와 결합되어 CS:IP가 되며, 스택 위치는 SS(Stack Segment)와 결합되어 SS:SP라는 주소로 이루어지게 된다.
8086은 어드레스 버스가 20비트로 구성되어 있어서 1MByte까지 메모리 번지를 나타낼 수 있으나 8086에 있는 레지스터는 16비트밖에 되지 않아서 어떤 명령이 수행되어 메모리를 참조할 때에는 항상 다음의 표와 같이 암시적 또는 명시적으로 세그먼트 레지스터가 개입되게 된다.
세그먼트 | 오프셋 | 목적 |
코드 세그먼트(CS) | IP | 수행되어질 명령어의 위치 |
스택 세그먼트(SS) | SP, BP | 스택 주소 참조 |
데이터 세그먼트(DS) | 범용 레지스터, DI, SI | 데이터 주소 참조 |
보조 세그먼트(ES) | 스트링 명령을 위한 DI | 스트링의 목적지 주소 |
예를 들어 [mov ax, word ptr 1032h]라는 명령은 현재 데이터 세그먼트의 오프셋 1032H번지, 즉 DS:1032번지의 값을 AX 레지스터에 집어넣는다. 만일 데이터 세그먼트가 아니라 보조 세그먼트를 액세스하고 싶으면 [mov ax, word ptr es:1032h]와 같이 명시적으로 세그먼트를 지정해 주면 된다.
그리고 위의 표에서 알 수 있듯이 각종 레지스터들은 오프셋 값으로 사용할 때에도 암시적으로 레지스터와 연결된다. 즉 AX, BX, CX, DX, SI, DI는 DS와 조합되고 BP, SP는 SS와 조합된다. 이 역시 ES:BX와 같이 써서 강제로 다른 레지스터와 조합시킬 수도 있다.
또한 현재 수행되고 있는 명령의 위치는 명령 포인터(IP) 레지스터가, 스택의 위치는 스택 포인터(SP) 레지스터가 가지고 있으나 이 역시 암시적으로 현재 수행되는 명령은 CS(Code Segment)와 결합되어 CS:IP가 되며, 스택 위치는 SS(Stack Segment)와 결합되어 SS:SP라는 주소로 이루어지게 된다.
'Reverse Engineering > Reversing 이론 설명' 카테고리의 다른 글
[System] 바이트 순서 (Little Endian과 Big Endian) (0) | 2011.05.29 |
---|---|
[CPU] 80286과 80386 마이크로프로세서 (0) | 2011.05.28 |
[CPU] 8086의 레지스터들 (0) | 2011.05.28 |
[CPU] 8086 세그먼트와 오프셋의 개념 (0) | 2011.05.26 |
[IDA] 단축키 Cheet-sheet (0) | 2011.02.25 |