8086 프로세서
2025. 3. 25. 20:34ㆍ어셈블리 프로그래밍
프로그래밍 절차

- 고급 언어 프로그램: 사용자 중심 언어, 작성하기 쉬움.
- 어셈블리 언어: 명령어와 레지스터 활용하여 마이크로 동작에 용이함.
- 기계어: 프로세스 내에서 실행.
compile: 고급 언어→어셈블리 언어
link: 기계어 모듈+라이브러리 집합! 실행 코드 생성
코드 비교!
고급언어
A=A+10어셈블리
MOV AX,A ADD AX,10 MOV A,AX
-어셈블리언어 같은 경우에는 프로세서 내부에 데이터를 임시로 저장하는 레지스터에 변수 A를 가져옴!
-AX레지스터에 저장해 준고 10을 더해준 뒤 MOV 명령어로 다시 메모리 변수 A에 저장해 준다!
- 또한 어셈블리 프로그램은 프로세서의 특징, 명령어 구성 요소를 미리 알아야 한다. (고급언어는 그럴 필요 없음!)
- 그렇기 때문에 A프로세서의 어셈블리 프로그램은 B프로세서에서 작동할 수 있도록 변환해 준다.
- 고급언어와 어셈블리 언어의 특징은 다음과 같다.
| 고급 언어 | -프로세서 종류 상관(X) -문법이 비교적 간단함 -디버깅이 용이함 -컴파일 성능에 따라 프로그램의 성능이 결정됨 |
| 어셈블리 언어 | -동일한 프로세서에서만 실행가능 -프로세서에 대한 사전 지식 필요 -메모리, 레지스터등의 구성 요소를 직접 다룰 수 있음 -컴퓨터 성능에 최적인 코드 작성 가능 |
프로세서 구성
- 8,16,32,64 비트 프로세서가 꾸준히 개발되고 있음
- 8086 프로세서 이후의 프로세서들은 서로 호완성을 가지게 되었고 이를 8086 계열 프로세서라고 부름.
- 최근 32비트 프로세서인 펜티엄 프로세서는 하드웨어 성능과 내부 구조가 많이 개선되었고, 8086의 확장 버전이기에 어셈블리 프로그램을 8086으로 작성해도 펜티엄 프로세서에서 사용가능!
| 프로세서 | exp |
| 8086 (16bit) | -20 비트 주소 버스 사용 -메모리를 세그먼트 단위로 구분 |
| 8088 (16bit) | -8086과 비슷함 -외부 데이터버스 폭을 16비트에서 8비트로 전환(호환성과 비용절감) |
| 80286 (16bit) | -멀티테스킹과 가상메모리 지원 |
| 80386DX (32bit) | -32비트 데이터 집합을 처리하는 최초 8086계열 프로세서 |
| 80486DX (32bit) | -캐시메모리와 수치 연산 보조 프로세서를 내장하여 속도 상승 |
| Pentium1 (32bit) | -파이프라인을 2개, 명령어와 데이터 케시를 별도로 지원 |
| Pentium2 (32bit) | -멀티미디어 기능 확장 |
| Pentium3 (32bit) | -스트리밍 확장 명령어 집합 추가 -미디어 처리와 3D 그래픽 속도 향상 |
8086 프로세서 내부 구조
- 데이터 전송을 위한 주소 핀: 20개
- 데이터 핀: 16개
- 20비트의 주소를 발생시키기 때문에 1 대략 1MB까지 지정가능함.

- 8086 프로세서는 크게 2개의 부분으로 나누어짐.
실행 장치
-모든 명령어를 해석하고 실행
-범용 레지스터, 상태 레지스터, 산술 논리 장치, EU제어 시스템을 구성됨
버스 인터페이스 장치
-외부 장치들과 데이터를 전송을 위한 주소 생성
-데이터를 받아서 레지스터에 저장
8086 프로세서의 레지스터
- 레지스터는 다음과 같은 종류가 존재함.
산술 논리 연산을 위해 데이터를 임시로 저장하는 데이터 레지스터
명령어를 읽거나 데이터를 전송을 위한 주소를 저장하는 저장하는 주소 레지스터
프로세서의 상태 정보를 저장하는 상태 레지스터
- 14개의 16비트 레지스터가 존재!
| AH | AL | Accumulator |
| BH | BL | Base |
| CH | CL | Count |
| DH | DL | Data |
| SP | Stack Pointer | |
| BP | Base Pointer | |
| SI | Source Index | |
| DI | Destination Index | |
| IP | Instruction Pointer | |
| FLAG | FLAG | Status Flag |
| CS | Code Segment | |
| DS | Data Segment | |
| SS | Stack Segment | |
| ES | Exra Segment | |
- AX, BX, CX, DX와 같은 레지스터는 데이터를 임시로 저장하는 레지스터.
| AX | -데이터 전송 -곱셈, 나눗셈 연산 -입출력 명령 |
| BX | -데이터 저장 -연산에서 주소 레지스터로 활용 |
| CX | -루프 카운터 문자열 계산 -CL은 이동과 회전 명령에서 이동, 회전하는 비트 수 저장 |
| DX | -곱셈, 나눗셈 연산 -I/O 동작 |
- SP, BP, SI, DI 레지스터는 데이터 변수나 스택 접근시 필요한 주소를 저장하기 위해 사용하는 포인터, 인덱스 레지스터. 데이터 변수나 스텍을 접근하지 않을 때는 데이터를 임시로 저장하는 데이터 레지스터로 활용가능.
- CS, DS, SS, ES는 세그 먼트 레지스터로 데이터, 스텍 세그먼트의 번호를 저장.
- IP는 명령어 코드의 옵셋 주소를 저장.
- Flag 레지스터는 명령어를 실행한 후에 프로세서의 상태를 나타냄. (반복문에서는 종료여부를 판단)
메모리 세그먼트
- 20비트 주소 버스로 1MB의 주소를 지정가능 하기에 주소를 레지스터에 저장하고 버스 인터페이스 장치를 통해 주소 버스가 만들어짐.
- 하지만 8086 프로세서는 16비트 레지스터를 가지기 때문에 2개의 레지스터를 사용함.
- 이를 위해 메모리를 세그먼트로 구분함.
- 세그먼트 내의 옵셋 주소는 1개의 레지스터에 저장하기 위해서 64KB 크기로 생성함. (인접 세그먼트와 주소를 최대한 많이 공유)
- 인덱스, 포인터 레지스터를 활용하여서 20비트 주소를 저장함. 즉 세그먼트*16+옵셋 주소로 만들어짐.

- 어셈블리 프로그램은 명령어 코드, 데이터 영역, 스택 영역으로 구분됨.
명령어 코드: 프로세서가 수행해야 하는 명령어의 집합
데이터 영역: 프로그램에 사용하는 데이터가 정의
스택: 함수나 프러시저를 호출 전후에 보존해야 하는 레지스터를 임시로 저장
- 각 프로그램은 프로그램 코드, 메모리 영역, 스택 영역으로 구분하여 3개의 세그먼트에 저장
코드 세그먼트: 명령어 코드를 저장
데이터 세그먼트: 프로그램에 사용하는 변수 저장
스택 세그먼트: 레지스터나 변수를 임시로 저장하기 위한 스택 공간으로 사용
- 데이터가 64KB 이상인 경우를 대비하여 Extra Segment를 제공함.
- 세그먼트에서 사용하는 레지스터와 옵셋 레지스터를 다음과 같이 볼 수 있음.
| 세그먼트 종류 | 세그먼트 레지스터 | 옵셋 세그먼트 |
| CODE 세그먼트 | CS | IP |
| DATA 세그먼트 | DS | SI |
| STACK 세그먼트 | SS | SP |
| EXTRA 세그먼트 | ES | DI |
정수의 표현
- 부호 없는 정수와 부호 있는 정수로 나누어짐.(unsigned, signed)
- 부호 있는 정수를 최상단 비트가 0이면 양수 1이면 음수로 나타낸다.
2의 보수로 음수 구하기
10 = 0000 1010(2)
10의 1의 보수 = 1111 0101(2)
10의 2의 보수 = 1111 0110(2)
0000 1010 + 1111 0110 = 0
문자의 표현
- 어셈블리 프로그램에서 0~9(30H~39H), 대문자 A-Z(41H-5AH), 소문자 a-z(61H~7AH)이다.
- 새로운 줄 이동은 CR(0DH)(케리지 리턴), LF(0AH)(라인피드)를 활용하여서 출력을 한다.
'어셈블리 프로그래밍' 카테고리의 다른 글
| 조건문 구조(2) (0) | 2025.05.22 |
|---|---|
| 조건문 구조 (0) | 2025.05.22 |
| 플래그 래지스터&디버거 (0) | 2025.04.27 |
| 문자 입출력 (0) | 2025.04.13 |
| 8086 어셈블리 언어 (0) | 2025.04.04 |