프로그래밍 언어
- 컴퓨터에게 명령을 내리기 위해 설계된 언어
- 표현하는 방식에 따라 고급 프로그래밍 언어, 저급 프로그래밍 언어로 나뉨
고급 프로그래밍 언어
- 문법이 인간의 언어 체계와 유사하여 프로그램 작성하기가 용이 (사람이 이해하기 쉬운 언어의 형태)
- 컴파일러나 인터프리터에 의해 기계어로 번역되어 실행됨
- 인터프리터: 고급 언어로 작성된 원시코드 명령어들을 한번에 한 줄씩 읽어들여서 실행하는 프로그램
- 대표적인 고급 언어: 포트란, 파스칼, 코볼, C, 자바 등
기계어
- 컴퓨터가 직접 해독할 수 있는 2진 숫자로 표현한 언어
- 컴퓨터 명령 형식은 기계어이며, 컴퓨터는 이 기계 명령어를 해독하여 동작을 수행함
- 기계어의 명령 단위는 어떤 동작을 지시하는 명령 코드부와 동작의 대상이 되는 데이터가 어디에 있는지를 지시하는 주소부로 나누어짐
- 기계어는 프로그램 작성이 어렵고, 많은 노력과 시간이 필요함
- 컴파일러를 통해 기계어로 변환하면 2진수인 1과 0의 조합으로 구성된 비트 형태로 표시할 수 있음
- 기계어는 특정한 언어가 아니고, 단지 CPU 제조사에서 CPU를 제조할 때 해당 CPU에서 사용하는 명령어 집합을 제공하는데, 이를 기계어라고 부름
- 기계어는 CPU를 직접 제어함
- 기계어는 배우기가 매우 힘들고 생산성도 매우 낮음
어셈블리어
- 기계어 프로그래밍의 비효율성을 극복하기 위하여 기계어의 비트 형식을 연상 코드(Mnemonic code, 상징 기호)로 나타낸 것
- 어셈블리어는 기계어를 사람이 사용하는 언어에 가깝게 문자로 기호화해서 나타냄
- 기계어와 마찬가지로 CPU 형태에 따라 내용이 모두 다르므로 어셈블리어로 작성한 프로그램들도 한 종류의 CPU에서만 동작하고 다른 종류에서는 실행되지 않음
어셈블리어의 장점
- 어셈블리어로 작성한 프로그램은 처리 속도가 매우 빨라 속도가 중요하거나 고급 언어에서 지원되지 않는 기능을 사용하는 경우에는 어셈블리어를 사용함
어셈블리어의 단점
- 고급 언어에 비하면 생산서잉 매우 떨어지는 단점 (프로그램 작성이 매우 힘듦)
- 90년대부터 사용 빈도는 고급 언어들에 밀려 거의 없음
- 최신 CPU에 대한 최적화가 힘듦 (차라리 C언어 사용이 유리)
- 어셈블리어 학습은 C언어의 포인터 개념을 이해하고 CPU 구조를 이해한 후 학습해야 함
어셈블러
- 어셈블리어를 번역하여 오브젝트 코드를 생성하는 프로그램
- 어셈블리 과정은 컴파일 과정보다 빨리 수행되는데, 어셈블리어가 기계어 체계와 유사하기 때문
- 어셈블러 명령어
- ADD, SUB, MUL, DIV: 사칙연산
- MOV: 데이터 이동
- LOAD: 기억장치로부터 데이터 적재
- STOR: 기억장치로 데이터 저장
- 명령어의 종류: 산술 및 논리연산 명령, 자료 이동 및 분기명령(제어), 입출력 명령 등
8086 어셈블리어의 명령 형식
DOSTART: ADD X ;X와 가산기를 더하고 그 결과를 가산기에 저장
레이블 부 / 연산 부 / 오퍼랜드 부 / 주석문 부
레이블(Label) 부
- JUMP, LOOP와 같은 특정 주소로 옮기는 명령이나 반복 명령어에서 해당 레이블로 프로그램 카운터를 이동시킬 때 사용
- 일반적인 명령어에서는 생략됨
- 레이블을 생성할 때는 8문자 이내의 영문자/숫자를 사용하며, 이름 중에 공백이 있으면 안됨
- 예약 명령어는 사용할 수 없음
연산(Operation) 부 = Op-code
- 명령의 니모닉 및 어셈블러 디렉티브 등을 쓰는 곳
- 니모닉: 어셈블리 언어에서 예약되어 있는 명령어
- 디렉티브: 프로그램 실행과 관계없이 어셈블러에게 정보를 제공해주는 지시어
- 연산부는 컴퓨터에게 해야 할 일을 알려주는 명령어나 지시어가 위치하는 곳
오퍼랜드(Operand) 부, 피 연산자부
- 레지스터 이름, 정수, 라벨, 주소 등을 쓰는 곳
- 숫자 진수 표현은 숫자 바로 뒤에 B, O, D, H로 표시
- 문자 생략 시 10진수
- 문자열 사용 시 큰 따옴표로 둘러쌈
주석문(Command) 부
- 해당 프로그램 줄에 대한 설명을 표기하는 곳
- 주석문은 세미콜론으로 시작하며, 어셈블러는 주석문 부를 모두 무시하기 때문에 아무데나 사용하여도 됨
- 불필요하게 사용할 필요 없음
어셈블리 프로그램의 실행
- 어셈블리 프로그램의 실행 과정을 이해하면, 컴퓨터의 명령어가 수행되는 과정을 이해 가능하게 됨
- 레이블과 주석문은 사용되지 않고, 피연산자는 모두 기억장치 주소라고 가정하고, 편의상 각 명령어의 주소와 기계어를 10진수로 나타냄
- 기억장치 250번지에 있는 데이터를 누산기에 적재
- 기억장치 251번지의 데이터와 누산기의 데이터를 덧셈 수행하고 결과를 다시 누산기에 저장
- 기억장치 251번지에 그 결과를 저장
- 프로그램의 주소 170번지로 점프
주소 |
명령어 |
기계 코드 |
100 |
LOAD 250 |
1250 |
101 |
ADD 251 |
5251 |
102 |
STOR 251 |
2251 |
103 |
JUMP 170 |
8170 |
주기억장치, CPU 레지스터, ALU의 동작 과정
- 100번지의 첫 번째 명령어 LOAD 250은 기억장치 100번지에서 기계 코드(1250)이 인출되어 명령어 레지스터에 저장
- 이 명령어가 해독되어 기억장치 250번지의 데이터가 누산기로 이동하게 됨
- 프로그램 카운터가 다음 명령어를 수행하기 위해서 하나 증가
LOAD 명령어의 동작
- 100번지 명령어의 동작 (100번지 : 1250 : LOAD 250)
- 명령어 인출 단계: CPU 레지스터의 IR에 1250
- 명령어 실행 단계: 누산기에 250번지의 데이터 적재
ADD 명령어의 동작
- 101번지 : 5251 : ADD 251
- PC에 저장되어 있는 데이터 값에 의해서 두 번째 명령어가 기억장치 101번지에서 인출되어 IR에 저장됨
- ALU에서 누산기의 내용과 251번지의 내용을 더하고, 결과를 다시 누산기에 저장
- 그 다음 PC의 내용은 다음 명령어를 위해 102로 증가하게 됨
STOR 명령어의 동작
- 102번지 : 2251 : STOR 251
- PC에 의해서 세 번째 명령어가 102번지로부터 인출되어 IR에 저장되고 해독됨
- 명령어 내용에 따라서 AC의 내용이 기억장치 251번지에 저장됨
- 그 다음 PC의 내용은 103으로 증가하게 됨
JUMP 명령어의 동작
- 103번지 : 8170 : JUMP 170
- 네 번째 명령어가 103번지에서 인출되어 IR에 저장된 후 명령어가 해독됨
- 분기될 목적지 주소, 즉 IR의 하위 부분(170)이 PC로 적재됨
- 다음 명령어 인출 사이클에서는 170번지의 명령어가 인출되고 실행됨
명령어 사이클
- Instruction Cycle
- 프로그램 실행 과정에서 LOAD 명령어는 1단계에서 명령어 인출을 수행하고 2단계에서는 명령어 실행을 함
- ADD, STORE, JUMP 명령어도 인출 단계와 실행 단계로 구분되어 수행됨
- 명령어는 두 단계를 하나의 사이클로 수행하고 이를 명령어 사이클이라 함
- 명령어 사이클을 구성하는 명령어 인출 단계는 인출 사이클(fetch cycle)이라고 하며, 명령어 실행 단계는 실행 사이클(execution cycle)이라고 함
- 명령어 사이클의 동작 과정: 두 개의 부사이클인 인출 사이클과 실행 사이클이 계속적으로 반복됨
프로그램 실행의 계층 구조
- 인출 사이클과 실행 사이클 동작은 여러 개의 단계들로 구성되어 있음
- 각 단계에서 실제 수행되는 동작을 마이크로 연산이라 하는데 이는 명령어를 실행하기 위한 가장 기본 단위의 프로그램 수행
- 명령어들은 명령어 사이클의 집합으로 구성됨
- 명령어의 사이클에는 두 개의 명령어 부 사이클(인출, 실행)이 존재
- 각 부 사이클의 수행도 여러 단계로 구분되며 이 구분이 마이크로 연산임
마이크로 연산
- Micro-Operation
- 마이크로 연산은 한 개의 클록 펄스 동안 실행되는 기본 동작
- 모든 마이크로 연산은 CPU의 클록 펄스에 맞춰 실행됨
- 마이크로 연산의 순서를 결정하기 위해서 제어장치가 발생하는 신호를 제어신호라고 함
- 마이크로 연산은 명령어 실행 과정에서 한 단계씩 이루어지는 동작으로, 한 개의 명령어는 여러 개의 마이크로 연산이 동작되어 실행됨
명령어 인출 사이클
- Fetch Cycle
- 인출 사이클은 CPU가 기억장치에서 명령어를 읽어오는 단계
- 프로그램 카운터는 다음에 인출할 명령어의 주소를 가지고 있음
- CPU는 PC가 가리키는 기억장소에서 명령어를 인출하고 PC 내용을 증가시킴
- 인출된 명령어는 IR에 적재되고 CPU는 이를 해석하고, 요구된 동작을 수행함
명령어 실행 사이클
- Execution Cycle
- 명령어를 실제적으로 실행하는 단계
- 실행 동작의 분류
- CPU와 기억장치 간에 데이터가 전송됨
- CPU와 입출력 모듈 간에 데이터가 전송됨
- 데이터에 대하여 지정된 산술 혹은 논리 연산이 수행됨
- 제어동작으로 점프와 같이 실행될 명령어의 순서가 변경될 때 사용됨