《RISC-V开放架构设计之道》-汇编语言+RV32I
<div class='showpostmsg'># 汇编语言
由于想要先了解程序形成的过程,所以先阅读了第三章来了解程序是如何被生成的
!(/data/attachment/forum/202410/05/224619co9f5d55xmnnf9i1.jpg.thumb.jpg?rand=6127.104146001326)
这是普通C语言的的编译流程,本章主要介绍了后哦三个步骤,就是汇编器、链接器和加载器
对于RISV-V的汇编器,不仅生成了处理器可以理解的目标代码,还支持了一些对编译器开发者和汇编语言程序员有用的操作,被称为**伪指令**
比如在RISV-V的汇编过程中,将函数返回的汇编指令是re,实际上汇编器会将其替换为jalr
伪指令通过依赖寄存器x0,可以实现许多常用操作,比如转跳返回和等于零时分支,极大的简化了RISC-V指令集
!(/data/attachment/forum/202410/05/224620fhmcmmjz7exm0izv.jpg.thumb.jpg?rand=3768.22640057104)
接下来文章介绍了RISC-V汇编语言的hello world程序,继续介绍了**汇编器指示符**
!(/data/attachment/forum/202410/05/224621tv4zkeaxii00edf7.jpg.thumb.jpg?rand=2478.112894406612)
链接器可以将新的目标代码和已有机器语言凭借起来,如果输入的是**位置无关代码**(PIC),那么链接器的工作量会有所降低,意味着无论代码位于何处,所有分支指令和数据引用均正确
编译的时候还会涉及到交叉编译和链接器松弛的问题
链接后的程序是保存在计算机中的可执行文件,在运行程序时,加载器会将代码加载带内存汇总,并转到到代码的起始地址
# RV32I: RISC-V基础整数指令集
RV32I是RISC-V中最基础的指令集,全部的指令示意图如下图所示,可以看到十分的简洁
!(/data/attachment/forum/202410/05/224621uxoj1kccxjks6vaa.jpg.thumb.jpg?rand=4539.931021849279)
!(/data/attachment/forum/202410/05/224622eejsk85a6gg42zst.jpg.thumb.jpg?rand=5700.328176133514)
RV32I有六种基本你的指令格式
1. R型:用于寄存器操作
2. I型:用于短立即数和取数操作
3. S型:用于存数操作
4. B型:用于条件分支
5. U型:用于长立即数
6. J型:用于无条件转跳
!(/data/attachment/forum/202410/05/224623gijakaucc2jlcjzl.jpg.thumb.jpg?rand=8591.471007751843)
上图展示了RV32寄存器和由于RISC-V应用程序二进制接口ABI定义的寄存器名称,有31个寄存器和恒为0的x0寄存器
ARM-32只有16个寄存器,x86-32甚至只有8个
1. RV32I的整数计算
1. 算术指令:add, sub
2. 逻辑指令:add, or, xor
3. 移位指令:sll, srl, sra
4. 功能:从源寄存器中读取两个32位的值,并将32为的结果写入目的寄存器
2. RV32I的取数和存数操作
1. 取数和存数:lw,sw
2. 有符号和无符号的字节和半字节取数:lb,lbu,lh,lhu
3. 字节和半字的存数指令:sb,sh
3. RV32I的条件分支
1. 比较结果是否相等:beq
2. 比较结果是否不相等:bne
3. 比较结果是否大于或等于:bge
4. 比较结果是否小于:blt
5. 无符号版本:bgeu,bltu
4. RV32I的无条件转跳
1. 转跳并链接:jal
5. 其他指令
1. ecall:向运行时环境发出请求,如系统调用
2. ebreak:将控制转移到调试环境
3. fence:对外部可见的访存请求,例如设备IO和内存访问等进行串行化
!(/data/attachment/forum/202410/05/224623nlqcqhh4lu4reilr.jpg.thumb.jpg?rand=2696.919511474143)
最后将RV32I和ARM-32、MIPS-32和x86-32使用插入排序的C语言实践,对比生成的指令数和字节数
总体RV32I的性能还是较优的
# 参考资料
[链接器松弛优化原理介绍](https://blog.csdn.net/weixin_42031299/article/details/132860439)
[重新理解Linux交叉编译及编译流程](https://blog.csdn.net/STCNXPARM/article/details/123452517)</div><script> var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;" style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
if(parseInt(discuz_uid)==0){
} </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>
页:
[1]