计算机是怎样工作的

中科大 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下的汇编分析相关推荐

  1. Linux 应用程序 嵌汇编,Linux下C语言嵌汇编

    Using Assembly Language in Linux. Intel和AT&T汇编语法差异: 1.前缀: Intel汇编寄存器和立即数无需前缀.后者寄存器前缀为%,立即数前缀为$. ...

  2. linux下汇编程序gas,Linux 汇编语言(GNU GAS汇编)开发指南

    汇编语言的优点是速度快,可以直接对硬件进行操作,这对诸如图形处理等关键应用是非常重要的.Linux 是一个用 C 语言开发的操作系统,这使得很多程序员开始忘记在 Linux 中还可以直接使用汇编这一底 ...

  3. linux 编译汇编,linux下的汇编教程

    linux下的汇编教程 第一部分 Linux下ARM汇编语法尽管在Linux下使用C或C++编写程序很方便,但汇编源程序用于系统最基本的初始化,如初始化堆栈指针.设置页表.操作 ARM的协处理器等.初 ...

  4. linux目录隐藏技术,Linux环境下的高级隐藏技术

    摘要:本文深入分析了Linux环境下文件.进程及模块的高级隐藏技术,其中包括:Linux可卸载模块编程技术.修改内存映象直接对系统调用进行修改技术,通过虚拟文件系统proc隐藏特定进程的技术. 隐藏技 ...

  5. Linux之ARM(IMX6U)裸机汇编LED驱动实验--烧写bin文件到SD卡中并运行

    Linux之ARM(IMX6U)裸机汇编LED驱动实验--烧写bin文件到SD卡中并运行 代码烧写 2.烧写的工具 2.把生成的将 imxdownload 放在工程目录下(led.bin同一个文件夹下 ...

  6. Linux之ARM(IMX6U)裸机汇编LED驱动实验--编译驱动

    Linux之ARM(IMX6U)裸机汇编LED驱动实验--编译驱动 前言 编译代码 1.把 .s 文件编译成 .o文件 2.把 .o文件编译成连接文件 .elf 3.arm-linux-gnueabi ...

  7. x86汇编 linux,Linux操作系统的X86汇编程序设计

    本质上来说, 这篇文章是把我最感兴趣的两样编程东西: Linux 操作系统和汇编语言程序设计结合在一起. 这两个都不(或者说应该不)需要介绍; 像 Win32 的汇编,Linux 的汇编运行在 32 ...

  8. windows命令行下访问linux,Windows支持直接访问Linux子系统文件:你的下一台Linux何必是Linux...

    原标题:Windows支持直接访问Linux子系统文件:你的下一台Linux何必是Linux 晓查 发自 凹非寺 量子位 报道 | 公众号 QbitAI 微软,致力于做最好的Linux发行版. 今天, ...

  9. linux mysql 日志乱码_Linux下MySQL保存进去数据为乱码的解决办法

    mysql默认的字符编码是latin1,而我用的是utf-8,存入数据库就变成了?????这样的乱码,解决方法: 1.windows下:修改my.ini文件,有 mysql默认的字符编码是latin1 ...

最新文章

  1. 第106天:Ajax中同步请求和异步请求
  2. 使用plsql developer 创建用户
  3. pandas的loc, iloc, ix的操作
  4. 笨办法学C 练习6:变量类型
  5. 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型...
  6. ABP vNext微服务架构详细教程——架构介绍
  7. mysqlmodify_modify与change的区别
  8. 【STM32F429的DSP教程】第8章 DSP定点数和浮点数(重要)
  9. js判断数组是否相等的方法
  10. PWM如何控制直流电机
  11. Spring3第一天
  12. echarts x轴 y轴设置
  13. 马来西亚于4月1日重新开放边境
  14. 揪出手机耗电元凶——高德地图缓存数据
  15. EndNote导入文献出现带有大括号{}乱码的解决办法
  16. int类型数组和bool类型数组互相转换
  17. QQ音乐关键字搜索并生成下载url
  18. Codeforces 1106F Lunar New Year and a Recursive Sequence 矩阵快速幂,原根转化模意义下对数,BSGS
  19. 洛谷 P1710 地铁涨价
  20. Linux内核文件系统12

热门文章

  1. 三层构架和 MVC 不同?
  2. 源码角度,分析@Transactional实现原理
  3. 面试要15K,HR说你只值10K,怎么斗得过?
  4. Java-重定向输出流实现程序日志
  5. MySQL高级-SQL优化
  6. 小白学python之整型,布尔值,十进制二进制转换和字符串详解for循环!
  7. Linux思维导图之inode、mv、cp和硬软链接
  8. WPF简易北京地铁效果图
  9. 怎样写 OpenStack Neutron 的 Extension (三)
  10. paip.截取字符串byLastDot方法总结uapi python java php c# 总结