명령어 구성도 아주.. 다채롭게 하신다.
[아래 3가지 ★을 이해하기 위한 정리이다]
* 레지스터 값에는 주소값이 있을수도, 상수가 있을 수도!
★ add x30, x30, x10 //(R) x30에 x30에 저장된 값 + x10에 저장된 값
★ ld x30, 0(x30) //(R) x30이 가리키는 Mem[base+0]에 x30의 값을 로드
★ sd x30, 0(x31) //(S) x31이 가리키는 Mem[base+0]에 x30에 있는 값을 저장
[ALU]
* 산술(add, sub) logic(and, or, xor), slt, shift(sll, srl, sra)
- GPR[rd] <- GPR[rs1] + GPR[rs2]
- PC <- PC + 4 (32bit -> 즉 4byte씩 증가)
[ 해야할 것 ]
- ALU 명령어 16진수로 표현(R-type 명령어) 직접 손으로 해보기
- shift 명령어 결과값 구하기 연습
- compare(slt) 얘도!
[ALU]
* addi,subi, slti, andi, ori, xori, slli, srli, srai
GPR[rd] <- GPR[rs1] + sign-extend(imm)
PC <- PC+4
그림에서 보면, (R-type비교시) func7+rs2 => imm(12bit)
[반드시 나올것]
- C <-> 어셈블리어 로... 바꾸는 연습(p44,45)
RISC-V code 공부할때 유용한 사이트
https://www.cs.cornell.edu/courses/cs3410/2019sp/riscv/interpreter/#
ld : 메모리 -> 레지스터
-- 예시
ld x2, 16(x3)
offset = 16
메모리의 시작주소가 x3에 저장되어 있다.
기준 주소 + offset 의 위치의 값을 가져온다
아직,, I-Type 하고 있다...핳..
[Load]
*ld, lw, lwu, lh, lhu, lb, lbu
GPR[rd] <- Mem[bye_address]
PC <- PC+4
//byte_address는 offset(12bit) + GPR[base]
ppt 51 참고해서
예시) lw x14, 8(x2) -> I-Type으로 나타내는거 해보기!
[Store]
* sd, sw, sh, sb
Mem[byte_address] <- GPR[rs2]
PC <- PC+4
ppt p54 참고해서
예시) sw x14, 8(x2) -> S-Type 으로 나타내는 거 해보기!
p55~58 예제 -> 직접 해보기
- SWAP : C -> 어셈블리어 (이 과정 잘 이해해야한다!)
간단히 이해.(swap시)
레지스터에 메모리값 2개 로드 -> ld 2개
swap하고자 하는 변수가 들어있는 메모리에 레지스터값에 로드된 값 저장-> sd 2개
★ SWAP 과정이해하기
★ Immplication of Immediate filed size
- Conditional branch : 13bits
- Unconditional branch : 21bits
★ New PC <- register + branch offset
* Label은 determined by imm(13)
★PC-relative addressing
- label로 안 가 -> PC=PC+4(그냥 다음 instruction실행)
- label로 가 -> PC = PC + (immediate*4)
[Branch]
* beq, bne, blt, bge, bltu, bgeu
• Target = PC + sign-extended (imm13)
• If GPR(rs1) = GPR (rs2) then PC <- target
else PC <- PC+4
* Can specify ± 2^11 addresses from the PC by 12-bit wide immediate field
* Immediate is # of instructions to move either forward (+) or backwards (–)
* Instructions are “word-aligned” (32-bit wide):
* Address is always a multiple of 4 (in bytes)
Let immediate specify #words instead of #bytes
Instead of specifying ± 2^11 bytes from the PC, we will now specify ± 2^11 words = ± 2^13 byte addresses around PC
p78~82 예제 직접 해보기!
참말이지... 이거... 나는 어셈블리어로 바꾸고 나발이고 익숙하질 않다.. 걍 눈에 담자... ㅇ ㅏ 그렇 구 ㄴ ㅏ ~~
lui x10, 0x87654
//얘가.... 0x87654000(32bit내에서 앞쪽으로 위치하게 해둠(더 큰값을 만들기위한??)
addi x10, x10, 0x321
//얘는,,, 원래 알다시피 0x00000321이렇게
그럼 x10에 들어있는 값은 => 0x87654321
(아니 진심 이걸 어따 써먹음?하..)
- 근데 주의해야할 것! (sign-extended 되면서... 막 숫자 겹쳐가지고 저렇게 이쁘게 제대로 안더해질때 있음 -> assembler가 알아서 해준대...(lui x10, 여기겹치는 값을 하나 더 더해주고 시작하나봄)
★ 왜 Link냐?
:기존에 돌고 있던 함수에서 Jump하면서 다시 그 함수 위치를 "레지스터"에 저장 하겠다.
-> 앞에서 배운 x1레지스터에는 항상 return address를 담아두는 곳으로 약속해놓음
- jal rd, imm21 (imm[0], implicitly)
[Jump & Link]
- Target = PC+imm(21bit)
- GPR(rd) <- PC+4(return address) , PC <- Target
//////참고로... I-type으로 jalr rd, rs1(base), imm(12)
rd에는 PC+4를 저장하고, PC=rs+imm(12)로 이동해라