首页 > 技术文章 > 通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的

kryst4l 2016-02-28 18:05 原文

实验目的:

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

实验过程:

通过vi程序进行编程:

  1. int g(int x)
  2. {
  3.   return x + 3;
  4. }
  5.  
  6. int f(int x)
  7. {
  8.   return g(x);
  9. }
  10.  
  11. int main(void)
  12. {
  13.   return f(8) + 1;
  14. }

保存为main.c文件

使用反汇编命令

gcc -S -o main.s main,c -m32

-S : 编译为汇编语言程序

-o : 指定目标程序名称

-m32 : 指定编译为32位环境的汇编代码

得到结果:

删除符号项:

 堆栈图:

首先main函数开始执行,将基址寄存器的值进栈,用于系统控制main函数返回。

movl    %esp, %ebp  

此行代码将esp寄存器的内容赋值给ebp,即ebp和esp都指向地址1的位置

subl    $4, %esp  

将esp的指针指向下面一个位置

movl    $8, (%esp)  

将立即数8存放在当前esp所指位置

call    f  

调用f函数

call    g  

调用g函数

最后返回main函数,结果:

实验总结:

学到一些基本的汇编语言,知道了汇编语言是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址。在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。普遍地说,特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植

 

eax默认作为函数返回值保存寄存器

ebp为栈低指针寄存器

esp为栈顶指针寄存器(运行中的每个程序都有一段堆栈空间,用来存放程序运行时数据)

eip为当前指令位置寄存器

push为压栈指令

pop为出栈指令

add为加法指令

 

推荐阅读