Instructions: Language of the Computer - 1
-
프로그래밍 언어의 레벨
- High-level code
- 우리가 실제로 코딩하는 언어 c, c++, python 생산성, 휴대성 굿!
- compiler에 의해 어셈블리어로 변환
- Assembly code
- 기계 코드의 사람이 읽을 수 있는 표현
- assembler에 의해 머신 코드로 변환
- Machine code
-
명령어 모음
- 사칙연산, 논리 연산, 메모리로부터 로드, 메모리에 저장, 점프/가지치기, 예외처리, Floating point
-
RISC-V ISA
- 기본 명령어에 대한 이해, 어셈블리어로 표현된 코드, machine code의 이진수 표현
- 명령어셋은 open ISA에 의해 UC버클리에서 개발됨
- RISC-V시뮬레이터
- Spike, RARS 시뮬레이터 등등이 있다.
-
레지스터 : CPU 내부의 작고 빠른 저장소
-
메모리 : 프로그램 데이터의 main 저장소
- 레지스터에 전체 데이터를 담을 수 없다.
- 메인 메모리에 있는 데이터를 산술연산하려면
- 불러오기 : 메모리 → 레지스터
- 계산 : source 레지스터 → destination 레지스터
- 저장 : 레지스터 → 메모리
- 메모리는 단위가 1Byte (8bit) → 각 주소가 1바이트
-
레지스터vs메모리
- 레지스터는 메모리보다 훨씬 빠름
- 메모리 내의 데이터를 직접 계산할 수 없다! (로드 - 계산 - 저장~~)
-
레지스터의 최적화
- 좋은 컴파일러는 메모리 접근을 최소화 해야한다.
- 레지스터만 사용하여 작업할수 있다면 메모리 접근을 피할수있다.
- 데이터크기가 레지스터보다 큰 경우 컴파일러는 레지스터에 자주 액세스하는 데이터의 우선순위를 정하고 덜 자주 액세스하는 데이터를 메모리에 저장해야 한다.
-
RISC-V 레지스터 사용처

- x0 : 상수 0을 의미 → 0을 사용할 일이 있으면 무조건 x0가 사용됌(값을 덮어쓰기 불가능)
- x1 ~ x32 : 32bit value → 각자 목적에 맞게 사용됌
- t0~t6 는 임시변수에 사용됌
- s1~s11은 선언된 변수에 사용됌
- 질문! 연산에 레지스터를 계속 사용하다보면, 레지스터가 부족해지지 않을까요?
- ㄴㄴ, 사용하지 않는 레지스터를 재사용하면 됌!
- 그럼에도 다 사용하는 경우엔 메모리에 몇몇 레지스터 값을 저장해야함
-
Unsigned / Signed value
- Unsigned : 양수만 존재함 → 0번째 0~2^n-1까지 표현가능(뒤에서 부터 0번째임)
- Signed : n개의 비트 → 0~~~n-1까지 bit가 있다고 했을때, 최상위 bit의 값이 0이면 양수, 1이면 음수
-
RISC-V의 명령어(어셈블리어)
-
산술 연산(덧셈, 뺄셈)
- add, sub : 총 3개의 피연산자가 있다. a,b,c
- add a, b, c → b+c를 더해서 a에 저장해라 ! sub도 마찬가지 (b-c ⇒ a)
- 예시

- g + h → t0에 저장하고, i + j → t1에 저장해라 그리고 t0 - t1 → f에 저장해라!
- addi : add immediate 상수를 더할 때 사용한다.
- x0의 활용처
-
Load 연산
-
곱셈 연산 Multiply
-
나눗셈 연산 Division
-
논리 연산
-
Machine code