2.2(2) RISC-V ISA

dev_bbie ·2022년 10월 19일
0

컴퓨터구조

목록 보기
7/9

6 basic types of instructions

명령어 구성도 아주.. 다채롭게 하신다.


[아래 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에 있는 값을 저장


1. R-type (ALU)

  • 3개 operands (2 src + 1 rd)
  • sub a, b, c (b에서 c를 뺀 값을 -> a로)
  • sll rd, rs1, rs2 (rs1의 값을 rs2에 있는 값만큼 왼쪽으로 shift시키겠다 = n칸 이동(X2^n같은뜻)) -> 산술, 논리
  • srl vs sra 비교 (/2^n같은뜻)
    (sra경우는 산술! MSB 값이 shift시 그래도 이동
    (산술 경우엔 shift후 싹다 0으로 채워~ 즉, srl의 경우엔 /2^n이 안통할수도-> 특히 음수에서)
  • slt x1, x5, x3 (x5에 있는 값 < x3에 있는 값이면,, x1에 true인 1값을 넣어!)

[ALU]
* 산술(add, sub) logic(and, or, xor), slt, shift(sll, srl, sra)

  • GPR[rd] <- GPR[rs1] + GPR[rs2]
  • PC <- PC + 4 (32bit -> 즉 4byte씩 증가)
  • 명령어,,, 16진수로 나타내는 법(ppt 27) : 아.. 이거.. 그림을 외워야 할거 같다... -> 교수님이 opcode를 제시해준다는게 뭔말인지 이제 이해했다
    -> 이거 따로 손으로 해보자
[ 해야할 것 ]
- ALU 명령어 16진수로 표현(R-type 명령어) 직접 손으로 해보기
- shift 명령어 결과값 구하기 연습 
- compare(slt) 얘도!

Constant or Immediate Operands

  • 자주 사용되는 상수는 직접 연산이 낫다!!
  • Immediate 값이라,,, 자 그럼 얘가 메모리에 담기는 영역은?? -> I-Type으로 ㄱㄱ

2. I-type (ALU, Load)

[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/#

Memory Operand (Load)

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으로 나타내는거 해보기!

3. S-type (Store)

  • sw x14, 8(x12)
    얘는
    sw rs2, imm(rs1)
    즉,, destination register(rd)가 없다.
    명령어 구조가 ,, 그래서 7bit(imm) + 5bit(imm) = 12bit(얘로 상대주소), R-type이랑 비슷하게 생겼는데 암튼,,, 그 rd 자리에 5bit이 들어간다.(뭔말인가 하면,, 그림을 보면됨)

[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 과정이해하기

4. SB-type (Branch)

  • beq rs1, rs2, Label (rs1이랑 rs2에 들어간 값 equal이면 Label(target)으로 가라
  • PC(Program Counter)값을 변경해준다.

★ 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

  • imm[0] 항상 0이다 -> encoded 되지 않음
  • immediate filed = 13bits
p78~82 예제 직접 해보기!


참말이지... 이거... 나는 어셈블리어로 바꾸고 나발이고 익숙하질 않다.. 걍 눈에 담자... ㅇ ㅏ 그렇 구 ㄴ ㅏ ~~

5. U-type (LUI)

  • I-type은 imm값 12bit만 제공
  • 더 큰 수로 하고 싶어!
  • how do we deal with 32-bit immediate

    lui x10, 0x87654
    //얘가.... 0x87654000(32bit내에서 앞쪽으로 위치하게 해둠(더 큰값을 만들기위한??)
    addi x10, x10, 0x321
    //얘는,,, 원래 알다시피 0x00000321이렇게
    그럼 x10에 들어있는 값은 => 0x87654321
    (아니 진심 이걸 어따 써먹음?하..)

    • 근데 주의해야할 것! (sign-extended 되면서... 막 숫자 겹쳐가지고 저렇게 이쁘게 제대로 안더해질때 있음 -> assembler가 알아서 해준대...(lui x10, 여기겹치는 값을 하나 더 더해주고 시작하나봄)

6. UJ-type (Jump & Link)

★ 왜 Link냐?
:기존에 돌고 있던 함수에서 Jump하면서 다시 그 함수 위치를 "레지스터"에 저장 하겠다.
-> 앞에서 배운 x1레지스터에는 항상 return address를 담아두는 곳으로 약속해놓음

  • PC(Program Counter)값을 변경해준다.
  • 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)로 이동해라

profile
필요한 개발공부

0개의 댓글