Turbo-C
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
터보-C 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
Lua 게시판
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C/C++ Q/A
[649] FAQ의 첫번째 글에 대해... (FAQ에는 리플이 안되더군여...)
김인구.구야 [whileone] 1796 읽음    2002-05-18 18:01
//////////////////////////////////////////////////////////////////////////////////////
도스에서는 메모리의 주소가 세그먼트:오프셋으로 구성됩니다.

+-----------------------+
| 세그먼트 00                        |
+-----------------------+
|                                                   | ↗ 오프셋 00
  세그먼트 A3                                          ↕
|                                                   | ↘ 오프셋 FF
+-----------------------+
| 세그먼트 FF                        |
+-----------------------+

위의 그림과 같이요 ^^;;
한세그먼트는 다시 오프셋으로 쪼개져서 00-FF 의 값을 갖게 되죠
메모리의 주소는 0000 - FFFF 로 나타내어 지는데 세그먼트 두자리 오프셋 두자리
이렇게 표현됩니다. 그래서 도스에서는 포인터가 2바이트입니다. 그래서 64K의 메모리를
가리킬 수 있습니다.

//////////////////////////////////////////////////////////////////////////////////////

이 부분이 조금 잘 못된것 같습니다.


도스에서는 한세그먼트는 오프셋으로 0000 ~ FFFF 의 값을 갖습니다.
그래서 한세그먼트는 64KB의 메모리를 가리킬 수 있습니다.
메모리의 주소는 세그먼트:오프셋(예 0000:FFFF)으로 나타내어 지는데
세그먼트에 10H를 곱해서(4비트 왼쪽 시프트) 오프셋과 더한
5자리(20비트 절대주소 = 1MB)로 메모리에 접근합니다.
(16비트 프로세서의 어드레스선이 20개이기 때문에 1MB까지 가리킬수 있습니다.)
오프셋이 2바이트니까 포인터가 2바이트입니다.
한세그먼트 내의 값을 가르키는 포인터니까 세그먼트(CS,DS등)는 공통으로 씁니다.
다른 세그먼트의 값을 가르킬때는 far포인터를 써서 CS나 DS를 변경시키겠죠.
그리고 메모리는 16바이트씩 나누어 세그먼트번호가 붙어있습니다.
절대주소 0H, 10H, 20H, 30H... 마다 세그먼트 번호 0H, 1H, 2H, 3H...를 부여했기때문에
10H를 곱해주게 되고 세그먼트 중첩이란 말의 원인입니다.
같은 메모리를 여러가지 세그먼트:오프셋으로 나타낼수 있기때문입니다.
도스의 640KB의 한계란 1MB중 도스와 시스템이 384KB를 잡아먹기 때문입니다.

두서없이 그저 책에서 본내용을 생각나는데로 적은 글이라 틀린부분이 있을지도 모릅니다.
여러모로 참고하셔서 수정할 부분이 있으면 수정바랍니다.

+ -

관련 글 리스트
649 FAQ의 첫번째 글에 대해... (FAQ에는 리플이 안되더군여...) 김인구.구야 1796 2002/05/18
670     Re: 네.. 감사합니다. 남병철.레조 1777 2002/05/23
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.