segment:offset

asm 2010. 7. 7. 00:42
지금은뭐 32bit니 64bit 하지만 기본적인 개념을 잡고자 설명해보도록한다.

x86의 초기모델인 8086은 8086 은 내부적으로 16비트의 레지스터를 사용한다.
따라서 CPU 내부 구조는 16 bit 레지스터를 사용하고 있었으므로 최대 2^16인 65536 Byte, 즉 64KB의 메모리밖에 사용할 수 없다.
이에 인텔은 세그먼트와 오프셋이라는 개념을 도입해서 16 bit 레지스터를 이용해 20 bit를 가리킬 수 있도록 하였다.
즉 2^20인 1Mbyte를 사용할 수 있게 되었다.

Segment : Offset 과 같이 쓰며, 이렇게 표시되어있는 논리주소는 세그먼트를 4bit 시프트하고, 거기에 오프셋을 더해 물리주소로 변환한다.  --> 20비트 사용

예를들어 0x1000:0x2345 이라면 0x1000을 4bit 왼쪽으로 시프트(2^4 = 16) 16진수로는 자릿수 0을 더해서 거기에 오프셋 값을 더해  0x10000 + 0x2345 = 0x12345 이 된다.

이 방법을 통해서 0x00000 부터 최대 0xFFFFF 까지 1MB의 메모리를 사용할 수 있게 되었다. 따라서 하나의 세그먼트의 크기는 64KB가 되며, 이 세그먼트부터 다음 세그먼트 사이에 존재하는 주소에 접근하기 위해서 오프셋을 사용한다.

'asm' 카테고리의 다른 글

어셈을 시작하며  (0) 2010.08.27
NASM, MASM 차이  (1) 2010.08.13
About link errors  (0) 2010.07.15
AND