LEGv8 을 기반으로 작성
Instruction

- Operation, Operands로 구성된다.
- Instruction은 Memory에 위치한다.
- ISA에서 규정된 다양한 Operation이 존재한다.
- Instruction은 binary형태로 메모리에 저장되어있다.
- RISC의 철학인 단순한 규칙을 가지고 있어 동작이 단순하다.
Example
code:
f = (g+h) - (i+j)
compiled:
add t0, g, h
add t1, i, j
sub f, t0, t1
동작에 대한 큰 그림
- 메모리는 Data Path와 분명히 분리 되어있다.
- Register는 Data Path 내부에 있다.
- 프로그램은 메모리에 저장된다.
- Control Unit은 메모리에서 instruction을 fetch하여 가져온다.
- Control Unit은 Data Path가 해야할 일을 전달한다.
- Data는 Register에서 Memory, Memory에서 Register로 이동 가능하다. (Load(LDUR), Store(STUR))
- 모든 Data의 처리는 Data Path에서 이루어진다.
레지스터
- LEGv8은 32 * 64bit 만큼 레지스터를 가지고 있다.
- Word는 32bit 인데 반해, doubleword형식의 공간만큼 할당되어 있다. (부동 소수점과 같은 상황을 위해) (주소 표시, word: W, doubleword: X)
- RISC의 철학인 "작을수록 빠르다"가 적용되어 32개의 Register를 가지고 있다.
공간할당 (아키텍처마다 다름)
X0-X7: 함수 인자, 결과
X8-X15: 임시 레지스터로, 임시 값을 저장
X16-X17: 함수 호출 시 사용하는 특별한 레지스터로, 인터프로시저 호출에서 사용. (임시 레지스터로도 활용 가능)
X18: 플랫폼 레지스터로 특정 용도로 예약되어 있을 수 있음. (임시 가능)
X19-X30: 보존되는 레지스터로, 함수 호출 후에도 값을 유지해야 하는 데이터가 저장. (X28, X29, X30은 stack pointer, frame pointer, link register(return address)
X31: 제로 레지스터 또는 스택 포인터로 사용되며, 항상 0
(RISC 철학인, 자주 사용되는 변수에 대한 재사용으로 최적화)
예시
f = (g+h) - (i+j) # f, ...,j in X19, ...,X23
compiled LEGv8:
ADD X9, X20, X21
ADD X10, X22, X23
SUB X19, X9, X10
Memory
- Memory는 복잡한 데이터 구조를 사용한다. (Arrays, structures, dynamic data)
- Memory에는 Instruction과 Data가 저장된다.
- Data는 Register에서 Memory로 Store, Load를 통해 불러와지고, 쓰여진다.
예시
A[12] = h + A[8]; # h in X21, A in X22
Compiled LEGv8:
LDUR X9, [X22, #64]
ADD X9, X21, X9
STUD X9, [X22, #96]