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