18|RISC-V指令精讲(三):跳转指令实现与调试
LMOS
你好,我是 LMOS。
不过,前面我们只是简单了解了跳转指令长什么样,并没有深入讲解。接下来的两节课,我们就好好研究一下跳转指令的原理,挨个指令做调试。
为什么要有跳转指令
我们不妨回忆一下: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
《计算机基础实战课》,新⼈⾸单¥68
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(5)
- 最新
- 精选
- LockedXjal指令只能跳转基于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归属地:湖北
收起评论