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 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 6.自制操作系统: risc-v 比较和跳转指令 -> 正文阅读

[嵌入式]6.自制操作系统: risc-v 比较和跳转指令

比较指令

指令名称

功能

ISA

type

用法

含义

BEQ

相等时分支

RV32I/RV64I

B

beq rs1, rs2, offset

若寄存器 x[rs1]和寄存器 x[rs2]的值相等,把 pc 的值设为当前值加上符号位扩展的偏移 offset。

BEQZ

等于0时分支

RV32I/RV64I

伪指令

beqz rs1, offset

可视为beq rs1, x0, offset

BGE

大于等于时分支

RV32I/RV64I

B

bge rs1, rs2, offset

若寄存器 x[rs1]的值大于等于寄存器 x[rs2]的值(均视为二进制补码),把 pc 的值设为当前值加上符号位扩展的偏移 offset

BGEU

无符号大于等于分支

RV32I/RV64I

B

bgeu rs1, rs2, offset

若寄存器 x[rs1]的值大于等于寄存器 x[rs2]的值(均视为无符号数),把 pc 的值设为当前值加上符号位扩展的偏移 offset

BGEZ

大于等于零时分支

RV32I/RV64I

伪指令

bgez rs1, offset

可视为bge rs1, x0, offset

BGT

大于分支

RV32I/RV64I

伪指令

bgt rs1, rs2, offset

可视为blt rs2, rs1, offset

BGTU

无符号大于时分支

RV32I/RV64I

伪指令

bgtu rs1, rs2, offset

可视为bltu rs2, rs1, offset

BGTZ

大于0时分支

RV32I/RV64I

伪指令

bgtz rs1, offset

可视为blt x0, rs2, offset

BLE

小于等于时分支

RV32I/RV64I

伪指令

ble rs1, rs2, offset

可视为 bge rs2, rs1, offset

BLEU

无符号小于等于时分支

RV32I/RV64I

伪指令

bleu rs1, rs2, offset

可视为 bgeu rs2, rs1, offset

BLEZ

小于等于0时分支

RV32I/RV64I

伪指令

blez rs2, offset

可视为 bge x0, rs2, offset

BLT

小于时分支

RV32I/RV64I

B

blt rs1, rs2 offset

若寄存器 x[rs1]的值小于寄存器 x[rs2]的值(均视为二进制补码),把 pc 的值设为当前值加上符号位扩展的偏移 offset。

BLTZ

小于零时分支

RV32I/RV64I

伪指令

bltz rs2, offset

可视为 blt rs1, x0, offset

BLTU

无符号小于时分支

RV32I/RV64I

B

bltu rs1, rs2, offset

若寄存器 x[rs1]的值小于寄存器 x[rs2]的值(均视为无符号数),把 pc 的值设为当前值加上符号位扩展的偏移 offset。

BNE

不相等时分支

RV32I/RV64I

B

bne rs1, rs2, offset

若寄存器 x[rs1]和寄存器 x[rs2]的值不相等,把 pc 的值设为当前值加上符号位扩展的偏移offset

BNEZ

不等于0时分支

RV32I/RV64I

伪指令

bnez rs1, offset

可视为 bne rs1, x0, offset

跳转指令

指令名称

功能

ISA

type

用法

含义

J

跳转

RV32I/RV64I

伪指令

j offset

把 pc 设置为当前值加上符号位扩展的 offset,等同于 jal x0, offset.

JAL

跳转并链接

RV32I/RV64I

J

jal rd, offset

把下一条指令的地址(pc+4),然后把 pc 设置为当前值加上符号位扩展的offset。rd 默认为 x1( rd为return?address)

JALR

跳转并寄存器链接(jump and link register)

RV32I/RV64I

I

jalr rd, offset(rs1)

把 pc 设置为 x[rs1] + sign-extend(offset),把计算出的地址的最低有效位设为 0,并将原 pc+4的值写入f[rd]。 rd 默认为 x1。

JR

寄存器跳转

RV32I/RV64I

伪指令

jr rs1

把 pc 设置为 x[rs1],等同于 jalr x0, 0(rs1)。

CALL

调用

RV32I/RV64I

伪指令

call rd, symbol

把下一条指令的地址(pc+4) 写入 x[rd],然后把 pc 设为 symbol。等同于 auipc rd, offestHi,再加上一条 jalr rd, offsetLo(rd). 若省略了 rd,默认为 x1.

RET

返回

RV32I/RV64I

伪指令

ret

从子过程返回。实际被扩展为 jalr x0, 0(x1)。

跳转指令实例

1.RET指令

#
#   unsigned long jump_isa_ret(void)
#   测试目的:将ret指令替换为jalr x0, 0(ra)指令,测试此函数是否能正常返回
#   将pc设置为(ra)
.globl jump_isa_ret
jump_isa_ret:
    li a0, 1
    jalr x0, 0(ra) #ra is return address

以上是将ret指令替换为jalr x0, 0(ra)指令的汇编代码。ret指令是伪代码,实际的代码是jalr x0, 0(ra)。其中x0是zero,ra是返回地址。

jalr指令将pc赋值为了ra,(这里为什么要给ra加上括号,rsic-v括号表示是取地址上的数据出来),即实现了返回。

2.JAL指令

#
#  unsigned long jump_isa_jal(unsigned long i)
#  下面的代码无法返回,因为ra被修改了。
.globl jump_isa_jal
jump_isa_jal:
    addi a0, a0, 1
    jal ra, jump_isa_jal_depend
    ret 

.globl jump_isa_jal_depend
jump_isa_jal_depend:
    addi a0, a0, 1
    ret

1.了解jal指令用法

把下一条指令的地址(pc+4)存放到ra中,然后把 pc 设置为当前值加上符号位扩展的offset(即跳转到jump_isa_jal_depend函数)。

2.问题

上面汇编代码在执行到jump_isa_jal的ret函数后将无法返回到调用jump_isa_jal的函数中。根据risc-v的函数调用规则,ret指令是将ra地址赋值给pc。

修改:

#
#  unsigned long jump_isa_jal_yes(unsigned long i)
#   在c语言调用jump_isa_jal_yes时,已经在使用ra寄存器了,
#   但是在jump_isa_jal_yes中调用jump_isa_jal_depend_yes
#   函数时需要使用ra作为返回地址,所以,这里必须要保存ra的值。
#
.globl jump_isa_jal_yes
jump_isa_jal_yes:
    add t1, ra, x0
    addi a0, a0, 1
    jal ra, jump_isa_jal_depend_yes
    add ra, t1, x0
    ret 

.globl jump_isa_jal_depend_yes
jump_isa_jal_depend_yes:
    addi a0, a0, 1
    ret

参考代码

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-03-06 13:17:11  更:2022-03-06 13:19:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 8:25:21-

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