Segment Memory |
8086은 1mb의 메모리 공간을 다음과 같은 4개의 세그먼트 공간으로 나누어 관리함 | |
Code Segment |
명령어 코드를 저장 | |
Data Segment |
데이터를 저장 | |
Stack Segment |
메모리에 할당된 스택 영역 | |
Extra(Heap) Segment |
여분의 데이터 영역 | |
Segment Register |
8086이 필요한 정보를 세그먼트 단위로 나누어 저장하고 있기 때문에 정보를 가져오기 위해선 각 세그먼트의 시작 주소를 알아야 함 따라서 4개의 세그먼트 레지스터를 이용해 각 세그먼트 영역의 시작 주소를 가리킴 | |
CS |
실행 할 명령어들이 들어있는 코드 세그먼트의 시작 주소를 가지고 있는 레지스터. CS * 10H + OFFSET(IP)로 물리 메모리 주소 결정 | |
DS |
데이터 세그먼트의 시작 주소를 가지고 있다. 메모리 직접 주소 지정 혹은BP외의 레지스터와 함께 사용하여 메모리 간접 주소 지정에서 오프셋 값과 더해져 물리 주소를 산출한다. | |
SS |
스택 세그먼트의 시작 주소를 가지고 있다. SP와 SS * 10H의 합으로 물리 주소를 결정한다. BP를 사용하는 메모리 간접 주소 지정에서 오프셋과 합해 물리 주소를 생성한다. | |
ES |
일반적으로 문자열 처리에 사용. 문자열 처리 명령어가 수행되면 목적지의 위치는 DI와 EX * 10H로 결정되고 출발지는 SI와 DX * 10H로 물리주소 결정한다. | |
OffSet Register |
최대 64KB인 세그먼트 안에 저장되어 있는 정보를 엑세스하기 위해서는 세그먼트 레지스터만으로 불가능함 | |||||||||||||||
하나의 세그먼트에 접근하기 위해 대상이 되는 세그먼트 레지스터가 가진 시작 주소에 오프셋을 더해 데이터에 액세스
| ||||||||||||||||
20bit 물리적 주소 산출 16비트 세그먼트 레지스터 << 4 + 16비트 offset (segment:offset 구조로 되어 있는 논리주소는 segment주소를 4비트 쉬프트하고, offset을 더해주어서 물리주소로 변환) seg : 20H offset : 10H일 때 → 200H(20H << 4) + 10H = 210H 100000를 4bit 쉬프트 = 100000 0000 → 1000000000 → 200H 10H → 10000 1000000000 + 10000 → 1000010000 → 210H |
'Security > Reverse Engineering' 카테고리의 다른 글
[Revsering] ASCII Code List (0) | 2010.10.17 |
---|---|
[Reversing] IDA pro 단축키 (0) | 2010.09.02 |
[Reversing] Ollydbg 단축키 (0) | 2010.07.02 |
[Reversing]구조화된 예외 처리(SEH) (0) | 2010.05.10 |
[Reversing]Input and Output (0) | 2010.05.10 |