본문 바로가기
Computer Science/컴퓨터 구조

[컴퓨터 구조] ep2) 명령어와 주소 지정 방식

by 클레어몬트 2024. 2. 11.

ㅇ고급언어와 저급언어
고급언어: 대부분의 사람을 위한 프로그래밍 언어 e.g. C언어, python, java, ...
저급언어: 컴퓨터가 직접 이해하고 실행할 수 있는 언어
저급 언어는 두 가지로 나누어진다, 바로 기계어어셈블리어

기계어: 진짜 말 그대로 01010101000010
어셈블리어: 이것을 그대로 번역 e.g. push(0101) pop(0101)

번역 예시

 
 
(+ 가독성을 위해 기계어를 이진수가 아닌 십육진수로 표현하기도 한다) 

이진수 기계어
십육진수 기계어 (가독성 up)

 
 
 
ㅇ컴파일 언어와 인터프리터 언어

 
컴파일 언어: 컴파일러로 전체 코드를 한 번에 변환 후 실행 e.g. C언어
인터프리터 언어: 인터프리터로 한 줄 한 줄씩 변환해주며 차례로 실행 e.g. python

 
but 요즈음에는 컴파일 언어와 인터프리터 언어의 경계가 모호해지는 추세다
 
 
번외) C언어의 컴파일 과정

.exe 실행파일이 한번에 생성된다

1. 전처리 과정 (by 전처리기) -> test.i
소스코드, 라이브러리 포함 e.g. #include
매크로 변환 e.g. #define
컴파일 할 영역 명시 e.g. #if, #ifdef, ...
 
2. 컴파일 (by 컴파일러) -> test.s
전처리 완료된 소스코드를 어셈블리어로 변환
 
3. 어셈블 과정 (by 어셈블러) -> test.o / test.obj
어셈블리어를 기계어로 변환(목적코드를 포함하는 목적파일이 된다)
 
4. 링킹 과정 (by 링커) -> test.exe
각기 다른 목적코드를 하나의 실행파일로써 연결시켜주는 작업
 
 
 
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
 
ㅇ명령어(instruction)의 구조

16bit 컴퓨터라 가정했을 때 (현대 컴퓨터는 32bit or 64bit)

 

명령어(instr.) = 연산코드(opcode) + 오퍼랜드
연산코드: 연산을 위한 명령어가 있는 코드, 연산자라고도 한다
오퍼랜드: 연산에 사용할 데이터 / 연산에 사용할 데이터가 저장된 위치, 피연산자라고도 한다 [변수]
(+ 오퍼랜드 필드를 주소 필드라고도 한다)

명령어 예시

 

n-주소 명령어

 
 
연산코드의 종류는 매우 많고 그중에 가장 기본적인 연산 코드 유형을 크게 4가지로 나눌 수 있다
1. 데이터 전송
2. 산술 / 논리 연산
3. 제어 흐름 변경
4. 입출력 제어
(연산코드의 종류 + 생김새는 CPU마다 다르다)
 
 
[명령어 사이즈 단위]
word → line(block) → page → book
 
 
 
 
 
ㅇ주소 지정 방식: 유효주소(EA)를 찾는 방법
여기서 유효주소(Effective Address)란? 연산에 사용할 데이터 위치(= 오퍼랜드)를 뜻한다
 
현대 CPU에는 5가지 주소 지정 방식이 있다(+ 2가지)
지금부터 7가지 주소 지정 방식에 대해 알아볼 건데 알고리즘을 위해 알아야 할 것들이 있다
A: 주소 필드
(A): A주소의 내용
R: register 주소
EA: 유효주소(오퍼랜드의 주소) 
 
 
1. 즉시 주소 지정 방식: Operand = A

오퍼랜드 필드에 명시하는 값: 연산에 사용할 데이터
(가장 간단하고 빠르다)
 
 
 
2. 직접 주소 지정 방식: EA = A

오퍼랜드 필드에 명시하는 값: EA
 
 
 
3. 간접 주소 지정 방식: EA = (A)

오퍼랜드 필드에 명시하는 값: EA의 주소
(두 번의 메모리 접근이 필요하기 때문에 느리다)
 
 
 
4. 레지스터 주소 지정 방식: EA = R

오퍼랜드 필드에 명시하는 값: EA(레지스터 이름)
★CPU가 외부의 메모리로 접근하는 것보다 내부의 레지스터로 접근하는 게 더 빠르다★
 
 
 
5. 레지스터 간접 주소 지정 방식: EA = (R)

오퍼랜드 필드에 명시하는 값: EA를 저장한 레지스터
 
 
 
 
 
 
 
※여기서부터는 레지스터에 대한 지식이 필요하므로 다음 챕터에서 자세히 다뤄보자
6. 변위: EA = A + (R)
오퍼랜드 필드값과 특정 레지스터의 값을 더해서 유효주소를 얻어내는 방식
다음 챕터에서 자세하게 살펴보자
 
 
 
7. 스택: EA = top of stack
스택과 스택 포인터를 이용한 방식
역시 다음 챕터에서 자세하게 살펴보자
 
 
 
 
 
 
 
 
 
 
 

참고 및 출처: 컴퓨터시스템구조론(William Stallings), 혼공컴운(강민철), Operating Systems: Internals and Design Principles(William Stalling), Operating System Concepts(Silberschatz, Abraham)