制作一个RISC-V的操作系统五-RISC-V汇编语言编程六(条件分支指令 伪指令 无条件跳转指令 问题 指令寻址模式总结)

本文详细介绍了汇编语言中的条件分支指令B-type,以及伪指令如writeloop的用法。还讨论了无条件跳转指令如AUPIC的JALR,以及不同寻址模式的示例。通过实例解析了如何使用数组和标签进行程序控制结构设计。
摘要由CSDN通过智能技术生成

条件分支指令

在这里插入图片描述
B-type:B指代branch
6-11中:先是第11位然后才是1到4位
24-31中:先是5到10位,然后才是第12位

符号扩展,所以是-20482和20472

标号:标签类似地址

伪指令

在这里插入图片描述
写loop不写地址值
在这里插入图片描述

在这里插入图片描述

char array[] = {'h', 'e', 'l', 'l', 'o', ',', 'w', 'o', 'r', 'l', 'd', '!', '\0'};
int len = 0;
while (array[len] != '\0') {
 len++;
}

汇编结果

.data
array: .byte 'h', 'e', 'l', 'l', 'o', ',', 'w', 'o', 'r', 'l', 'd', '!', 0

.text
.globl _start
_start:
    la t0, array     # 加载数组的地址到寄存器 t0
    li t1, 0         # 初始化计数器 t1 为 0

loop:
    lbu t2, 0(t0)    # 从内存中读取数组元素到寄存器 t2
    beqz t2, end     # 如果读取到的元素值为 0,即结束标记 '\0',则跳转到 end 标签

    addi t1, t1, 1   # 计数器加1
    addi t0, t0, 1   # 数组指针移动到下一个元素
    j loop           # 无条件跳转到 loop 标签继续循环

end:
    # 此时计数器 t1 中存储的即为数组长度
    # 可以在该处添加代码来利用长度进行其他操作
    # 例如打印数组长度,或进行其他处理
    li a0, 1         # 将系统调用编号 1 (print integer) 装入寄存器 a0
    move a1, t1      # 将计数器 t1 中的值装入寄存器 a1
    ecall            # 发起系统调用

    # 程序结束,退出
    li a7, 10        # 将系统调用编号 10 (exit) 装入寄存器 a7
    li a0, 0         # 将返回值 0 装入寄存器 a0
    ecall            # 发起系统调用

无条件跳转指令

在这里插入图片描述
以寄存器值为基址来偏移跳转
在这里插入图片描述
在这里插入图片描述

问题

在这里插入图片描述
AUPIC会构造一个32位的数,将IMM作为其高20位,并存放到X6中,然后JALR跳转到X6+IMM的低12位的值。所以整体来看就是跳转到X6+一个32位数值
在这里插入图片描述

指令寻址模式总结

在这里插入图片描述

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

看星猩的柴狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值