rtyu789 发表于 2024-10-5 22:48

《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>

通途科技 发表于 2024-11-9 20:19

页: [1]
查看完整版本: 《RISC-V开放架构设计之道》-汇编语言+RV32I