RISC-V汇编代码分析

柯伊伯带の游侠_博 2022-05-17 23:49:21

RISC-V(发音为“risk-five”)是一个基于精简指令集(RISC)原则的开源指令集架构(ISA)。

RISC-V 被设计成可以支持丰富的定制化和特殊化。基本整数 ISA 可被一个或者多个可选 指令集扩展进行增强,但是基本整数指令集不能被重新定义。最基础的指令是RV32I,即32位的指令。这个是所有的RISC-V处理器都需要实现的指令。RISC-V体系结构可以在这个基础指令集上进行扩展:RV64I,这是64位的基础指令扩展;RV32M是乘法指令扩展;RV32F是单精度浮点扩展;RV32D是双精度浮点扩展等。RV32IMFD就代表了把对应的模块扩展到基础的RV32I中。本文只讨论RV32I。

 

一、RSIC-V CPU的寄存器

RV32I 基础指令集总共定义了 32 个 32 位的通用寄存器。它们分别被标记为x0 ~ x31。其中零号寄存器 x0 是只读寄存器,其值永远为零。在用汇编语言编写时,这 32 个寄存器的名称也根据其在调用约定中的职能而被重新命名。具体如下表

寄存器名称汇编名称功能描述调用返回后其值是否会保证不变

x0

zero零寄存器未定义
x1ra返回地址
x2sp栈指针
x3gp全局指针未定义
x4tp线程指针未定义
x5t0临时寄存器
x6t1临时寄存器
x7t2临时寄存器
x8s0/fp该寄存器需要被调函数予以保存,或也可用作调用栈的帧指针
x9s1该寄存器需要被调函数予以保存
x10~x11a0~a1函数参数或返回值
x12~x17a2~a7函数参数
x18~x27s2~s11该寄存器需要被调函数予以保存
x28~x31t3~t6临时寄存器

除32个通用寄存器外,RSIC-V还定义一个PC寄存器,该寄存器指向当前正在执行的指令的内存地址。

 

二、RISC-V 基本指令

RISC-V 的指令集设计非常的精简,其只包含如下六种基本指令:

  • R类型:寄存器-寄存器操作;
  • I类型:短立即数和访存load操作;
  • S类型:访存store操作;
  • B类型:条件跳转操作;
  • U类型:长立即数;
  • J类型:无条件跳转。

具体格式如下所示:

 

img

 

三、实战操作

1. C代码


 
  1. //

  2. // Created by justx on 2022/5/17.

  3. //

  4.  
  5. #include <stdio.h>

  6.  
  7. int add(int a, int b)

  8. {

  9. return a + b;

  10. }

  11.  
  12. int sub(int a, int b)

  13. {

  14. return a - b;

  15. }

  16.  
  17. int main()

  18. {

  19. int a=1,b=2;

  20.  
  21. printf("Hello World!\n");

  22. printf(add(a,b));

  23. printf(sub(a,b));

  24. return 0;

  25. }

2. 在服务器上编写C代码

 

 

 3. 将C代码转成汇编程序

1. 执行 gcc -E hello.c -o hello.i  对C代码进行预处理

2. cat 查看 hello.i

 3. 把c语言代码转化称相应汇编代码

执行  gcc -S hello.i -o hello.s

查看 hello.s 为汇编代码

 

4.汇编,对生成的汇编程序hello.s进行处理,生成处理器识别的指令。执行下面的命令,生成目标文件hello.o。目标文件为elf格式的可重定向文件。

//gcc的-c选项在生成目标文件后停止

gcc -c hello.s -o hello.o

或者直接调用汇编器as

as -c hello.s -o hello.o

 

 学号:297

...全文
442 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

571

社区成员

发帖
与我相关
我的任务
社区描述
软件工程教学新范式,强化专项技能训练+基于项目的学习PBL。Git仓库:https://gitee.com/mengning997/se
软件工程 高校
社区管理员
  • 码农孟宁
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧