세그먼트(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 레지스터가 제공된다.
[이 아래 단락 부분은 그닥 필요 없는 내용이다.]
 앞서 설명한 바와 같이 세그먼트는 패러그래프 경계에서 시작한다. 메모리위치 038E0H 에서 시작하는 데이터 세그먼트를 생각해 보자. 이 예제뿐만 아니라 다른 모든 경우에도 맨 오른쪽 자리의 hex 숫자는 0이므로, 컴퓨터 설계자들은 세그먼트 레지스터에 이 0 숫자를 저장할 필요가 없다고 결정하였다. 따라서 038E0H는 가종 오른쪽 네 개의 비트가 이동되어 제거되고, 038E로 레지스터에 저장된다. 


  1. Lonewolf dlbo 2009.06.21 00:20

    GDT 공부하면서 머리 쥐어짜고 있었는데 이거 보고 이해 갔습니다 -_-)_b 좋은 자료 감사합니다~

  2. lowsec 2015.07.28 11:31 신고

    정리가 너무 잘되어있네요. 감사합니다~

  3. profriler 2015.08.20 00:50

    정리가 아주 잘된글인거같습니다 감사합니다

  4. qeeeeep 2015.10.25 09:40

    많은 도움이 되었습니다!

  5. hmm 2016.08.05 19:15

    ibm pc 어셈블리 프로그래밍 완전 복붙?

+ Recent posts