컴퓨터구조/RISC-V

RISC-V 의 명령어들 속에 R-format

woo0doo 2022. 12. 27. 20:35

RISC-V의 명령어

오늘은 RISC-V의 많은 형태중 R-format , 즉 R의 형태를 띈 예시를 알아 볼 예정이다.

우선 R-format의 명령어들의 종류는

ADD

ex) add x5, x6, x7  //  x5 = x6 + x7

 

SUB

ex) sub x5, x6 ,x7 // x5 = x6 - x7

 

SLL - Shift left logical

ex) sll x5, x6, x7 // x5 = x6 << x7

 

SLT - Set less than

ex) slt x5, x6, x7 // x5 = x6<x7 ? 1 : 0

 

SLTU - Set less than unsigned

ex) slt x5, x6, x7 // x5 = x6<x7 ? 1 : 0

 

XOR

ex) xor x5, x6, x7 // x5=x6 ^ x7

 

SRL - Shift right logical

ex) srl x5, x6, x7 // x5 = x6 >> x7

 

SRA - Shift right anthmetic

ex) srl x5, x6, x7 // x5 = x6 >> x7

 

OR

ex) or x5, x6, x7 // x5 = x6 | x7

 

AND

ex) and x5, x6, x7 // x5 = x6 & x7

 

등이 있다.

이게 왜 R-format 인지 궁금한 사람들이 있을 것이다.

다음에 소개할 I-format과 비교하면서 얘기할 예정이다. 우선은 이런 종류가 있다는 것만 알아두면 좋을 것 같다.

 

레지스터

Register x0 -> 무조건 값이 0이고, 바꾸려해도 바뀌지 않음

Register x5-x7, x28-x31 -> 중간 계산에 사용하는 레지스터

Register x8-x9, x18-x27 -> local 변수 즉 지역변수 저장

 

우선 register는 당장 필요한 정도로만 알고 R-format의 예시를 보면

 

 

-C code-
f = (g+h) - (i+j);


 -----------------------------

 f...j를 x19...x23레지스터에 있다고 가정 (saved register)
f=x19, g=x20, h=x21, i=x22, j=x23 
 -assembly로 변환
add x5,x20,x21
add x6,x22,x23      //중간 계산을 위해 임시 레지스터(x5,x6) 사용
sub x19,x5,x6

중간 계산을 위해 temporary 레지스터를 사용하고 local변수는 saved 레지스터에 저장했다.

이처럼 레지스터는 각각의 용도가 정해져있다.

 

STOP!!!!!!!!

c code


f=(g-h)-(i+j)

어셈블리어로 변환해보시오!
정답은 맨 아래에..

R-format의 구조

위의 예시로 보면 rd= x18, rs1= x19, rs2=x20으로 구성되어 저런 형태로 명령어 인코딩이 이루어진다.

funct7,funct3,opcode 는 레지스터와 관계없이 add와 관련된 숫자이다.

명령어에 따라 opcode나 function의 값이 달라진다.

이는 추후에 I-Format과 함께 소개하겠다.

우선은 add는 opcode가 0110011로 이루어져있고 function은 모두 0인 값으로 저 숫자에는 크게 의미를 안가졌으면 한다.

continue..      

 

 

 

정답

c code
f=(g-h)-(i+j)

---------------------------------------------------
f...j를 x19...x23레지스터에 있다고 가정 (saved register)
f=x19, g=x20, h=x21, i=x22, j=x23 

sub x5,x20,x21
add x6,x22,x23      //중간 계산을 위해 임시 레지스터(x5,x6) 사용
sub x19,x5,x6