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