通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的

实验:

首先,写一个简单的c程序

通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的_第1张图片

通过命令编译c程序为汇编代码


打开汇编代码

通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的_第2张图片

通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的_第3张图片
通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的_第4张图片

简化汇编代码

通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的_第5张图片


分析汇编代码:

假设目前栈底位置为1000,栈为空栈,即ebp=esp=1000,令目前栈底位置为单元1,每单元占4字节

代码从main部分开始执行

pushl  %ebp ;在单元1处保存目前ebp1000,栈顶移动一个单元esp=996

movl  %esp,%ebp;ebp=996

subl  $4,%esp;esp=992

movl  $9,(%esp);在单元2处保存立即数9

call  f;在单元3处保存目前eip23,栈顶移动一个单元esp=988,转至f开始执行

pushl  %ebp;在单元4处保存目前ebp996,栈顶移动一个单元esp=984

movl  %esp,%ebp;ebp=984

subl  $4,%esp;esp=980

movl  8(%ebp),%eax;将单元2内容存至eax,eax=9

movl  %eax,(%esp);将eax中内容9至单元5

call  g;在单元6处保存目前eip15,栈顶移动一个单元esp=976,转至g开始执行

pushl  %ebp ;在单元7处保存目前ebp984,栈顶移动一个单元esp=972

movl  %esp,%ebp;ebp=972

movl  8(%ebp),%eax;将单元5内容存至eax,eax=9

addl  $7,%eax;eax中内容加上立即数7,eax=16

popl  %ebp;ebp=984

ret  ;eip=15,返回f继续执行

leave;ebp=996

ret  ;eip=23,返回main继续执行

addl  $1,%eax;eax中内容加上立即数1,eax=17

leave;ebp=1000,esp=1000

ret

总结:

这个简单的小程序主要是依赖寄存器、内存以及内存中的栈进行工作的

操作的实现主要依赖寄存器

调用的实现主要依赖内存中的栈





王潇洋

《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

你可能感兴趣的:(通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的)