计算机基础实战课
彭东
网名 LMOS,Intel 傲腾项目关键开发者
19719 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 57 讲
计算机基础实战课
15
15
1.0x
00:00/00:00
登录|注册

18|RISC-V指令精讲(三):跳转指令实现与调试

你好,我是 LMOS。
第五节课,我们曾经提到 RV32I 有两种跳转指令,即无条件跳转指令和有条件的跳转指令。
不过,前面我们只是简单了解了跳转指令长什么样,并没有深入讲解。接下来的两节课,我们就好好研究一下跳转指令的原理,挨个指令做调试。
这节课我们从源头说起,弄明白为什么需要有跳转指令存在,然后再熟悉一下无条件跳转指令。至于有条件跳转指令,我们放在下节课继续学习。这节课代码,你可以从这里下载。

为什么要有跳转指令

我们不妨回忆一下:C 语言中 if、for、goto 等流程控制语句都是如何实现的?还有 C 语言的函数是如何调用和返回的?
通过前面的学习,我们了解到 CPU 执行指令是由 PC 寄存器指向的。每次执行完指令,CPU 的 PC 寄存器就会自动增加一条指令大小的数值,使之指向下一条指令,如此循环,这就导致 CPU 只能在 PC 寄存器的引导下顺序地执行指令,而 C 语言函数就是一条条指令组成的。显然,只靠这样的机制,C 语言无法实现流程控制和函数的调用与返回。
如果现在有一种机制,它能够修改 CPU 里 PC 寄存器的值,或者根据特定的条件来修改 CPU 的 PC 寄存器的值,让 PC 寄存器能指向特定的内存地址,读取里面的指令并运行。这样,上述问题就会迎刃而解了。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入讲解了RISC-V架构中的跳转指令实现与调试。文章首先从C语言中的流程控制语句和函数调用入手,引出了对跳转指令的需求。接着详细介绍了RISC-V的跳转指令格式,以及无条件跳转指令jal的具体实现原理。通过伪代码描述和实际代码验证,读者可以清晰地了解jal指令的功能和实际效果。文章通过调试过程展示了jal指令的执行流程,使读者能够直观地理解跳转指令的作用和实现方式。整体而言,本文通过具体的例子和调试过程,生动地展现了RISC-V架构中跳转指令的重要性和实际应用,为读者提供了深入理解该技术的途径。文章还介绍了jalr指令的实现方式,并通过代码验证和调试展示了其功能细节。最后,文章总结了本节课的重点内容,强调了跳转指令在程序控制流程中的重要性,并提出了思考题,引发读者思考和讨论。整体而言,本文内容详实,通过具体的例子和调试过程,生动地展现了RISC-V架构中跳转指令的重要性和实际应用,为读者提供了深入理解该技术的途径。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《计算机基础实战课》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(5)

  • 最新
  • 精选
  • LockedX
    jal指令只能跳转基于pc寄存器的地址,即pc+x 而jalr可以跳转到自定义寄存器的地址,更加灵活

    作者回复: 嘿嘿 是的

    2022-09-09归属地:湖北
    1
  • 苏流郁宓
    jalr多了一个源寄存器,既可以与jal交换使用组成类似偏移地址加基地址进行分页跳转(模仿x86,可4kb一个分页),还有一个重要功能就是,jalr的立即数可变为jal的操作码加目标寄存器(实现jalr-jal),jal的立即数可变为jalr的操作码加目标寄存器加功能加源寄存器! 这样设计的好处方便cpu自动化,提升效率(流水线不停转,交替使用减少去内存取指令浪费的时间,方便一次性执行完一个细分项目,如线程)

    作者回复: 对啊 你思考的很深入

    2022-09-05归属地:湖北
    1
  • 贺宾
    为什么在我的main.c文件中能设置断点,而在jal.S 中却不能设置断点,需要在vscode中安装什么插件吗?

    作者回复: 需要符号 jal.S 中 你设置在标号处就行了

    2022-11-27归属地:湖北
  • 南城忆潇湘
    老师,请教下, “我们一旦单步调试,程序代码就会跳到 jal a0,imm_l2 指令处,pc + 12 等于 0x10180,a0 等于 0x10178,” 这一句中的12是怎么计算的,跟前面说的符号扩展怎么对应的,这一点没搞明白, ( “pc = pc + 符号扩展(imm << 1)”) 这里的imm是什么,左移了一位,是imm左移一位变成了12吗,我是硬看的汇编代码中间隔了3条指令要偏移12

    作者回复: 链接器根据 指令大小 计算的

    2022-09-16归属地:湖北
  • TableBear
    课后思考题: jal的立即数只有20位,加上2字节对齐。只能寻址当前指令前后大约1MB的地址空间。 故而有jalr指令存在的必要。(不知道对不对😂)

    作者回复: 对的

    2022-09-05归属地:湖北
收起评论
显示
设置
留言
5
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部