저급언어는 명령어들로 이루어져있다는데 명렁어는 어떻게 생겼을까?
명령어의 구조
무엇을 대상으로, 무엇을 수행하라
명령어는 연산코드와 오퍼랜드로 구성되어있다.
1. 연산 코드(Opcode) = 연산자
명령어가 수행할 동작 또는 연산을 담고 있다. CPU는 이 연산 코드를 해석하여 명령어가 어떤 동작을 수행해야 하는지 이해한다.
연산코드의 종류 및 생김새(고유한 이진패턴)는 CPU마다 다르다.
주요 연산 코드의 종류를 알아보자
01 데이터 전송(Data Transfer)
MOVE : 데이터를 한 위치에서 다른 위치로 복사하거나 이동한다. 일반적으로 레지스터 간의 데이터 이동 또는 메모리에서 레지스터로 데이터 이동에 사용된다.
STORE : 메모리를 저장한다. 레지스터에 있는 데이터를 메모리 주소에 저장할때 사용된다.
LOAD(또는 FETCH) : 메모리에서 데이터를 CPU레지스터로 가져온다. 메모리 주소에서 데이터를 읽어와 레지스터에 로드하는 데 사용된다.
PUSH : 스택 자료구조에 데이터를 저장한다. 주로 함수 호출 및 호출 스택 관리에 사용된다.
POP : 스택에서 최상단의 데이터를 가져온다. 주로 스택에서 데이터를 꺼내는 데 사용된다.
02 산술/논리 연산(Arithmetic/Logical Operations)
ADD / SUBTRACT / MULTPLY / DIVIDE : 숫자 연산을 수행한다. 예를 들어 레지스터에 있는 값을 다른 레지스터와 더하거나 뺄 때 사용된다.
INCREMENT / DECREMENT : 오퍼렌드에 1을 더하거나 빼는 연산을 수행한다.
AND / OR / NOT : 비트 수준에서 논리 연산을 수행한다.
COMPARE : 두 숫자 또는 조건을 비교하여 결과를 설정한다. 조건 분기 명령어와 함께 사용되어 조건부 분기를 수행하는데 중요하다.
03 제어 흐름 변경(Control Flow)
JUMP : 특정 주소로 실행 순서를 변경한다.
COMDITIONAL JUMP : 조건에 따라 특정 주소로 실행 순서를 변경한다. 조건을 검사하고 조건이 참일 때만 분기한다.
HALT : 프로그램의 실행을 멈춘다. 종료 명령으로 사용된다.
CALL : 특정 함수 또는 서브루틴을 호출하기 전에 되돌아올 주소를 저장하고 해당 주소로 분기한다. 함수 호출과 반환을 지원한다.
RETURN : CALL 명령으로 저장한 주소로 돌오가 함수 호출을 완료한다.
04 입출력 제어(Input/Ouput Control)
READ (INPUT) : 특정 입출력 장치로부터 데이터를 읽어 온다. 키보드, 마우스, 센서 등의 입력 장치와 상호 작용할 때 사용된다.
WRITE(OUTPUT) : 특정 입출력 장치로 데이터를 출력한다. 화면, 프린터, 스피커 등의 출력 장치와 상호 작용할 때 사용된다.
START IO : 입출력 장치의 동작을 시작한다. 장치와의 통신을 초기화하고 데이터 전송을 시작하는데 사용된다.
TEST IO : 입출력 장치의 상태를 확인하고 대기 또는 완료 여부를 검사한다.
2. 오퍼랜드(Operand) = 피연산자
연산에 사용될 데이터 혹은 연산에 사용될 데이터가 저장된 위치가 저장된다.
연산에 사용될 데이터가 저장된 위치가 훨씬 더 자주 저장하게 된다. 오퍼랜드가 담기는 그 공간 즉 오퍼랜드 필드를 주소 필드라고 부르기도 한다.
오퍼랜드 필드(Operand Field)
오퍼랜드를 저장하거나 지정하는 부분이다. 명렁어가 실행될 때, 오퍼랜드 필드에 지정된 값 또는 위치가 오퍼랜드로 사용된다. 오퍼랜드에는 데이터 값(직접적인 데이터 값 또는 리터럴 상수가 오퍼랜드 필드), 메모리 주소(메모리에서 데이터를 읽거나 쓸 때 해당 데이터의 메모리 주소), 레지스터(레지스터에 저장되는 경우 해당 레지스터의 이)와 같은 정보가 들어갈 수 있다.
어셈블리어나 기계어 같은 저급 언어들은 전부 다 명령어로 이루어져있다. 그러므로 연산 코드와 오퍼랜드로 이루어져있음을 알 수 있다.
mov eax, 0 // 오퍼랜드가 두 개인 경우 (2 주소 명령어)
pop rbp // 오퍼랜드가 한 개인 경우 (1 - 주소 명령어)
ret // 오퍼랜드가 없는 경우 (0 - 주소 명령어)
연산에 사용될 데이터를 그냥 적으면 더 심플하고 보기 좋을 텐데 왜 굳이 저장된 위치를 적는갈까?
명령어 내에서표현할 수 있는 데이터의 크기가 제한되어있다. 만약 오퍼랜드가 2개이면 2⁶ 오퍼랜드가 3개이면 2⁴이 된다.
직접 데이터를 넣는 경우 오퍼랜드가 2개인 경우 예
주소를 넣는 경우 오퍼랜드가 2개인 경우 예
주소를 넣는 경우 더 많은 데이터를 표현할 수 있다는 것을 확인할 수 있다.
유효 주소(effective address)
명령어 주소 지정방식을 통해 계산된 연산에 사용할 데이터의 실제 저장위치를 나타내는 주소이다.
명령어 주소 지정 방식(addressing modes)
오퍼랜드 필드에 데이터가 저장된 위치를 명시할 때 연산에 데이터 위치를 찾는 방법이다. 다시 말해 주소 지정방식은 유효 주소를 찾는 것이다.
CPU는 다양한 주소 지정방식을 사용한다.
01 즉시 주소 지정 방식(immediate addressing mode)
연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시한다. 가장 간단한 형태의 주소 지정 방식이다. 보통 간단한 연산 및 상수 값 처리에 사용된다.
장점 : 데이터가 명령어에 직접 포함되므로 데이터 위치를 찾는 별도의 주소 계산과정이 필요하지 않으므로 간단하고 빠르다.
단점 : 데이터의 크기가 제한적이므로 모든 데이터를 직접 명령어에 포함할 수 없다.
02 직접 주소 지정 방식(direct addressing mode)
오퍼랜드 필드에 유효 주소 직접적으로 명시한다. 이 주소를 통해 연산에 필요한 데이터 위치를 찾는다.
장점 : 데이터의 위치를 정확하게 지정하므로 데이터 액세스에 대한 속도가 빠르다. 메모리 위치를 계산하는 추가 오버헤드가 없이 빠른 실행이 가능하다.
단점 : 연산 코드의 크기에 따라 유효주소를 표현할 수 있는 크기가 제한된다.
03 간접 주소 지정 방식(indirect addressing mode)
오퍼랜드 필드에 유효 주소의 주소를 명시함으로써 데이터의 유효 주소를 찾는 주소 지정방식이다. 직접 주소지정 방식보다 표현할 수 있는 유효 주소의 범위가 넓어졌다.
장점 : 데이터 위치의 동적 변경을 처리하기에 유용하다. 데이터의 주소가 변경되어도 포인터만 업데이트 하면된다.
단점 : 두 번의 메모리 액세스가 필요하므로 성능 면에서 저하된다. CPU가 메모리를 찾을 때는 시간이 굉장히 오래 걸린다.
앞선 주소지정 방식들에 비해서 조금 느릴 수 있다.
04 레지스터 주소 지정 방식(register addressing mode)
명령어 내에서 데이터를 저장하는 레지스터를 직접 명시한다. 이는 데이터가 레지스터에 저장되어 있음을 나타내며 해당 레지스터에 데이터를 직접 읽거나 쓸 수 있다.
장점 : 레지스터에 접근하는 것은 메모리에 접근하는 것보다 훨씬 빠르다. 이로인해 연산의 속도를 높이고 프로그램 실행을 최적화하는데 도움이 된다.
단점 : 레지스터는 고정된 크기와 수용 능력을 가지므로 큰 데이터 구조를 저장하기에는 부적합 할 수 있다.
05 레지스터 간접 주소 지정 방식(register indirect addressing mode)
데이터 자체가 메모리에 저장되어 있고 해당 데이터의 주소를 레지스터에 저장한다. 이 레지스터는 주소를 참조하기 위해 사용된다. 이 방식을 사용하면 데이터의 위치를 변경하지 않고도 레지스터 값만 업데이트하여 다른 데이터를 참조할 수 있다.
장점 : 데이터 위치를 레지스터에 저장하므로 데이터위치를 동적으로 변경할 수 있다. 이는 데이터의 주소를 업데이트하고 다른 데이터를 참조하는데 유용하다.
단점 : 데이터를 참조할 떄 메모리에서 레지스터로 데이터 주소를 가져와야 하므로 추가적인 메모리 엑세스가 필요하다. 이로 인해 성능면에서 손실이 발생할 수 있다.
정리
연산에 사용할 데이터를 찾는 방법을 주소지정 방식이라고 한다. 연산에 사용할 데이터가 저장된 위치를 유효주소라고 한다.
각가의 방식이 오퍼랜드 필드에 명시하는 값 정리
즉시 주소 지정 방식 : 연산에 사용할 데이터
직접 주소 지정 방식 : 유효 주소
간접 주소 지정 방식 : 유효 주소의 주소
레지스터 주소 지정 방식 : 유효 주소(레지스터 이름)
레지스터 간접 주소 지정 방식 : 유효 주소를 저장한 레지스터
참고 : 본 내용은개발자를 위한 컴퓨터공학 1: 혼자 공부하는 컴퓨터구조 + 운영체제강의를 수강하여 작성하였습니다.
'책 > 혼공 컴퓨터구조+운영체제' 카테고리의 다른 글
컴퓨터 구조 - ALU,플래그,제어장치 (0) | 2023.11.18 |
---|---|
컴퓨터 구조 - C언어 컴파일 과정(전처리, 컴파일, 어셈블러,링커) +) 목적파일, 실행파일 (0) | 2023.11.12 |
컴퓨터 구조 - 고급언어(컴파일언어,인터프리터언어)와 저급언어(기계어, 어셈블리어) (0) | 2023.11.02 |
컴퓨터 구조 - 정보단위(비트,바이트,워드,이진수,십육진수) (0) | 2023.10.21 |
컴퓨터구조 - 컴퓨터구조의 큰 그림(CPU, 메모리,보조기억장치,입출력장치) (0) | 2023.10.18 |
댓글