RiscV汇编介绍(2)-编译过程
elf文件全称是Executable and Linkable Format,可执行链接格式,elf文件中除了机器码之外,还有段加载地址,运行入口地址,数据段等。
elf文件格式主要有以下三种:
- 可重定向文件:文件保存着代码和适当的数据,用来和其它的目标文件一起来创建一个可执行文件或者共享目标文件。
- 可执行文件:文件保存着一个用来执行的文件。
- 共享目标文件:即共享库。
elf文件详解:
https://www.cnblogs.com/gatsby123/p/9750187.html
https://blog.csdn.net/afterlake/article/details/53648912
我们用riscv工具链得到hello.c程序的汇编代码如下,对于rv32和rv64 gcc,编译出来的汇编是不一样的。
riscv64-unknown-elf-gcc-8.3.0 hello.c -S -o hello.s
.file "hello.c"
.option nopic
.text
.section .rodata
.align 3
.LC0:
.string "Hello World!"
.text
.align 1
.globl main
.type main, @function
main:
addi sp,sp,-16
sd ra,8(sp)
sd s0,0(sp)
addi s0,sp,16
lui a5,%hi(.LC0)
addi a0,a5,%lo(.LC0)
call puts
li a5,0
mv a0,a5
ld ra,8(sp)
ld s0,0(sp)
addi sp,sp,16
jr ra
.size main, .-main
.ident "GCC: (GNU) 8.3.0"
~
riscv32-unknown-elf-gcc hello.c -S -o hello1.s
.file "hello.c"
.option nopic
.text
.section .rodata
.align 2
.LC0:
.string "Hello World!"
.text
.align 1
.globl main
.type main, @function
main:
addi sp,sp,-16
sw ra,12(sp)
sw s0,8(sp)
addi s0,sp,16
lui a5,%hi(.LC0)
addi a0,a5,%lo(.LC0)
call puts
li a5,0
mv a0,a5
lw ra,12(sp)
lw s0,8(sp)
addi sp,sp,16
jr ra
.size main, .-main
.ident "GCC: (GNU) 8.3.0"
RV32I 为程序和数据分配内存。图中的顶部是高地址,底部是低地址。在 RISC-V 软件规范中,栈指针(sp)从 0xbffffff0 开始向下增长;程序代码段从 0x00010000 开始,包括静态链接库;程序代码段结束后是静态数据区,在这个例子中假设从 0x10000000 开始;然后是动态数据区,由 C 语言中的alloc()函数分配,向上增长,其中包含动态链接库。
.file "hello.c"
.option nopic
.text
.section .rodata
.align 2 //4字节对齐
.LC0:
.string "Hello World!"
.text
.align 1
.globl main
.type main, @function
main:
addi sp,sp,-16 //sp=x2, 调整栈指针,分配栈栈
sw ra,12(sp) //保存函数返回地址,就是main函数的入口地址
sw s0,8(sp) //s0=x8,保存s0,帧指针
addi s0,sp,16 //s0=栈顶地址
lui a5,%hi(.LC0) //计算LC0的地址,a0,…a7保存函数参数地址
addi a0,a5,%lo(.LC0)
call puts //调用puts函数,输出hello world
li a5,0 //读取立即数,a5=0
mv a0,a5 //a0=0,恢复参数地址为0
lw ra,12(sp) //恢复返回地址
lw s0,8(sp) //恢复s0,帧指针
addi sp,sp,16 //恢复sp
jr ra // 跳转到ra地址
.size main, .-main
.ident "GCC: (GNU) 8.3.0"
RiscV汇编介绍(2)-编译过程的更多相关文章
- RiscV汇编介绍(1)-编译过程
从c/c++源文件,到可以执行文件,需要以下几个步骤: 预处理/编译 汇编 链接 下面我们以hello world程序为例,展示整个编译链接过程. 1. 编写hello.c代码 #include &l ...
- Linux 程序编译过程的来龙去脉
大家肯定都知道计算机程序设计语言通常分为机器语言.汇编语言和高级语言三类.高级语言需要通过翻译成机器语言才能执行,而翻译的方式分为两种,一种是编译型,另一种是解释型,因此我们基本上将高级语言分为两大类 ...
- linux程序编译过程
大家肯定都知道计算机程序设计语言通常分为机器语言.汇编语言和高级语言三类.高级语言需要通过翻译成机器语言才能执行,而翻译的方式分为两种,一种是编译型,另一种是解释型,因此我们基本上将高级语言分为两大类 ...
- C程序编译过程浅析
前几天看了<程序员的自我修养——链接.装载与库>中的第二章“编译和链接”,主要根据其中的内容简单总结一下C程序编译的过程吧. 我现在一般都是用gcc,所以自然以GCC编译hellworld ...
- C程序编译过程
1.1程序被其他程序翻译成不同的格式 1.hello.c #include <stdio.h> int main() { printf("hello world\n") ...
- C程序编译过程浅析(转)
前几天看了<程序员的自我修养——链接.装载与库>中的第二章“编译和链接”,主要根据其中的内容简单总结一下C程序编译的过程吧. 我现在一般都是用gcc,所以自然以GCC编译hellworld ...
- C程序编译过程浅析【转】
转自:http://blog.csdn.net/koudaidai/article/details/8092647 前几天看了<程序员的自我修养——链接.装载与库>中的第二章“编译和链接” ...
- 和菜鸟一起学c之gcc编译过程及其常用编译选项【转】
转自:http://blog.csdn.net/eastmoon502136/article/details/8162626 版权声明:本文为博主东月之神原创文章,未经博主允许不得转载. 上篇文章,知 ...
- 鸿蒙内核源码分析(编译过程篇) | 简单案例窥视GCC编译全过程 | 百篇博客分析OpenHarmony源码| v57.01
百篇博客系列篇.本篇为: v57.xx 鸿蒙内核源码分析(编译过程篇) | 简单案例窥视编译全过程 | 51.c.h.o 编译构建相关篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙 ...
随机推荐
- 常用类-ExcelHelper
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...
- 利用Python开发智能阅卷系统
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 机器学习与统计学 PS:如有需要Python学习资料的小伙伴可以加 ...
- 解决element-ui的表格设置固定栏后,边框线消失的bug
如上图所示,边框线消失了,解决方法如下 添加css代码,如果是修改全局,则到全局样式文件添加 .el-table__row{ td:not(.is-hidden):last-child{ right: ...
- Centos7.6 Apache 虚拟机禁止访问IP,允许访问多域名多个虚拟目录设置
存放配置文件路径 /etc/httpd/conf.d自定义命名,配置文件后缀格式确保 *.conf注:这是两个配置文件,也是两种方法. # 一个WEB目录# 禁止以IP地址形式访问<Virtua ...
- 最小化MarkdownPad 2安装体积(win10)
一.原因 MarkdownPad2在Win10当中可能无法正常运行,右侧预览界面会出现错误"This view has crashed!"查阅官网FAQ得知大多数情况下安装Awes ...
- 第05组 Alpha事后诸葛亮
组长博客链接(2分) 组长博客链接 现代软件工程 项目Postmortem 模板(27分) 设想和目标(2分) 1.我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? ...
- WPF combobox数据绑定和数据获取
本文章仅为个人学习,如有错误之处请指正. 搭建WPF界面的时候,想用combobox构建一个下拉菜单,搜索的时候看到大多数都是大段代码,逻辑顺序不是很详细,摸索了大概,记录一下方便来者. 拖入comb ...
- Python参数类型以及实现isOdd函数,isNum函数,multi函数,isPrime函数
Python参数类型以及实现isOdd函数,isNum函数,multi函数,isPrime函数 一.Python参数类型 形参:定义函数时的参数变量. 实参:调用函数时使用的参数变量. 参数传递的过程 ...
- Mysql中事务ACID实现原理
引言 照例,我们先来一个场景~ 面试官:"知道事务的四大特性么?"你:"懂,ACID嘛,原子性(Atomicity).一致性(Consistency).隔离性(Isola ...
- Matplotlib绘图及动画总结
目录 Matplotlib绘图总结 绘图原理 block模式(python默认) interactive模式(ipython模式默认) 深入子图 子图表示 子图绘图 绘制动画 参考链接 Matplot ...