본문 바로가기

컴퓨터 공학 자료(학부)/Assembly

Segment란?


비트는 조각. 즉 0과 1을 말합니다. 먼저 컴퓨터는 2진수로 데이터를 저장하고 처리합니다. 16비트가 표현가능한 양의 정보는 0부터 최대 FFFFh(1111111111111111b, 65535)까지 총 65536가지입니다. 즉 2^16과 같습니다. 이것을 킬로단위로 나타내면 65536 / 1024 = 64kb(킬로비트)가 되는 것입니다.

 

세그먼트와 옵셋 : 세그먼트(Segment)는 사전적의미로 "부분"이라는 뜻입니다. 옵셋(Offset)은 "차감계산을 하다"라는 뜻이죠? 세그먼트는 메모리의 한 부분(최대 64KB크기)이고요. 옵셋은 그 세그먼트 내의 상대적 주소를 말합니다. 기준이 되는 세그먼트 주소값에서 얼마나 떨어져 있는지를 나타내는 값입니다.

 

 예전에는 1M의 메모리 크기만 해도 크다고 생각해서 하위 640KB(킬로바이트)는 기본메모리로, 상위 384KB는 상위메모리(시스템용)로 만들어 사용했습니다. (이게 바로 유명한 리얼모드에서의 메모리장벽.) 나중엔 이 때문에 프로그램좀 돌리려고 하면 "기본 메모리부족"이라는 메시지를 자주 접하게 되죠. 그래서 기본 메모리를 키우려고 CONFIG.SYS나 AUTOEXEC.BAT에서 메모리 관리자와 함께 DOS=HIGH,UMB등을 추가시켜서 기본 메모리를 키우곤 했었죠^^. 뭐, 이건 잘 아시리라 생각되고요.

 

자! 이1MB(메가바이트)의 메모리를 제어하려고 하는데요. 데이터 저장의 최소 단위는 잘 아시다 시피 바이트 단위로 저장됩니다. 1MB = 1024KB = 1024*1024 = 1048576(2^20)(=FFFFFh)바이트가 되겠지요. 데이터를 저장하려면 메모리 주소를 지정해야 하는데요. 보시다시피 20비트로 표현해야 합니다. 근데 레지스터는 16비트이므로 표현하는데 한계가 있죠? 그래서 나온게 세그먼티드 어드레싱 기법입니다. 두개의 16비트 레지스터를 이용하여 주소를 표현하는 방법입니다. 16비트 레지스터로 표현할 수 있는 범위는 65536바이트(0-65535)입니다. 이 값에 16(10h)을 곱했다고 가정하면 FFFF0h가 되겠지요? 그럼 나머지 0부터 Fh까지 다른 레지스터로 표현하면 되겠군요. 즉, 세그먼트 레지스터(16비트)값에 16을 곱하고 이 값에 나머지 값인 옵셋을 더하면 0부터 FFFFFh까지 표현이 가능하게 됩니다.
 예를 들어 세그먼트 주소값이 1234h이고 옵셋이 11h일때 절대주소는 1234 * 10h + 11h = 12351h가 되는 것입니다. 표현은 1234:0011이렇게 표시합니다. 또한 이 주소는 1235:0001과 같습니다. 세그먼트 주소값이 1씩 증가했을때 16바이트만큼 건너뛰죠? 결과적으로 메모리를 16바이트로 나누어 논것과 같이 됩니다.

이제 좀 이해가 가시려는지.. 이렇게 생각하시면 됩니다. 세그먼트는 메모리의 한 부분에서 최대 64킬로바이트만큼의 크기를 가지는 것이고요. 옵셋은 그 안에서의 상대적인 주소라고 생각하시면 됩니다.

어셈블리프로그래밍을 하시다보면요. 메모리 모델에 대해 나옵니다. TINY, SMALL, COMPACT등과 같은 것이 나오는데요. 일반적으로 기본적인 간단한 프로그램을 만드신다면 TINY와 SMALL정도가 사용될 것입니다. TINY는 코드와 데이터, 스택이 모두 한 세그먼트안에 있는 것을 말합니다. SMALL은 코드, 데이터 세그먼트등이 각각 1개씩 있는 것을 말하고요. 프로그램이 필요한 스택을 포함해 64KB를 넘지 않으면 TINY모델로 만들고요. 그 이상의 메모리가 필요한 경우는 SMALL, COMPACT등을 쓰게 됩니다.

출처: 네이버 지식인