-
메모리 계산
- g = h + A[8]; c코드의 내용을 예시로 들어보자! A는 정수형배열
- 배열안에 있는 요소의 주소 = 0x1000 + 4*i (i는 인덱스번호)
- 0x1000을 base address, 4*i를 offset이라 한다.

-
base address & offset
- lw x5, 32(x3) → 32가 offset, x3이 base register가 된다.
- 32 = 4*8이므로 0x1000(16진수)+32(10진수 → 16진수는 0x20) = 0x1020 즉, A[0+8]을 의미한다.

- li를 0x1020으로 했으면 offset없이 로드가 가능하다.
-
또 다른 예시

**lw a, b → b를 a로 가져옴**
**sw a, b → b에 a를 저장**

-
lw, lh, lb, lhu, lbu (u는 unsigned)
- w, h, b의 차이는 Word(4byte), half-word(2byte), byte 의 차이이다.
- load : 메모리로부터 레지스터로 값을 가져오는 것
- load할때, 만약 2byte면(레지스터는 4byte) extension을 해줘야한다.
- unsigned는 zero extension(앞을 0으로 채우는)해주면되고, signed는 sign extension(sign 비트로 앞을 채우는)해주면 된다.
- load는 i-format이므로 다음과 같이 바꿔준다. offset값이 immediate가 됨

- 문제에서 imm = -123인데 구별방법(명령어에 u가 붙어있지 않기에 signvalue)
- imm 12bit를 보고 최상위비트가 1이면 음수구나! 생각하고 2의 보수 방법 채택 : bit를 다 뒤집고 +1
-
sw, sh, sb
- store : 레지스터로부터 얻은 값을 메모리에 저장하는 것
- store은 메모리에 저장하는 것이므로(메모리는 레지스터처럼 4bit이렇게 정해져있지 않아서 extension과 상관이 없다!)
- store는 s-format형식이기 때문에 다음과 같다!
-
R-format, I-format, S-format 비교

-
32-bit 상수
-
12bit상수까지는 immediate부분이 문제없이 처리했다.
-
하지만 12bit보다 더 큰 상수를 사용할 때가 있을 것이다.
- lui : lui rd, constant → 상수의 하위 20비트를 rd의 [31:12]에 복사하고, rd의 하위 12비트를 0으로 설정한다.
- 예시 (원래 0x123인데 하위 12비트에 0이 추가 된 셈이라 0x123000으로 바뀜)

- 그래서 li x10, 0x12345678(32bit 모두사용하는 상수)을 실행하면
- lui x10, 0x00012345 → 0x12345000
- addi x10,x10,0x00000678
- ⇒ 0x12345000 + 0x00000678
- 이렇게 2줄이 실행된다!
-
lui는 U-format형식이다!

-
lui rd, 0x12345 → rd의 값(imm)에 12~31이 12345가 된다. → rd = 0x12345000
-
Enidanness 엔디언(메모리와 같은 공간에 배열하는 방법) (왼쪽이 주소값이 낮음을 가정)

-
PC Program Counter 프로그램 카운터 (레지스터값이고, x0~x31에 해당하지 않음)
- 현재 명령어의 메모리 주소 값을 가리킨다.
- 4byte형식이다.

-
조건문 conditional operation
- Branch 가지치기를 이용
- 조건을 만족하면 Jump를 통해 바디명령어를 실행함
- 조건을 만족하지 못하면 그냥 순서대로 다음 명령어를 읽음
- beq rs1, rs2, L1 (branch equal)
- bne rs1, rs2, L2 (branch not equal)
- blt rs1, rs2, L3 (branch less than)
- bge rs1, rs2, L4 (branch greater or equal)
- 예시

- 중요한 부분은 beq x0, x0, Exit이다!
- 또다른예시 (반복문)
얘를 최적화하면 다음과 같다.