Machineboy空
명령어의 구조(연산코드, 오퍼랜드)와 주소 지정 방식 본문
저급 언어(명령어)는 어떻게 생겼고 어떻게 동작할까?
사람들의 일반적 명령어 | 컴퓨터의 명령어 |
![]() |
![]() |
![]() |
명령어의 구조
연산 코드 (operation code) | 오퍼랜드(operand) |
수행할 연산 | 수행할 대상 |
*연산 코드의 종류와 생김새는 CPU마다 다르지만 공통적인 4가지![]() |
연산에 사용될 데이터 혹은 연산에 사용될 데이터가 저장된 위치 ( = 주소 필드 ) *훨씬 더 자주 담기는 것은 주소 필드 |
공통적 연산 코드 종류 | ![]() *오퍼랜드는 없을 수도 여러 개일 수도 있다. |
![]() * call: 함수를 호출하는 명령어 ![]() * stack: 한 쪽 끝이 막혀있는 저장 공간, 자료 구조 * queue: 양 쪽 끝이 열려있는 저장 공간, 자료 구조 ![]() ![]() |
|
주소 필드 | |
왜 데이터 값이 아닌 저장된 위치를 사용하는 걸까?![]() ![]() 명령어 내에서 저장할 수 있는 데이터의 크기가 제한되기 때문 (오퍼랜드가 2개라면 하나의 오퍼랜드는 6 bit, 표현할 수 있는 정보의 종류는 64, 오퍼랜드가 4개라면 종류는 16) 하지만 저장된 주소를 적어준다면? (= 메모리 주소, 혹은 레지스터를 명시한다면?) 표현할 수 있는 정보의 크기를 제한받지 않을 수 있다! ![]() |
|
*유효 주소(effective address) 연산에 사용할 데이터가 저장된 위치 예시) 위 그림에서 10번지 |
|
*명령어 주소 지정 방식 (addressing modes) CPU입장에서 주소를 찾아내서 데이터를 가져올 수 있어야 함. 연산에 사용할 데이터가 저장된 위치를 찾는 방법 즉, 유효 주소를 찾는 방법 |
명령어 주소 지정 방식의 종류
- 즉시 주소 지정 방식 (immediate addressing mode)
- 연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시
- 가장 간단한 형태의 주소 지정 방식
- 연산에 사용할 데이터의 크기가 작아지고, 제한될 수 있지만 빠르다
- 직접 주소 지정 방식 (direct addressing mode)
- 오퍼랜드 필드에 유효 주소 직접적으로 명시
- 유효 주소를 표현할 수 있는 크기가 연산 코드만큼 줄어듦
- 간접 주소 지정 방식 (indirect addressing mode)
- 오퍼랜드 필드에 유효 주소의 주소를 명시
- 앞선 주소 지정 방식들에 비해 속도가 느림
- *CPU가 메모리를 뒤적이는 속도는 굉장히 느리다. 메모리 접근을 최소화하는 것이 무조건 속도면에서는 좋다
- 레지스터 주소 지정 방식 (register addressing mode)
- *앞선 방식들은 메모리에 명시하는 방식. 이건 레지스터에 지정하는 방식
- 연산에 사용할 데이터가 저장된 레지스터 명시
- 메모리에 접근하는 속도보다 레지스터에 접근하는 것이 빠르다
- 레지스터 간접 주소 지정 방식 (register indirect addressing mode)
- 연산에 사용할 데이터를 메모리에 저장
- 그 주소를 저장한 레지스터를 오퍼랜드 필드에 명시
메모리 지정 | ||
즉시 주소 지정 방식 | 직접 주소 지정 방식 | 간접 주소 지정 방식 |
![]() |
![]() |
![]() |
레지스터 지정 | |
레지스터 주소 지정 방식 | 레지스터 간접 주소 지정 방식 |
![]() |
![]() |
'Computer > CS' 카테고리의 다른 글
CPU ① ALU와 제어장치 (1) | 2024.01.04 |
---|---|
C 언어 컴파일 과정 : 전처리(preprocess) - 컴파일(compile) - 어셈블(assemble) - 링크(link) (0) | 2024.01.04 |
소스 코드와 명령어 - 저급 언어, 고급 언어 (0) | 2024.01.03 |
컴퓨터가 이해하는 데이터② - 문자 표기 (아스키 코드,EUC-KR에서 utf-8 인코딩까지) (1) | 2024.01.02 |
컴퓨터가 이해하는 데이터① - 숫자 표기 : 2진법(binary), 16진법(hexadecimal) (1) | 2024.01.02 |