实训——RISC-V 汇编语言实践

文章详细介绍了RISC-V架构的指令集,包括整数运算、分支转移、加载存储等指令,并通过实例展示了如何用汇编语言实现赋值、移位运算、条件判断、循环以及子程序调用。同时,文章提供了C语言程序及其对应的汇编代码,帮助读者理解C到汇编的转换过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值