linux下的汇编,linux下的汇编分析
计算机是怎样工作的
中科大 SA6272 柏云鹏 实验一
实验目标:
请使用Example的c代码分别生成.cpp,.s,.o和ELF可执行文件,并加载运行,分析.s汇编代码在CPU上的执行过程
通过实验解释单任务计算机是怎样工作的,并在此基础上讨论分析多任务计算机是怎样工作的。
实验环境:
VMvare
Workstation下的虚拟机ubuntu
实验过程:
example.c的代码:
int g(int
x)
{
return
x+3;
}
int f(int
x)
{
return
g(x);
}
int main(void)
{
return
f(8)+1;
}
在平台ubuntu中Desktop中建立了example.c文件。
依次编译成.cpp .s .o
elf文件。
Cpp:预处理器GNU C
编译器在编译前自动使用cpp对用户程序进行预处理。
Asm:即.s文件,是编译成的汇编文件。
Object:即.o文件,是编译成的目标文件。经过连接后就是elf可执行文件。
参考了一下预编译后的cpp文件,感觉和原来区别不大。
可以看出与原来的区别不是很大,多了4个头部。
现在看一下汇编语言:
看左图,出现了与老师上课很多不一样的地方:
.globl
指示告诉汇编器,g这个符号要被链接器用到,所以要早目标文件的符号表中记录他是一个全局变量。g也就是一个函数的内存首地址,可以从这里访问函数g。
.cfi_startproc:使用在每个函数的开头。它初始化一些内部数据结构和初始的CFI指令发出。
.cfi_endproc:与前面的相对,打开.eh_frame,生成(CIE,FDE)并设置再定位记录。
.cfi_def_cfa_offset:改变CFA的规则,并使用imm偏移。寄存器保持不变。
.cfi_offset
:Generate
a rule saying that
register reg is saved at
offset imm from
CFA.
.cfi_def_cfa_register:改变CFA的规则,并使用reg。寄存器保持不变。
.cfi_def_cfa:设定一条计算CFA的规则,使用寄存器reg的内容但是添加imm进去。
.cfi的一些字段应该都是设置一些寄存器参数的,具体用法查了很多资料都没有找到。其他的是直接的汇编代码。
将汇编代码整理一下,然后查看一下内存中的变化。首先,函数运行的入口时main函数。如下图:
原来最上方还有其他的函数栈,但是pushl后,就将esp指针下移,同时ebp地址存入了esp原来指向的位置,如果最后栈全部销毁,则可以恢复原来的栈。
相当于初始化了新的栈。
这个时候调用到了f,所以开始了跳转。
此时eip=f,所以进行了跳转,跳转到了函数f处:
这个时候我们发现eip=main了,所以函数跳回到主函数:
至此eip也变成了原来的eip,main函数栈也销毁了。这也是整个函数调用的过程。
实验总结:
现在总结一下计算机是如何工作的,当然首先的前提是这个计算机是这样简单的,顺序的,不考虑中断和多任务情况下的工作过程。
计算机开始一段程序时,先要把当前的栈保存好,然后开辟一个全新的栈空间来进行函数的执行,从上面的过程就可以分析出来,压入现在ebp,然后ebp移位到和esp一样的位置。这样一个全新的空栈就建立成功了。
函数调用的时候和计算机开始一段新的程序的时候是一样的,必须保存当前函数栈,以便后来可以跳转回来,从栈销毁的过程中来看,可以看出栈的销毁有几个方面:
eip的跳转,当你进入新的函数段的时候,你要知道你在哪个函数段,就由eip告诉你。
ebp的跳转,与eip相类似,你要换到新的函数段,必须回到原来的栈里才行。
leave的作用,leave的操作首先是ebp,esp的对齐,这是一个原因造成的,那就是临时变量,C语言中临时变量首先进入堆栈,ebp,esp对齐直接就销毁了这些临时变量。
ret的实现就是销毁开辟的堆栈的时刻,eip跳转,然后堆栈还原,而返回值一直在累加器中,不许要进入堆栈段,这也是第三段代码虽然开辟堆栈但是没有利用的原因。
linux下的汇编,linux下的汇编分析相关推荐
- Linux 应用程序 嵌汇编,Linux下C语言嵌汇编
Using Assembly Language in Linux. Intel和AT&T汇编语法差异: 1.前缀: Intel汇编寄存器和立即数无需前缀.后者寄存器前缀为%,立即数前缀为$. ...
- linux下汇编程序gas,Linux 汇编语言(GNU GAS汇编)开发指南
汇编语言的优点是速度快,可以直接对硬件进行操作,这对诸如图形处理等关键应用是非常重要的.Linux 是一个用 C 语言开发的操作系统,这使得很多程序员开始忘记在 Linux 中还可以直接使用汇编这一底 ...
- linux 编译汇编,linux下的汇编教程
linux下的汇编教程 第一部分 Linux下ARM汇编语法尽管在Linux下使用C或C++编写程序很方便,但汇编源程序用于系统最基本的初始化,如初始化堆栈指针.设置页表.操作 ARM的协处理器等.初 ...
- linux目录隐藏技术,Linux环境下的高级隐藏技术
摘要:本文深入分析了Linux环境下文件.进程及模块的高级隐藏技术,其中包括:Linux可卸载模块编程技术.修改内存映象直接对系统调用进行修改技术,通过虚拟文件系统proc隐藏特定进程的技术. 隐藏技 ...
- Linux之ARM(IMX6U)裸机汇编LED驱动实验--烧写bin文件到SD卡中并运行
Linux之ARM(IMX6U)裸机汇编LED驱动实验--烧写bin文件到SD卡中并运行 代码烧写 2.烧写的工具 2.把生成的将 imxdownload 放在工程目录下(led.bin同一个文件夹下 ...
- Linux之ARM(IMX6U)裸机汇编LED驱动实验--编译驱动
Linux之ARM(IMX6U)裸机汇编LED驱动实验--编译驱动 前言 编译代码 1.把 .s 文件编译成 .o文件 2.把 .o文件编译成连接文件 .elf 3.arm-linux-gnueabi ...
- x86汇编 linux,Linux操作系统的X86汇编程序设计
本质上来说, 这篇文章是把我最感兴趣的两样编程东西: Linux 操作系统和汇编语言程序设计结合在一起. 这两个都不(或者说应该不)需要介绍; 像 Win32 的汇编,Linux 的汇编运行在 32 ...
- windows命令行下访问linux,Windows支持直接访问Linux子系统文件:你的下一台Linux何必是Linux...
原标题:Windows支持直接访问Linux子系统文件:你的下一台Linux何必是Linux 晓查 发自 凹非寺 量子位 报道 | 公众号 QbitAI 微软,致力于做最好的Linux发行版. 今天, ...
- linux mysql 日志乱码_Linux下MySQL保存进去数据为乱码的解决办法
mysql默认的字符编码是latin1,而我用的是utf-8,存入数据库就变成了?????这样的乱码,解决方法: 1.windows下:修改my.ini文件,有 mysql默认的字符编码是latin1 ...
最新文章
- 第106天:Ajax中同步请求和异步请求
- 使用plsql developer 创建用户
- pandas的loc, iloc, ix的操作
- 笨办法学C 练习6:变量类型
- 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型...
- ABP vNext微服务架构详细教程——架构介绍
- mysqlmodify_modify与change的区别
- 【STM32F429的DSP教程】第8章 DSP定点数和浮点数(重要)
- js判断数组是否相等的方法
- PWM如何控制直流电机
- Spring3第一天
- echarts x轴 y轴设置
- 马来西亚于4月1日重新开放边境
- 揪出手机耗电元凶——高德地图缓存数据
- EndNote导入文献出现带有大括号{}乱码的解决办法
- int类型数组和bool类型数组互相转换
- QQ音乐关键字搜索并生成下载url
- Codeforces 1106F Lunar New Year and a Recursive Sequence 矩阵快速幂,原根转化模意义下对数,BSGS
- 洛谷 P1710 地铁涨价
- Linux内核文件系统12