티스토리 뷰

No. 06

Assembly

# 세그먼트와 오프셋

 

 

 

우리가 오렌지를 먹을때 오렌지 하나를 통째로 먹기 힘들기 때문에 오렌지를 잘라서

조각으로 만들어 한입에 먹을 수 있게 만듭니다. 영어로 조각을 Segment 라 합니다.

 

마찬가지로 8086 CPU는 한입에 최대 16bit 크기의 주소만을 먹을 수 있습니다. 따라서

20bit 의 메모리 주소를 한번에 처리 할 수 없기 때문에 세그먼트라는 조각으로 나누어

처리 하는 것입니다.

 

 

 

 

 ※ 세그먼트

 

밑에  그림을 보면서 공부해 봅시다.
우선 메모리의 주소는 00000 ~ FFFFF 까지 이므로 1MB 라는 것을 알 수 있습니다. 그리고 우리는 이 1MB를
세그먼트 라는 하나에 64KB 크기의 조각으로 나누어 사용하는 것입니다. 

 

세그먼트 종료로는 CS, DS, ES, SS 로 각 세그먼트는 16bit 세그먼트 레지스터에 의해서 지정됩니다.

 

코드 세그먼트(CS)는 프로그램 명령어가 저장된 세그먼트 영역의 시작주소를 저장하고, 데이터 세그먼트(DS)프로그

에 사용되는 데이터가 저장된 세그먼틔 첫 주소를 저장

한다. 엑스트라 세그먼트(ES) 또한 데이터 세그먼트와 같다. 그리고 스택 세그먼트(SS)는 인터럽트와 서브루틴의 반환 주소를 저장하는데 사용된다.

 

자세히 보면 ES영역과 SS영역이 서로 겹쳐 있는걸 알수 있는데 실제로 4개의 세그먼트가 완전히 같은 경우도 허용된다. 이를 오버래핑이라 하며 메모리 사용량을 줄이는데 활용된다.

 

메모리 주소는 20bit 로 16진수 5자리로 표현 합니다.

하지만 우리가 사용하는 레지스터는 16bit 이므로 16진수

4자리 까지만 표현 할 수 있습니다.

 

따라서 당연히 16진수 5자리를 표현 할 수 없기에 뒤에

16진수 한자리(=2진수 4자리)를 떼어낸 16bit 값을 16진수 4자리로 표현하는 것입니다.

 

이부분은 바로 밑에서 설명할 오프셋과 함께 실제 메모리 주소를 구하는데 중요하므로 반드시 왜 마지막 자리를

떼어내고 표현하는지 기억합시다.

 

 

 

 

 ※ 오프셋

 

 

 

" 간단히 게시판을 메모리라 보겠습니다. 이를 페이지라는 세그먼트로 나누었습니다.

  하지만 우리가 정작 읽고 싶은 게시물은 해당 페이지만을 클릭해서 읽을 수 없습니다.

  그렇기 때문에 좀더 세부적인 접근을 위해서 게시물 번호가 필요 합니다."

 

 

이 게시물 번호에 해당 하는 것이 오프셋 입니다.

 

앞서 세그먼트 레지스터로는 20bit 주소값 중에서16bit 밖에 표현 할 수 없기 때문에 뒤에

2진수 4자리를 떼어낸다고 했습니다.

 

물론, 이러한 방법으로 세그먼트의 시작 주소 20bit 를 표현 가능 하지만 세그먼트 레지스터

하나로는 나누어 놓은 세그먼트 내의 원하는 메모리 주소에는 접근 할 수 없습니다.

 

따라서 세그먼트 레지스터는 64KB 크기의 세그먼트 첫 번째 주소밖에 지정하지 못하기 때문에 64KB내에서 원하는 주소를 지정하기 위해서 오프셋 레지스터가 사용됩니다.

 

 





 본 글이 조금이도 도움이 됐다면 더 많은 사람들이 볼 수 있게


▶ '로그인이 필요없는' 공감  버튼을 눌러주세요.




Comments
댓글쓰기 폼
Related Articles more