1. 프로그램 세그먼트의 개요
최소한 3개의 세그먼트로 구성 : 코드 세그먼트, 데이터 세그먼트, 스택 세그먼트
코드 세그먼트 : 프로그램이 수행해야 할 명령어들을 가지고 있다
데이터 세그먼트 : 코드 세그먼트에 있는 명령어 들이 처리해야 할 데이터를 저장하는 곳
스택 세그먼트 : 일시적으로 정보를 보관하는 곳
1.1 세그먼트의 시작 위치와 정의
세그먼트 : 메모리의 한 영역, 최대 64kb의 공간을 차지, 시작번지는 0H로 끝나는 번지로 항상 16으로 나누어 떨어져야 한다.
1.2 논리 번지와 물리 번지
물리번지(physical address) : CPU의 어드레스 핀에 출력, 메모리 인터페이스 회로에 의해 디코드되는 20비트 번지, 8086 명 리얼모드(286, 386, 486)에서 모두 00000H~FFFFFH. 1mb의 메모리 범위 내에 있음. ROM, RAM의 실제 번지.
옵셋 번지(offset address) : 64kb 세그먼트 범위 내에 있는 번지로 0000H~FFFFH의 값을 가짐.
논리 번지(logical address) : 세그먼트의 값과 옵셋 번지로 결정
ex) CS:IP 24F6:634A
논리번지 : 24F6:634A
옵셋번지 : 634A
물리번지 : 24F60H + 634AH = 2B2AAH
(H는 16진수를 표현한다.)
물리번지의 최소값 : 24F60 + 0000 = 24F60
코드 세그먼트의 최대값 : 24F60 + FFFF = 34F5F
1.3 코드 세그먼트
프로그램을 수행하기 위해 8086은 명령어를 코드 세그먼트에서 읽어옴. 명령어의 논리 번지는 항상 CS(code segment)와 IP(instruction pointer)로 구성되며 CS:IP로 표현한다.
1.4 리틀 엔디언 규칙
16비트의 데이터를 저장할 땐, 하나의 번지에 1바이트의 데이터가 저장되므로 2개의 번지에 나누어야 하는데 그때 하위바이트는 아래쪽의 번지에, 상위 바이트는 위쪽의 번지에 저장하는 것을 말한다.
1.5 엑스트라 세그먼트
ES(extra segment)는 여분의 데이터 세그먼트로 쓰임. 문자열(string)을 다루는 데 있어서 중요한 역할을 한다.
1.6 IBM PC의 메모리 맵
RAM 640K | 00000H ~ 9FFFFH (0~255 : 인트럽터벡터테이블, BIOS 데이터 영역) |
Video Display RAM 238K | A0000H ~ BFFFFH |
ROM 256K | C0000H ~ FFFFFH (F0000H ~ FFFFFH 까지만 BIOS에 의해 사용) |
1.6.1 RAM
휘발성 메모리로써 메모리를 관리하는 일은 아주 복잡하기 때문에 사용자에게 맡겨지지 않고 DOS에 맡겨진다. 일반 사용자는 물리 번지를 지정하는 것에 대한 지식이 없기 때문에 CS, DS, SS 같은 세그먼트 레지스터의 값을 직접 다루지 않는다.
1.6.2 ROM
비휘발성 메모리로 C0000H에서 FFFFFH까지가 ROM을 위한 할당이다. 이중 F0000H에서 FFFFFH까지의 64KB만 BIOS에 의해 사용된다. 그 외의 공간은 여러 가지 어댑터 카드에 의해 쓰이거나 비어 있다.
1.6.3 BIOS ROM의 기능
CPU는 메모리에 저장되어 잇는 프로그램만 수행할 수 있으므로 전원 스위치를 켰을 때 CPU가 수행해야 할 프로그램을 보관하고 있는 비휘발성 메모리가 필요하다. ROM에 저장되어 있는 이런 프로그램들 PC에서는 BIOS라고 하며, RAM과 CPU에 저장되어 있는 여러 가지 장치를 테스트하고 에러를 사용자에게 알려준다. 주변기기에 대한 테스트와 초기화가 모두 끝나게 되면 DOS를 RAM에 적재하고, PC의 컨트롤을 DOS에게 넘겨준다.