RV32汇编基础

Risc-V的汇编指令

32位的RV称为RV32,64位为RV64

寄存器

RV中有32个寄存器,容量只有128B,x0~x31,其中x0始终保持0值,只读。

add x1,x2,x3 #其中第一个寄存器是存储结果,表示x1=x2+x3
sub x1,x1,x3 #x1=x1-x3
addi x3,x4,10 #包含立即数的加法,没有立即数减法指令,使用负数实现

其中高级语言中的连续加减会被分解为几条汇编语言

寄存器数据传输速度很快,而访问存储空间传输速度慢

但寄存器存储空间小,只有128B,而DRAM有GB以上的容量

存储空间

32位的字是由4个Byte组成的,RV存储系统中是以Byte为单位寻址,每一个字地址可以拆分到4个字节地址。

小端系统中(低字节存放在低地址上),字地址与最低位字节地址相同。

Load Word指令lw:将数据从存储器装载到寄存器

Store Word指令sw:将数据从寄存器保存到存储器

lw x10,12(x15)#将x15指向的地址加上偏移量12B的数据取出,存到x10中
sw x10,40(x15)#将x10存到地址(x15)+偏移40B的地方去

lbsb对单个字节进行存储访问操作,取得的数据会经过符号扩展,即将字节最高位复制到所有字的高比特位(8-31)。

lbu,无符号扩展,全0填充

分支转移指令

条件判断分支转移/无条件转移指令

beq register1,register2,L1
bne register1,register2,L1#不相等跳转
blt reg1,reg2,label#less than 小于跳转指令
bltu reg1,reg2,label#无符号小于跳转指令
bge reg1,reg2,label#大于等于跳转指令
j label#无条件跳转指令

可以组成各种高级语言循环语句

逻辑运算指令
and x1,x2,x3#按位与
andi x1,x2,3#与立即数按位与
slli x11,x12,2#逻辑左移(立即数)
srl#逻辑右移
sra#算数右移

常用语掩码操作,分离字节数据

RV中没有逻辑非指令,通过与全1进行xor异或可以实现非

算数移位逻辑移位区别:算数移位的空位由最高位扩展填充。

伪指令
mv rd,rs#等价于addi rd,rs,0
li rd,13#=addi rd,x0,13
函数调用与跳转

RV的每个指令都是以32位机器码存储在程序空间中

PC寄存器:程序计数器,存放下一条待执行的程序

一般情况下指令顺序执行,更新的PC+4

a0-a7,即x10-x17寄存器,用来向调用函数传递参数,a0,a1寄存器常常用于传递返回值

ra,即x1寄存器,用来保存返回时的地址值

s0-s11,对应编号x8-x9和x18-x27的寄存器用来作为保存寄存器,保存原来进程中的关键数据避免在函数调用过程中被破坏,也用于保存函数中的值。

jr指令,用于函数返回。

jr ra#jump &return ra记录返回地址 

ret指令可以只待jr ra

jal指令,相比j而言,jump&link可以自动保存返回地址至ra

addi ra,x0,1016
j sum
##以上代码等价于
jal sum
栈的使用

栈LIFO也是存储系统的一部分,需要一个指向它的寄存器来保存它的基地址。

sp(栈指针寄存器)

sp的值在分配栈空间时减小

栈是按照一定结构组织在一起的,栈中的内容分为许多帧(frame),为栈帧,在内存中为连续块状存储空间

caller:发起调用的函数

callee:被调用的函数

函数调用时的保留寄存器:sp,gop,tp,s0-s11,callee一般不会使用,即便使用也会提前保存好原值

**函数调用不保留寄存器:**可能会被调用函数更改的寄存器,有参数与返回值寄存器a0-a7,返回地址寄存器ra,临时寄存器t0-t6。需要调用函数在调用前对用到的寄存器值进行保存,需要进行压栈弹栈保存。

静态区:保存程序中只声明一次的全局变量

堆区:使用malloc函数申请的动态存储空间

栈区:程序中发生函数调用时用于保存寄存器值的存储空间

RV32中,栈区从0xbfff_fff0开始向低地址扩展,向下存放,以每16B为界进行对齐

堆区位于静态数据的上方,向高地址扩展。

RV32中的程序段从0x0001_1000到0x1000_0000向上存放

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: rv32-toolchain是一个特定的工具链,用于开发和编译RISC-V 32位架构的代码。RISC-V是一个开放的指令集架构,rv32表示该架构下的32位版本。 rv32-toolchain提供了一系列工具,用于将开发者编写的代码转换为可在RISC-V 32位系统上运行的机器码。这个工具链包含了编译器、汇编器、链接器和调试器等工具,使得开发者可以方便地编译、连接和调试他们的代码。 编译器是rv32-toolchain中最重要的组件之一。它将开发者编写的高级语言代码(如C语言)翻译成RISC-V指令集所能理解的低级机器码。汇编器则将汇编语言代码转换成机器码。链接器将多个编译后的目标文件链接在一起,生成最终的可执行文件。 除了编译、汇编和链接代码外,rv32-toolchain还提供了调试功能。调试器可以帮助开发者查找和修复代码中的错误。开发者可以在代码中设置断点,以便在特定位置停止,并逐步跟踪代码执行过程,帮助他们理解代码的运行情况。 总的来说,rv32-toolchain是一个专门为RISC-V 32位架构开发的工具链,它提供了一系列工具,用于编译、汇编、链接和调试代码。使用rv32-toolchain,开发者可以方便地开发和调试RISC-V 32位架构下的应用程序。 ### 回答2: rv32-toolchain是为RISC-V架构设计的工具链。RISC-V是一种基于精简指令集计算机(RISC)原则的新型处理器架构。rv32-toolchain由一系列的编译器、汇编器、链接器和调试器等工具组成,在RISC-V系统的软件开发中起到核心作用。 rv32-toolchain的主要功能是将高级语言(如C、C++等)编写的程序转化为RISC-V架构可执行的机器代码。首先,编译器负责将源代码编译成中间代码,然后由汇编器将中间代码翻译成汇编语言,再由链接器将多个汇编文件进行连接,最终生成可执行文件。同时,rv32-toolchain还提供调试器,用于调试程序的执行过程,帮助开发人员查找和修复错误。 使用rv32-toolchain,开发人员可以方便地进行RISC-V架构的软件开发。这个工具链具有跨平台的特性,可以在不同的操作系统上运行。开发人员可以通过在命令行中输入相关的编译、汇编和链接命令来使用rv32-toolchain完成代码的构建和生成。 rv32-toolchain的存在使得开发人员能够更加简单地进行RISC-V架构的软件开发工作,提高了开发效率。同时,由于rv32-toolchain是开源的,开发人员还可以根据自己的需求进行定制和修改,从而满足特定的开发需求。 总之,rv32-toolchain是专门为RISC-V架构设计的工具链,通过提供编译器、汇编器、链接器和调试器等一系列工具,方便开发人员进行RISC-V架构的软件开发工作,提高开发效率。同时,rv32-toolchain的跨平台特性和开源性也使其具有更高的灵活性和扩展性。 ### 回答3: rv32-toolchain是一个为RISC-V架构开发的工具链。它包含了一系列工具和编译器,用于将高级语言编写的程序转换成RISC-V指令集所支持的机器码。 工具链的核心组成部分是编译器,它负责将高级语言源代码翻译成汇编语言代码。rv32-toolchain使用的编译器通常是GCC或Clang,它们针对RISC-V架构进行了调整和优化,以获得更好的性能和兼容性。 此外,rv32-toolchain还包括了汇编器和链接器。汇编器将汇编语言代码转换为机器码指令,而链接器则将多个目标文件合并为一个可执行文件。这样,开发人员可以将编写好的代码进行编译、汇编和链接,生成可在RISC-V架构上运行的程序。 除了编译器和相关的工具,rv32-toolchain还提供了一些辅助工具,如调试器和性能分析器。调试器可以帮助开发人员在程序执行过程中进行断点调试和变量查看,以便更好地理解程序的执行情况。性能分析器则可以帮助开发人员评估程序的性能,并进行优化。 总的来说,rv32-toolchain是一个为RISC-V架构开发的全套工具链,它使得开发人员能够方便地编写、编译和调试RISC-V架构的程序,为RISC-V生态系统的进一步发展做出了重要贡献。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值