
- 컴퓨터가 이해하고 실행하기 편하게 만들어진 언어이다.
- 구분
i) 기계어- 0과 1로 이루어진 명령어로 구성된 저급 언어이다. - 예: 0101 0101ii) 어셈블리어
- 0과 1로 이루어진 기계어를 읽기 편한 형태로 번역한 저급 언어이다. - 예: push rbp
- 개발자가 읽고 쓰기 편하게 만들어진 언어이다.
- 컴퓨터 내부에서 실행될 때는 저급 언어로 변환되어야 한다.
- 구분
i) 컴파일 언어- 컴파일 언어로 작성된 소스 코드는 컴파일러에 의해 저급 언어로 변환횐다. - 이 변환 과정을 컴파일이라고 하며, 변환 결과로 만들어진 저급 언어 코드를 목적 코드라고 한다. - 소스 코드 컴파일 중 오류가 발생하면 소스 코드 전체가 실행되지 않는다.ii) 인터프리트 언어
- 소스 코드가 인터프리터에 의해 한 줄씩 저급 언어로 변환되어 실행된다. - 소스 코드 인터프리트 중 오류가 발생하면 오류 발생 전까지의 코드는 실행된다.
i) 전처리기 (Preprocessor)
- 전처리 과정: 컴파일하기 전에 #include, #define, #if 등을 처리한다. - 예: test.c -> 전처리기 -> test.iii) 컴파일러 (Compiler)
- 컴파일 과정: 전처리된 소스 코드를 저급 언어인 어셈블리 언어로 변환한다. - 예: test.i -> 컴파일러 -> test.siii) 어셈블러 (Assembler)
- 어셈블 과정: 어셈블리 언어를 기계어로 변환하여 목적 코드 (Object File)를 포함한 목적 파일로 만든다. - 목적 파일: 목적 파일은 링킹 (Linking)을 거쳐야만 실행 파일로 된다. - 예: test.s -> 어셈블러 -> test.oiv) 링커 (Linker)
- 링킹 과정: 여러 목적 파일을 하나의 실행 파일로 묶어주는 작업이다. - 예: test.o -> 어셈블러 -> test.exe
- 명령어는 Operand와 Operation Code로구성된다.
- 연산에 사용될 데이터 혹은 연산에 사용될 데이터가 저장되는 위치이다.
- 주소 필드: 연산에 사용될 데이터가 저장되는 위치가 연산에 사용될 데이터보다 훨씬 자주 저장되므로 Operand를 주소 필드라고도 한다.
- 명령어에는 Operand의 개수가 0일 수도, 1 이상일 수도 있다.
- 명령어가 수행할 연산이다.
- 연산 코드가 담고 있는 내용
i) 데이터 전송 코드- MOVE: 어떤 Register에서 다른 Register로 데이터를 옮겨라. - STORE: 메모리에 데이터를 저장하라. - LOAD (FETCH): 메모리에서 CPU로 데이터를 가져와라. - PUSH: 스택에 데이터를 저장하라. - POP: 스택 최상단 데이터를 가져와라.ii) 산술/논리 연산 코드
- ADD / SUBTRACT / MULTIPLY / DIVIDE: 덧셈 / 뺄셈 / 곱셈 / 나눗셈을 수행하라. - INCREMENT / DECREMENT: Operand에 1을 더하라. / Operand에 1을 빼라. - AND / OR / NOT: AND / OR / NOT 연산을 수행하라. - COMPARE: 두 개의 숫자 또는 TRUE / FALSE 값을 비교하라.iii) 제어 흐름 변경 코드
- JUMP: 특정 주소로 실행 순서를 옮겨라. - CONDITIONAL JUMP: 조건에 부합할 때 특정 주소로 실행 순서를 옮겨라. - HALT: 프로세스의 실행을 멈춰라. - CALL: 되돌아올 주소를 저장한 채 특정 주소로 실행 순서를 옮겨라. - RETURN: CALL 호출 시 저장됐던 주소로 돌아가라.iv) 입출력 제어
- READ (INPUT): 특정 입출력 장치로부터 데이터를 읽어라. - WRITE (OUTPUT): 특정 입출력 장치로 데이터를 써라. - START IO: 입출력 장치를 시작하라. - TEST IO: 입출력 장치의 상태를 확인하라.
- 연산에 사용할 데이터가 저장되는 위치
유효 주소를 찾는 방법- 종류
i) 즉시 주소 지정 방식 (Immediate Addressing Mode)- 연산에 사용될 데이터를 Operand 필드에 직접 명시하는 방식 - 가장 간단한 형태의 주소 지정 방식이다. - 연산에 사용할 데이터의 크기가 작아질 수 있지만 연산에 사용될 데이터를 찾기 위해 Memory나 Register를 거치지 않기 때문에 CPU의 속도는 빠르다.ii) 직접 주소 지정 방식 (Direct Addressing Mode)
- Operand 필드에 유효 주소를 직접 명시하는 방식 - 유효 주소를 표현할 수 있는 크기가 Operation Code만큼 줄어든다.iii) 간접 주소 지정 방식 (Indirect Addressing Mode)
- Operand 필드에 유효 주소의 주소를 명시하는 방식 - 앞선 주소 지정 방식들에 비해 CPU의 속도가 느리다.
- 연산에 사용할 데이터가 저장된 Register를 명시하는 방식
- CPU가 Memory에 접근하는 속도보다 Register에 접근하는 속도가 더 높다.