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인 세그먼트 안에 저장되어 있는 정보를 엑세스하기 위해서는 세그먼트 레지스터만으로 불가능함
-->
  다른 16비트 크기를 포인트 할 수 있는 레지스터가 필요함(offset register)

하나의 세그먼트에 접근하기 위해 대상이 되는 세그먼트 레지스터가 가진 시작 주소에 오프셋을 더해 데이터에 액세스

메모리 동작

묵시적 레지스터

대체가능 레지스터

오프셋

명령어 인출

CS

-

IP

스택 처리

SS

-

SP

데이터 엑세스

DS

CS, ES, SS

주소저장방식에 따라 다름

20bit 물리적 주소 산출

16비트 세그먼트 레지스터 << 4 + 16비트 offset

(segment:offset 구조로 되어 있는 논리주소는 segment주소를 4비트 쉬프트하고, offset을 더해주어서 물리주소로 변환)

seg : 20H offset : 10H일 때 → 200H(20H << 4) + 10H = 210H

1000004bit 쉬프트 = 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

+ Recent posts