8086 CPU에서의 주소 표현
8086 CPU의 메모리 주소는 20비트로, 총 1MB의 크기를 갖는다. 그러나 일반 레지스터의 크기는 16비트로, 모든 메모리 영역을 표현 하기에는 4비트가 부족하다. 따라서 하나의 메모리 주소를 표현하기 위해 총 2개의 레지스터를 사용한다.
Offset 방식
메모리 주소를 표현하기 위한 두 레지스터는 각각 Segment와 Offset으로 나뉜다.
Segment레지스터 값을 왼쪽으로 4비트 옮겨 ( 으로 처리한다. ) Offset 레지스터의 값을 더함으로써, 메모리 주소를 표현한다.
따라서 메모리 주소를 표현할 때에는 무조건 두 레지스터를 함께 연산하는데, 예를 들어 그림에서 스택 영역의 맨 위를 가져오고 싶을 경우,
스택 영역의 시작을 의미하는 레지스터 SS와 스택 영역의 offset을 담당하는 SP 레지스터를 가져와서 [SS:SP]로서 표현한다.
어셈블리어에서는 코드에서 두 레지스터를 매번 명시하지 않아도 CPU가 상황별 기본 세그먼트(코드=CS, 스택=SS, 일반=DS, 문자열 목적지=ES)를 암시적으로 사용하기도 한다.
실제 주소 표시 예시
SS=0x1234, SP=0x5678
→ 물리 주소 = 0x1234 × 0x10 + 0x5678 = 0x12340 + 0x5678 = 0x179B8
General-purpose / Specialized 구분
-
Specialized: 프로그램이 명시적으로 쓰지 않아도, CPU가 항상(또는 특정 핵심 동작에서) 내부적으로 참고/갱신하는 필수 아키텍처 상태이고, 쓰기 방법도 제한되어 있다.
-
General-purpose: 이 레지스터들의 내용은 CPU가 기본적으로 신경 쓰지 않는다.
- 프로그램이 명시적으로 피연산자/주소로 지목할 때만 의미가 생기며, 대부분의 ALU/메모리 명령에 자유롭게 사용이 가능하다.
General-purpose Register
AX
연산 결과 또는 입출력의 대상을 저장하는 레지스터
BX
세그먼트와 별개로 특정 주소를 표현해야 할때 그 베이스로 사용되는 레지스터 가장 많이 사용되는 것은 어떠한 배열의 시작 주소로써 응용된다.
BP
Stack 영역 안에서 여러 개의 함수를 호출 할 때 각 함수마다 작업하는 영역이 상이하기에, 그 중심을 잡아줄 주소로써 사용된다.
[BP+6] 두 번째 인자
[BP+4] 첫 번째 인자
[BP+2] 돌아갈 위치(IP)
[BP+0] 이전 함수의 BP
[BP-2] 지역변수1
[BP-4] 지역변수2
CX
코드 내에서 루프 / 반복을 할 때 표준 카운터로 사용되는 레지스터
DX
16비트와 16비트 데이터끼리 곱셈을 진행 했을 경우, 그 결과값은 최대 32비트를 가진다. 따라서 AX와 함께 그 결과값을 저장해주는 레지스터가 필요하며, DX가 일반적으로 해당 역할을 담당한다. 32비트중 DX는 그 상위 16비트에 대한 정보를 갖는다.
또한 I/O와 같은 외부장치의 포트번호를 저장하는 역할도 하고있다.
SP
Stack Segment에서, 현재 스택의 꼭대기를 표시하는 레지스터. 스택에 값이 저장되거나 새로운 함수가 호출되는 등의 과정에서 자동으로 갱신된다.
SI & DI
두 레지스터 모두 주소표현 방식의 Offset 레지스터로서 활용된다.
SI 레지스터의 경우 데이터를 읽거나 참조할 때, DI레지스터의 경우 데이터를 옮기거나 작성할 때 사용된다.
Specialized Register
CS & IP
코드가 존재하는 Segment 레지스터와 Offset 레지스터다.
[CS:IP] 방식으로 주소를 표현하며, 함수를 호출 할 때 기존 IP 레지스터 위치를 스택에 저장하고 IP를 새 위치로 바꿔서 실행한다.
DS
데이터 영역을 표시하는 세그먼트 레지스터다.
SS
스택이 위치한 세그먼트. 스택 연산은 SS를 기준으로 진행한다.
ES
문자열·블록 명령의 목적지 세그먼트로 암시적으로 사용되는 16비트 레지스터다. 원본 DS:SI와 목적지 ES:DI를 동시에 유지하여 세그먼트 교체 없이 대량 데이터 이동·비교를 가능하게 한다.
FR
연산 결과와 CPU 제어 상태를 나타내는 비트들의 묶음으로, 조건 분기, 문자열 순회의 진행 방향,인터럽트 허용 같은 동작을 좌우한다.
- 상태(Status) 플래그
- CF: 무부호 연산의 자리올림/빌림
- PF: 하위 8비트 짝수 패리티이면 1
- AF: BCD 보정용 니블 캐리
- ZF: 결과가 0이면 1
- SF: 결과의 최상위 비트(부호)
- OF: 부호 있는 연산에서 오버플로
- 제어(Control) 플래그
- DF: 문자열 처리 시 SI/DI 진행 방향(0=증가, 1=감소)
- IF: 인터럽트 허용/차단
- TF: 단일 스텝 실행(디버깅)