本期内容如下:

  1. RV32I 指令应用注意事项
  2. 指令立即数取值范围
  3. 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 指令应用实战相关推荐

  1. ir指令、立即数的作用_立即数的判断方法一

    在ARM汇编的数据处理指令中经常会使用到常数,而ARM汇编中规定使用的常数必 须是立即数.ARM立即数的是由一个8位的常数循环右移偶数位得到的,其中循环右移 的位数由一个4位2进制的两倍表示,公式如下 ...

  2. gateway sentinel 熔断 不起作用_《一起学sentinel》一

    <一起学sentinel>一.一起搭建sentinel服务 一.概述 随着微服务的流行,服务和服务之间的稳定性变得越来越重要.Sentinel 以流量为切入点,从流量控制.熔断降级.系统负 ...

  3. 口琴膜片什么作用_新手怎么学口琴?

    对于想要学乐器的人来说,如果已经错过了最佳的学习期,在成年阶段学习什么乐器比较好? 答:口琴. 口琴在众多乐器中,算是比较简单的,经过一定的练习之后,简单的慢曲吹奏更是手到擒来. 本期爱歌者音乐指导, ...

  4. python在规划类专业的作用_城乡规划学Python、Gis有哪些具体的作用?

    感觉已经回答过很多遍类似的问题了,但是还是很开心你Python和GIS都提到了,请允许我,粘贴一点,自己再写一点. 这两个的确用处很大,但都是,用到了用处很大.你如果不会他们,估计一直用不上,也只是一 ...

  5. ir指令、立即数的作用_ARM-汇编指令集(总结)

    ARM汇编指令集 指令.伪指令 (汇编)指令: 是机器码的助记符,经过汇编器编译后,由CPU执行. (汇编)伪指令:用来指导指令执行,是汇编器的产物,最终不会生成机器码. 有两种不同风格的ARM指令 ...

  6. ir指令、立即数的作用_AI框架中图层IR的分析

    AI框架图层IR的分析 前段时间一直忙于HC大会和MindSpore1.0的版本准备,国庆期间终于有点时间来交作业了,本文是AI框架分析专栏的第二篇,总体目录参见: AI框架的演进趋势和MindSpo ...

  7. ir指令、立即数的作用_ARM指令中使用立即数详解

    arm 指令 立即数 (二) 在 ARM 数据处理指令中 , 当参与操作的第二操作数为立即数时 , 每个立即数都 是采用一个 8 位的常数循环右移偶数位而间接得到 , 其中循环右移的位数有一 个 4 ...

  8. java中push和pop指令的作用_汇编语言PUSH和POP指令(压栈和出栈)

    汇编里把一段内存空间定义为一个栈,栈总是先进后出,栈的最大空间为 64K.由于 "栈" 是由高到低使用的,所以新压入的数据的位置更低,ESP 中的指针将一直指向这个新位置,所以 E ...

  9. 湖南大学_数电实验_模型机设计_CPU设计_verilog_课程实验报告

    本学期的数电课程实验就是模型机设计,由四次小实验构成,最后一次实验验收要求使用quartus做出一个模型机. 该实验的重要性:该实验的核心在于基于实验指导书设计CPU,从而帮我们理解CPU的工作原理. ...

最新文章

  1. python 字符串格式化是打印不同类型更简单一些
  2. Linux界面自动化测试框架不完全汇总
  3. iOS开发网络篇—数据缓存
  4. 闲置硬盘自制nas私有云_闲置U盘不用扔,教你一招变云盘,随时随地备份数据、访问私有云...
  5. cocos2d-x-3.x 动作(5)序列动作
  6. line-height:1.5和line-height:150%的区别
  7. Storm环境搭建(分布式集群)
  8. c语言数组蛇形编程,C语言每天小练(二)——蛇形数组
  9. kinect 2.0 SDK-深度图与彩色图对齐
  10. hbase 查询固定条数_HBase统计表行数(RowCount)的四种方法
  11. 计算机组成原理讲义 微盘,计算机组成原理课件.pdf
  12. zte机顶盒怎么投屏_中兴iptv机顶盒可以投屏吗?
  13. 客户画像--指标标签体系设计方案----业务视角
  14. 计算机专硕一般研二在干嘛,专硕一般研二在干嘛,专硕两年怎么安排
  15. 【应用层】“世纪”大案之 我与网络地址的抗争
  16. MapReduce 的基本原理
  17. 基于android的学单词app
  18. mc用什么版本的java_MC版本Java版5大功能优势
  19. 力扣 旋转字符串 C语言 题解
  20. C处理命令行参数 getopt 用法

热门文章

  1. 通信要学很多计算机课吗,辽宁科技学院通信工程专业要学哪些课程,好学吗?...
  2. ok计数器使用教程_玩转透视表!Excel教程 Excel入门 Excel技巧 Excel快捷键 Excel学习!...
  3. 彻底解决 Jenkins Slaver 节点无法执行 Git-LFS 命令
  4. va_start、va_end、va_arg 实现可变长参数
  5. stm32-再谈GPIO
  6. jQuery--思维导图
  7. rocketmq安装部署过程(4.0.0版本)
  8. 06jQuery-06-AJAX
  9. 阅读笔记 火球UML大战需求分析4
  10. 快速删除大文件和大量小文件。