IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> RISC-V学习-第一篇[指令类型] -> 正文阅读

[嵌入式]RISC-V学习-第一篇[指令类型]

本文是RVSC-V处理器学习的第一篇文章,对RV32IMAFDC指令集的学习笔记。

1. 运算指令

立即数运算指令

addi rd,rs1,imm[11:0]

功能

1.将rs1与12位立即数(进行符号位扩展)相加,并将结果存到rd寄存器中去,如果结果溢出,舍弃溢出位,不做处理,保留低32位结果
2.addi rd,rs1,0指将rs1寄存器中的值存入rd中去

为什么没有立即数减法操作?
因为addi运算是带符号位进行运算的,可以用addi rd,rs1,-10实现rd=rs1-10功能

寄存器运算指令

add rd,rs1,rs2
sub rd,rs1,rs2

功能

1.将rs1与rs2相加,并将结果存到rd寄存器中去,如果结果溢出,舍弃溢出位,不做处理,保留低32位结果,sub指令类似

x0特殊寄存器

通过硬件方式,x0寄存器固定为0,为只读寄存器

add x3,x4,x0

功能

1.将x4赋值给x3

rv32有32个寄存器,从x0到x31
zero:x0

2. 访问存储指令

在这里插入图片描述

  • 首先明确一下,在RV32中1字(word)=4(bytes)=32(bit),内存是以字节为单位,一个字的内存由4字节组成。
  • 默认小端模式其中寄存器访问速度大概是DRAM的100~500倍。
  • 小端模式下,一个字的地址与它最低位的字节地址相同。
c code:
	int A[100];
	g=h+A[3]
s code:
	lw x10,12(x15) 
	add x11,x12,x10

x15存放A数组的基地址,12表示偏移量(偏移地址),12(x15)即表示A[3]
注意:偏移地址在RV32中在字为操作单元的指令中需为4的倍数,如:lw、sw

功能

1.lw读一个32位的数据,存入寄存器中。

lb、lbu、sw、sb

lb    rd,offset[11:0](res)  #读一个8位数据,并进行符号位扩展  用于有符号数
lbu   rd,offset[11:0](res)  #读一个8位数据,并进行高位补零	   用于无符号数**
sw    rs2,offset[11:0](res) #写
sb    rs2,offset[11:0](res) #写

为什么需要符号位或者高位扩展?
因为当从存储器读一个8位数据到寄存器时,寄存器为32位故需要扩展。

3.条件判断转移指令

3.1 条件跳转

指令后加u代表对无符号数操作

beq    rs1,rs2,label  #相等跳
bne    rs1,rs2,label  #不相等跳
bge    rs1,rs2,label  #大于等于跳  有符号数
bgeu    rs1,rs2,label  #大于等于跳  无符号数
blt    rs1,rs2,label  #小于
bltu   rs1,rs2,label #

if-else例子
在这里插入图片描述
在这里插入图片描述

3.2 无条件跳转

j label #无条件跳转

4.逻辑运算指令

and rd,rs1,rs2	将rs1和rs2进行与运算,结果存rd
or  rd,rs1,rs2	将rs1和rs2进行或运算
xor rd,rs1,rs2	将rs1和rs2进行异或或运算
sll rd,rs1,rs2	逻辑左移(低位补零)
srl rd,rs1,rs2	逻辑右移(高位补零)
sra rd,rs1,rs2	算术右移(高位补符号位)
  • 逻辑非实现:使用异或操作,例如:xor rd,rs1,0xff,表示rs1寄存器低八位取非
  • 算术右移与逻辑右移运算区别?
    逻辑运算不考虑符号位,右移左边直接添零,算术运算考虑符号位,左边添加符号位
    在算术运算中右移n位并不一定代表除以2的n次方,如图
    在这里插入图片描述
    在这里插入图片描述

小练习

在这里插入图片描述

  • 答案:0x3400

5. 函数调用

1.每条指令都以32位(4字节)机器码形式存放在存储器中
2.函数数调用的六个过程
①. 函数调用时,执行函数前,先将调用中要用到的参数保存;
②.控制权移交给调用的功能函数;
③.申请存储空间,满足执行过程中内存开耗
④.执行函数的功能操作
⑤.函数执行完后,保存结果数据,同时还原函数执行过程中使用到的寄存器值、释放分配给函数的本地存储空间(局部变量等)。
⑥.释放控制权
在这里插入图片描述

函数调用常用到的寄存器

a0-a7(x10-x17):8个寄存器用于传递参数,a0-a1常用于传递返回值
x1(ra):用于放置原函数返回地址
x2(sp):堆栈指针
s0-s11和s2-s11:用于保存原函数的关键数据,不受破坏

在这里插入图片描述

  • 注意: ra寄存器中的返回地址,为当前地址+4,
  • zero代指x0寄存器 hard zero

在这里插入图片描述

  • 解释:
  • j labeljr r1的区别是j是跳转到一个具体的地址,而jr是跳转到一个寄存器地址,sum的函数调用肯定会发生在不同地点,故函数返回值都不相同
  • 一般使用ret指令代替jr ra指令
  • 使用jal ra,label跳转指令,可保存函数返回值到ra中去,值为pc+4
  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-01-25 10:45:17  更:2022-01-25 10:46:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/9 2:08:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码