지난 포스팅에서
어셈블리언어는 CPU가 이해할 수 있는 0과 1로 구성된 기계어에 인간이 보기 쉽게 의미를 부여한 언어라고 하였고,
ISA 는 CPU 가 다룰 수 있는 명령어 종류 셋으로서, CPU에 종속되어있는 일종의 카탈로그라고 하였다.
그렇다면 ISA마다 명령어 종류가 다르다는 것은 ISA마다 어셈블리언어가 다르다고 봐도 무방할 것이다.
ISA는 크게 2가지 종류가 있다.
CISC 와 RISC (리스크 라고 읽는다.)
CISC (Complex Instruction Set Computer) 는 말 그대로 명령어 종류가 복잡하다.
명령어의 종류가 많아 지난 포스팅에 적었듯 그래서 할 수 있는 기능이 RISC에 비해 많다.
각 종류마다 명령어의 크기가 가변적이다. (1byte ~ 15bytes)
그래서 Comlex addressing modes 를 가진다.
x86이 대표적이다.
RISC (Reduced Instruction Set Computer) 는 말 그대로 축약되어서 명령어 종류가 적다.
100개 미만의 명령어 종류가 있고,
각 명령어 사이즈가 4bytes로 고정되어있다.
ARM 이 대표적으로 유명하고, 내가 수업 때 실습하는 SPARC 라는 ISA도 RISC 에 해당한다.
SPARC 도 같은 RISC 유형이다보니 ARM과 많이 유사하다고 한다.
이외에도 MIPS 라는 것도 있는데 얘는 ARM과 뿌리가 같아서 거의 똑같다고 하고,
SPARC는 조금 다른 특징이 있어서 차이점이 있다고 한다.
SPARC Instruction Set
SPARC 라는 ISA 에는 어떤 명령어들이 있는지 종류를 구분해보면 아래와 같이 3종류로 구분된다.
Data Transfer (전송)
-> CPU가 명령을 실행하려면 해당 명령으로 처리할 데이터를 가져와야하고, 처리한 결과를 다시 저장해야한다.
이렇게 데이터를 메모리에서 불러오거나(Load, ld), 저장하거나 (Store, st), 이동하는 (Move, mow) 명령어들은 Data Transfer 타입이다.
Data Process (연산)
-> 가져온 데이터를 명령에 따라 처리할 때 어떻게 처리할지 지시하는 명령어들은 Data Process 타입이다.
데이터를 더하거나 (add), 빼거나 (sub), 논리 연산하는 (and, or) 명령어들이 속한다.
Program Control Flow (제어)
-> 분기, 반복, 함수와 관련된 명령어들 속한 타입이다.
함수를 호출 (call), 분기 (branch, bl, ba) 할 때 사용하는 명령어들이 속해있다.
여기에서 데이터 전송과 관련하여 컴퓨터의 구조를 조금 들여다보자.
메모리에 저장된 각 명령어를 보면 16진수 8자리, 4*8 = 32bit 사이즈의 명령어이다.
컴퓨터는 연산을 하는 CPU 와 연산하는데 필요한 데이터를 저장하고 있는 메모리로 구성되어있다.
이 둘만 있어도 컴퓨터의 기능을 하며 나머지는 다 부수적인 것들 이라고 한다.
CPU는 CU (Control Unit), ALU, LSU, Register 로 구성된다.
레지스터는 Flip-Flop 으로 구성되어 있고, 각 Flip-Flop 은 1비트를 저장할 수 있다.
그래서 n-bit 레지스터는 n개의 Flip-Flop 으로 구성되어 있다.
(그리고 SPARC는 32bit = 4bytes = 1word 이다.)
레지스터는 CPU 안에 있는 저장공간으로 ALU와 회로적으로 연결되어있어 연산이 아주 빠르지만, 용량이 작다.
그래서 CPU 가 처리할 모든 데이터를 레지스터에 저장할 수 없기 때문에, 메모리 (RAM) 을 활용하여 저장한다.
레지스터는 자주 쓰이는 값이나, 연산 중에 나온 임시값을 저장할 때 사용한다.
각 레지스터는 각자 자신의 ID를 가지고 있는데, SPARC 에서만 예외이고, 다른 RISC 에 대해서는 맞다고 한다.
RISC에는 32개 정도의 레지스터가 있고, 각각 레지스터마다 이름과 용도가 정해져 있다.
그 중에 특수한 레지스터가 몇 개 있는데,
PC (Program Counter) 라는 레지스터는 다음 실행될 명령어의 주소를 기억하는 레지스터이고,
IR (Istruction Register) 라는 레지스터는 현재 실행중인 명령어가 저장된 레지스터이다.
=> 클럭마다 명령어를 하나씩 RAM에서 꺼내서 실행하고 (이게 좀 애매함),
현재 실행한 명령어 다음에 어떤 명령어를 실행해야하는지 PC를 이용해서 명령어의 위치를 RAM에서 찾아 가져오는 것으로 이해함.
아마 자세한건 컴퓨터 구조 전공 수업 때 배우지 않을까?
=> 레지스터의 개수가 32개인것과 32bit 사이에 무언가 연관이 있는건지 헷갈려서 찾아봤는데,
32bit 는 하나의 레지스터의 사이즈, 즉, 한번에 처리 가능한 데이터의 크기를 의미하는 것으로
레지스터의 개수가 32개인 것과는 관련이 없는 듯 하다.
<아래는 내가 부수적으로 이해한 것>
RAM은 CPU가 앞으로 처리해야할 명령어 (명령어도 데이터이다.) 와 해당 명령을 처리할 때 필요한 데이터를 갖고 있다.
LSU를 거쳐 레지스트를 거쳐 ALU로 들어와 연산되므로 처리속도는 비교적 느리지만, 용량이 크다.
RAM은 전기가 끊기면 데이터가 날라가는 휘발성 문제가 있어, 이를 해결하기 위해 별도의 비휘발성 저장공간 (HDD, SDD) 을 이용해 프로그램 데이터를 전기 유무와 상관없이 저장한다.
이때 메모리로부터 데이터를 가져오고 저장하는 명령어가 바로 Data Transfer 타입에 속하는 명령어이다.
이번 정리 후기: 어셈블리 문법 배우는 수업인 줄 알았는데, 아직까진 그냥 컴구 기본편 수업듣는 기분이다.
방학때 컴구책 간단하게 본 게 도움이 좀 되는 것 같다.
클럭마다 명령어를 하나씩 가져와서 실행하는 게 맞는지 좀 헷갈린다.
동시에 여러 프로그램 실행을 하는 상황이면 프로그램 Task 를 왔다갔다 나눠서 실행하는 걸로 아는데 그때는 Task 안에 명령어 여러개가 묶여서 프로그램이 명령어 묶음으로 된 단위 단위로 쪼개지는 건지도 궁금하다.
정리하다보니 ISA 는 확실히 뭔지 알 것 같고, 레지스터와 램을 구분한 이유도 알 것 같다.
그러고보니 내가 봤던 컴구 책에서는 레지스터가 비싸서 용량이 작은거라고 했던 거 같은데..
'CS > 어셈블리' 카테고리의 다른 글
[SPARC] 6. Pipelining Hazard (2) | 2023.09.21 |
---|---|
[SPARC] 5. Pipelining Analogy & SPARC Pipeline Stage Example (1) | 2023.09.19 |
[SPARC] 4. Stack Machine, Single Register Machine, Multiple Register Machine (0) | 2023.09.14 |
[SPARC] 3. Computer System Organization (CPU Machine Type) (0) | 2023.09.13 |
[SPARC] 1. Introduction & Computer System Organization (2) | 2023.09.07 |