ir指令、立即数的作用_我们一起学RISC-V——08-RV32I 指令应用实战
本期内容如下:
- RV32I 指令应用注意事项
- 指令立即数取值范围
- RISC-V汇编伪指令
图1
一、RV32I 指令应用注意事项
RISC-V为了追求硬件设计上的简化,很多功能并没有单独实现,而是通过编译器来自动完成对未实现指令的自动转换,编译器会利用已有基本指令来完成对未有指令功能的扩充,由于RISC-V指令设计的巧妙,这种扩充,并不会损失太多CPU性能。
如:
X0寄存器,也被称为zero,是一个只读寄存器,返回值永远为0,写入的任何数据都将被丢弃。基本指令借助于zero可以扩展出许多新的指令。
addi x0 , x0, 0 就等价与其他处理器指令的nop操作;
sub a0,x0,a1 就等价于取负数指令neg;
以上设计思路可以大大简化硬件设计。
1.1 善用伪指令
在用机器指令进行编写代码时,初学者总觉的,RV32I提供的指令集不完善,有些功能都没有实现,如nop,neg,mv,not等,为此直接用有限的机器指令编写代码,总觉的蹩脚,不够直接。
如,我们使用的nop功能时,其实编写的机器指令是addi x0 , x0, 0,像这样编写代码实在痛苦,整个代码也比较难读。为此,gnu汇编器提供的伪指令就派上用途了,实际编写“空”操作代码时,直接使用伪指令nop,在编译时候,汇编器会自动帮助将nop转换为addi x0,x0,0,这样就方便多了。
1.2 立即数的取值范围
RV32I中存在大量的立即数操作数指令,由于不同指令格式的立即数占用bit不同,其所能取的数值也是有限的,如果立即数超出实际指令范围,编译器将会报错。
如我们希望加载一个32bit常量数据0x12345678到t0寄存器中,不采用伪指令li t0,0x12345678的情况下,我们是找不到任何一条机器指令可以直接一步完成32bit立即数加载的,为了实现这一功能,我们可能想到的方法为如下代码:
addi t0,zero,0x123 //加载0x12345678的高12bit到t0slli t0,t0,12 //t0<<12bit =>t0=0x123000addi t0,t0,0x456 //t0=t0+0x456=0x123456slli t0,t0,8 //t0<<8bit =>t0=0x12345600addi t0,t0,0x78 //t0=t0+0x78=0x12345678
当然为了实现上述功能,也可采用他方法,之所以举这个例子是为了让大家知道,编写汇编代码时,机器指令的立即数是有位宽限制的,addi t0,zero,0x123345678 显然是一个错误指令。
二、指令立即数取值范围
不同立即数操作指令,立即数取值范围参见图2。
图2 立即数取值范围
三、RISC-V汇编伪指令
伪指令是汇编器提供的类似于机器指令的操作指令,伪指令在实际的处理器指令集中并没有被实现,编译器在编译汇编代码时,可以通过一条 或多条机器指令去实现伪指令对应的功能。这样做的目的,就是可以最大限度简化处理器指令集,降低处理器开发难度,使用伪指令可以更加快速方便的编写汇编代码。
RISC-V在原有机器指令的基础上,扩展了几十个伪指令,通过这些伪指令,我们可以非常方便的编写汇编代码,具体伪指令参见图3和图4。
为了理解和消化这些伪指令,读者需要耐心的练习相关操作。
图3 RISC-I 汇编伪指令1
图4 RISC-V汇编伪指令2
这里需要强调的几条指令,中
3.1 加载立即数
伪指令
li rd, imm(32-bit)
等效机器指令
lui rd, imm(20-bit)
addi rd, rd, imm(12-bit)
3.2 加载地址
伪指令
la rd, label
等效机器指令
auipc rd, imm(20-bit)
addi rd, rd, imm(12-bit)
3.3 调用任意32-bit 绝对地址
lui x1,
jalr ra, x1, (pc)=32bit 地址,即,调用32bit绝对地址
3.4 跳转相对PC的32bit偏移地址
auipc x1,
jalr x0, x1, (pc)=(pc)+32bit地址,即,跳转到当前指令前后32bit偏移地址处
RISC-V汇编指令学习贵在练习,坚持一段时间后,这将更好地帮助我们理解RISC-V处理器架构。
ir指令、立即数的作用_我们一起学RISC-V——08-RV32I 指令应用实战相关推荐
- ir指令、立即数的作用_立即数的判断方法一
在ARM汇编的数据处理指令中经常会使用到常数,而ARM汇编中规定使用的常数必 须是立即数.ARM立即数的是由一个8位的常数循环右移偶数位得到的,其中循环右移 的位数由一个4位2进制的两倍表示,公式如下 ...
- gateway sentinel 熔断 不起作用_《一起学sentinel》一
<一起学sentinel>一.一起搭建sentinel服务 一.概述 随着微服务的流行,服务和服务之间的稳定性变得越来越重要.Sentinel 以流量为切入点,从流量控制.熔断降级.系统负 ...
- 口琴膜片什么作用_新手怎么学口琴?
对于想要学乐器的人来说,如果已经错过了最佳的学习期,在成年阶段学习什么乐器比较好? 答:口琴. 口琴在众多乐器中,算是比较简单的,经过一定的练习之后,简单的慢曲吹奏更是手到擒来. 本期爱歌者音乐指导, ...
- python在规划类专业的作用_城乡规划学Python、Gis有哪些具体的作用?
感觉已经回答过很多遍类似的问题了,但是还是很开心你Python和GIS都提到了,请允许我,粘贴一点,自己再写一点. 这两个的确用处很大,但都是,用到了用处很大.你如果不会他们,估计一直用不上,也只是一 ...
- ir指令、立即数的作用_ARM-汇编指令集(总结)
ARM汇编指令集 指令.伪指令 (汇编)指令: 是机器码的助记符,经过汇编器编译后,由CPU执行. (汇编)伪指令:用来指导指令执行,是汇编器的产物,最终不会生成机器码. 有两种不同风格的ARM指令 ...
- ir指令、立即数的作用_AI框架中图层IR的分析
AI框架图层IR的分析 前段时间一直忙于HC大会和MindSpore1.0的版本准备,国庆期间终于有点时间来交作业了,本文是AI框架分析专栏的第二篇,总体目录参见: AI框架的演进趋势和MindSpo ...
- ir指令、立即数的作用_ARM指令中使用立即数详解
arm 指令 立即数 (二) 在 ARM 数据处理指令中 , 当参与操作的第二操作数为立即数时 , 每个立即数都 是采用一个 8 位的常数循环右移偶数位而间接得到 , 其中循环右移的位数有一 个 4 ...
- java中push和pop指令的作用_汇编语言PUSH和POP指令(压栈和出栈)
汇编里把一段内存空间定义为一个栈,栈总是先进后出,栈的最大空间为 64K.由于 "栈" 是由高到低使用的,所以新压入的数据的位置更低,ESP 中的指针将一直指向这个新位置,所以 E ...
- 湖南大学_数电实验_模型机设计_CPU设计_verilog_课程实验报告
本学期的数电课程实验就是模型机设计,由四次小实验构成,最后一次实验验收要求使用quartus做出一个模型机. 该实验的重要性:该实验的核心在于基于实验指导书设计CPU,从而帮我们理解CPU的工作原理. ...
最新文章
- python 字符串格式化是打印不同类型更简单一些
- Linux界面自动化测试框架不完全汇总
- iOS开发网络篇—数据缓存
- 闲置硬盘自制nas私有云_闲置U盘不用扔,教你一招变云盘,随时随地备份数据、访问私有云...
- cocos2d-x-3.x 动作(5)序列动作
- line-height:1.5和line-height:150%的区别
- Storm环境搭建(分布式集群)
- c语言数组蛇形编程,C语言每天小练(二)——蛇形数组
- kinect 2.0 SDK-深度图与彩色图对齐
- hbase 查询固定条数_HBase统计表行数(RowCount)的四种方法
- 计算机组成原理讲义 微盘,计算机组成原理课件.pdf
- zte机顶盒怎么投屏_中兴iptv机顶盒可以投屏吗?
- 客户画像--指标标签体系设计方案----业务视角
- 计算机专硕一般研二在干嘛,专硕一般研二在干嘛,专硕两年怎么安排
- 【应用层】“世纪”大案之 我与网络地址的抗争
- MapReduce 的基本原理
- 基于android的学单词app
- mc用什么版本的java_MC版本Java版5大功能优势
- 力扣 旋转字符串 C语言 题解
- C处理命令行参数 getopt 用法
热门文章
- 通信要学很多计算机课吗,辽宁科技学院通信工程专业要学哪些课程,好学吗?...
- ok计数器使用教程_玩转透视表!Excel教程 Excel入门 Excel技巧 Excel快捷键 Excel学习!...
- 彻底解决 Jenkins Slaver 节点无法执行 Git-LFS 命令
- va_start、va_end、va_arg 实现可变长参数
- stm32-再谈GPIO
- jQuery--思维导图
- rocketmq安装部署过程(4.0.0版本)
- 06jQuery-06-AJAX
- 阅读笔记 火球UML大战需求分析4
- 快速删除大文件和大量小文件。