소스코드와 명령어
고급 언어와 저급 언어
고급 언어
•
사람을 위한 언어
저급 언어
•
컴퓨터가 이해하고 실행할 수 있는 언어
기계어
어셈블리어
컴파일 언어와 인터프리터 언어
컴파일 언어
•
컴파일: 저급 언어로 변환하는 과정
•
소스 코드 → 컴파일 → 목적 코드 (Object Code)
인터프리터 언어
•
한 줄씩 실행됨
•
컴파일언어와 달리 오류 만나기 전까지는 정상 실행
경계선
C, C++은 컴파일언어다. 하지만 그 외의 언어는 양 쪽을 다 사용. Python도 일부 컴파일 되면 Java는 인터프리트도 동시에 수행
목적 파일과 실행 파일
•
목적 파일: 목적 코드로 이루어진 파일
•
실행 파일: 실행 코드로 이루어진 파일 (.exe)
•
목적 코드가 실행되기 위해선 링킹이 필요하다
◦
ex) Import …
•
링킹을 거치고 나면 하나의 실행파일이 됨
명령어 구조
•
명령어 = 연산자 + 피연산자
◦
연산자 = 연산 코드 = operation code
◦
피연산자 = operand = 연산에 사용할 데이터, 혹은 데이터가 저장된 위치
오퍼랜드
1.
연산에 사용할 데이터
a.
숫자, 문자 등을 나타내는 데이터
2.
연산에 사용할 데이터가 저장된 위치 (주로 !!)
a.
메모리나 레지스터 주소
→ 그래서 주소 필드라고도 부른다
•
오퍼랜드가 N 개인 명령어
◦
N=0) 0-주소 명령어
◦
N=1) 1-주소 명령어
◦
N=2) 2-주소 명령어
◦
N=3) 3-주소 명령어
연산 코드
연산의 종류
1.
데이터 전송
2.
산술 및 논리 연산
3.
제어 흐름 변경
4.
입출력 제어
데이터 전송
MOVE: 데이터를 옮겨라
STORE: 메모리에 저장하라
LOAD(FETCH): 메모리에서 CPU로 데이터를 가져와라
PUSH: 스택에 데이터를 저장하라
POP: 스택의 최상단 데이터를 가져와라
산술 논리
ADD SUBTRACT MULTIPLY DIVIDE: 덧셈 뺄셈 곱셈 나눗셈
INCREMENT DECREMENT 오퍼랜드에 +1, -1
AND OR NOT: AND OR NOT 연산을 수행하라
COMPARE 두 개의 숫자 또는 TRUE FALSE 값 비교하라
제어 흐름 변경
JUMP: 특정 주소로 실행 순서를 옮겨라
CONDITIONAL JUMP: 조건에 부합할 때 특정 주소로 실행 순서를 옮겨라
HALT: 프로그램의 실행을 멈춰라
CALL: 되돌아올 주소를 저장한 채 특정 주소로 실행 순서를 옮겨라
RETURN: CALL을 호출할 때 저장했던 주소로 돌아가라
입출력 제어
READ(INPUT): 특정 입출력 장치로부터 데이터를 읽어라
WRITE(OUTPUT): 특정 입출력 장치로 데이터를 써라
START IO: 입출력 장치를 시작하라
TEST IO: 입출력 장치의 상태를 확인하라
주소 지정 방식
Q. 왜 오퍼랜드 필드에 메모리나 레지스터의 주소를 담을까? <연산 코드, 연산 코드에 사용될 데이터> 형식으로 명령어를 구성하면 안 될까?
A. 가능은 하지만 피연산자가 많아지면 오러랜드에 할당할 비트 수가 적어진다. 표현할 가지 수가 적어지니, 값 대신 주소를 저장하는 것.
•
오퍼랜드 필드에 데이터가 저장된 위치를 명시
•
이 때 데이터의 위치를 찾는 방법 = 주소 지정 방식 (Addressing Mode)
유효 주소
연산에 사용할 데이터가 저장된 위치
즉시 주소 지정 방식
Immediate Addressing Mode
•
연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시
•
표현할 수 있는 데이터의 크기는 작아짐
•
연산에 사용할 데이터를 메모리나 레지스터로부터 찾을 필요가 없어서 빠름
직접 주소 지정 방식
Direct Addressing Mode
•
오퍼랜드 필드에 유효 주소를 직접적으로 명시하는 방식
•
아까보단 나은데 여전히 연산코드 때문에 표현할 수 있는 주소의 범위가 적다
간접 주소 지정 방식
Indirect Addressing Mode
•
표현 범위가 최대로 늘어남
•
두 번의 메모리 접근이 필요해서 느리다
레지스터 주소 지정 방식
Register Addressing Mode
•
직접 주소 지정 방식과 비슷하게
•
CPU 외부에 있는 메모리가 아니라 내부의 레지스터에 접근하는 게 더 빠르다
•
직접 주소 지정 방식과 비슷한 문제 공유
레지스터 간접 주소 지정 방식
Register Indirect Addressing Mode
•
연산에 사용 할 데이터를 메모리에 저장 → 해당 유효 주소를 저장한 레지스터를 오퍼랜드 필드에 명시
•
메모리 접근이 한 번으로 줄어서, 간접 주소 지정 방식보다 빠르다
정리하면, XX 주소 지정 방식