RISC-V 汇编语言实践,待持续更新
RISC-V 指令集架构
这些指令按照功能可以分为如下几类:
整数运算指令:算术、逻辑、比较等基础运算功能。
分支转移指令:实现条件转移、无条件转移操作
加载存储指令:实现字节、半字(half word)、字(word)、双字(RV64I)的加载,存储操作,采用的都是寄存器相对寻址方式
指令格式
RISC-V有六种基本指令格式:
R 类型指令,用于寄存器-寄存器操作
I 型指令,用于短立即数和访存 load 操作
S 型指令,用于访存 store 操作
B 类型指令,用于条件跳转操作
U 型指令,用于长立即数
J 型指令,用于无条件跳转
实训
赋值语句
移位运算
示例代码
int main() {
long long a=0xffffffffffe54b31 , b=0x0000000000004d0e;
int shift=0x0000000000000004 ;
long long res1, res2, res3;
res1 = a >> shift; //FFFF FFFF FFFE 54B3
res2 = (unsigned long long) a >> shift; //FFF FFFF FFFE 54B3
res3 = b << shift;//4 D0E0
return 0;
}
汇编指令
# (1)a, b, shift 分别存放在寄存器 x28, x29, x30 中
# (2)res1, res2, res3 存放在寄存器 x5, x6, x7 中
sra x5, x28, x30 #算术右移,高位补原来高位
srl x6, x28, x30 #逻辑右移, 高位补零
sll x7, x29, x30 #逻辑左移,低位补零
R/ I 格式
结构控制语句
条件判断
汇编指令和含义
示例C语言程序1
int abs(int value) {
int res;
if (value >= 0)
res = value;
else
res = -value;
return res;
}
对应汇编语句(借助符号)
# value 存储在寄存器 x10 中,res 存储在寄存器 x6 中
blt x10, x0, negative
positive:
addi x6, x10, 0
jal x0, finish
negative:
sub x6, x0, x10
finish:
# ...
nagative 标号表示 sub x6, x0, x10 指令的地址,sub x6, x0, x10 指令为 blt x10, x0, negative 之后的第 3 条指令,由于一条指令的长度为 4 字节,故目标地址偏移量为 3∗4=12,因此,上述 RISC-V 汇编指令段的无标号表达形式为:
blt x10, x0, 12
addi x6, x10, 0
jal x0, 8
sub x6, x0, x10
# ...
示例C语言程序2
int main(){
long long a, b, c;
long long res;
//**************************
if (a + b > c && a < c)
res = c - a;
else
res = c & a;
//***************************
return 0;
}
仅标记部分对应汇编语句(借助符号)
# a, b, c 分别存放在寄存器 x28, x29, x30 中
# res 存放在寄存器 x6 中
add x7, x28, x29
slt x1, x30, x7 #a+b>c
slt x2, x28, x30 #a<c
and x1, x1, x2 #(a + b > c && a < c)是否为0
beq x0, x1, negative #if (0) ,跳转到negative
positive:
sub x6, x30, x28
jal x0, 8
negative:
and x6