IT/embedded

[어셈블리] 세그먼트(Segment)란?

lowsec 2015. 7. 16. 00:12
아래 글은 http://karfn84.tistory.com/18에서 가져왔습니다. 주소를 클릭하면 출처 블로그로 이동합니다.

세그먼트(segment)

-  세그먼트는 프로그램에 정의된 특정 영역으로, 코드, 데이터, 그리고 스택(stack)으로 알려져 있는 것을 포함한다. 한 세그먼트는 패러그래프 경계(paragraph boundary), 즉 16또는 hex 10으로 나누어지는 위치에서 시작한다. 세그먼트는 메모리의 거의 어느 곳에나 위치할 수 있고, 실제 모드에서 최대 64KB까지의 크기가 가능하지만, 프로그램이 실행을 위해 필요한 공간 - 데이터와 그 데이터를 처리하는 명령어들을 위한- 이면 된다. 명령어가 세그먼트 레지스터에 세그먼트 주소를 적재할 때, 가장 오른쪽에 위치한 네 개의 0비트가 자동으로 오른쪽으로 이동하면서 제거된다.

 우리는 임의 개수의 세그먼트를 정의할 수 있다. 특정 세그먼트에 대해서 주소를 지정하려면 적절한 세그먼트 레지스터의 값을 그 주소로 변경하기만 하면 된다. 실제 모드에서 세개의 주요 세그먼트는 코드, 데이터, 그리고 스택이다.


⊙ 코드 세그먼트(code segment)는 실행될 기계 명령어를 포함한다. 보통 첫번째로 실행 가능한 명령어는 이 세그먼트의 맨 처음에 위 치하며, 운영체제는 프로그램 실행을 시작하기 위해 그 위치를 알고 있다. 이름이 의미하듯이, 코드 세그먼트(CS) 레지스터는 코드 세그먼트의 주소를 의미한다.

⊙ 데이터 세그먼트(data segment)는 프로그램에서 정의된 데이터, 상수, 작업 영역을 포함한다. 데이터 세그먼트(DS) 레지스터는 데이터 세그먼트의 주소를 포함한다.

⊙ 스택 세그먼트(stack segment)는 프로그램이 임시로 저장할 필요가 있거나, 사용자의 '피호출' 서브루틴(called subroutine)이 사용할 데이터와 주소를 포함한다. 스택 세그먼트(SS) 레지스터는 스택 세그먼트의 주소를 포함한다.

세그먼트 경계
- 세그먼트 레지스터는 크기가 16비트이며, 세그먼트의 시작 주소를 포함한다. 세그먼트 레지스터는 SS, DS, CS, ES(extra segment)가 있으며, 80386과 그 이후 프로세서에서는 FS와 GS 레지스터가 제공된다.