《Linux内核分析》MOOC课程 反汇编一个简单的C程序,分析汇编代码

一个简单c程序

分析一个简单的c程序 main.c 如下图:

用命令 gcc –S –o main.s main.c -m32编译成汇编文件。在汇编文件中有许多的虚指令并不会形成机器指令,为了使分析简单我们把大部分去掉:

得到如下图所示:

栈的介绍

APUE中指出每一个c程序,都有一个独立的地址空间,在内存中的典型布局如下:

对栈的操作和我们在数据结构中的栈的操作是类似的,ebp,esp(具体名称与cpu体系结构相关) 这两个寄存器直接与栈的操作相关。

栈地址是从高到低的方向分配的。

  1. 开始一个新的栈时,使ebp,esp指向栈的起始地址的下一位。eg:ebp,esp 指向0x10000
  2. pushl操作,esp-4(32位机器为例),此时esp的值为0xfffc,将操作数放入栈
  3. popl操作,将操作数出栈,esp+4

函数调用

call指令调用一个子程序,cpu会转移到去执行子程序代码,为了当子程序执行完时能够准确返回,需要把call指令的下一条指令的地址压入栈。然后为子程序建立一个新的栈,汇编指令如下:

  1. pushl %ebp
  2. movl %esp, %ebp

pushl %ebp 指令将主调程序的栈的基址压入栈,执行movl %esp,%ebp指令后 esp,ebp 都指向新的栈的起始地址的下一位。当要恢复主调函数的栈时,只要执行如下指令,就会恢复主调函数的栈:

  1. movl %ebp,%esp
  2. popl %ebp

这两句汇编可以用leave指令代替,当然也有可能直接执行 popl %ebp 就可以。

当恢复主调函数的栈时,在栈的栈顶就是即将要执行的指令的地址,通过ret指令,将指令的地址返回给指令计数器,cpu就会从call的下一条指令继续跑下去了。

时间: 2024-08-09 10:38:59

《Linux内核分析》MOOC课程 反汇编一个简单的C程序,分析汇编代码的相关文章

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

实验一:通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的 学号:20135114 姓名:王朝宪 注: 原创作品转载请注明出处   <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 1 1)实验部分(以下命令为实验楼64位Linux虚拟机环境下适用,32位Linux环境可能会稍有不同) 使用 gcc –S –o main.s main.c -m32 命令编译成汇编代码,如下代码中的数字请自行修改以防与

反汇编一个简单的C程序并分析

反汇编一个简单的C程序并分析 C 源码: int g(int x) { return x+1; } int f(int x) { return g(x); } int main(void) { return f(2) + 3; } 汇编源码: 1 g: 2 pushl %ebp 3 movl %esp, %ebp 4 movl 8(%ebp), %eax 5 addl $1, %eax 6 popl %ebp 7 ret 8 f: 9 pushl %ebp 10 movl %esp, %ebp

Linux内核中的信号机制--一个简单的例子【转】

本文转载自:http://blog.csdn.net/ce123_zhouwei/article/details/8562958 Linux内核中的信号机制--一个简单的例子 Author:ce123(http://blog.csdn.NET/ce123) 信号机制是类UNIX系统中的一种重要的进程间通信手段之一.我们经常使用信号来向一个进程发送一个简短的消息.例如:假设我们启动一个进程通过socket读取远程主机发送过来的网络数据包,此时由于网络因素当前主机还没有收到相应的数据,当前进程被设置

实验---反汇编一个简单的C程序(杨光)

反汇编一个简单的C程序 攥写人:杨光  学号:20135233 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ) 实验要求:  实验部分(以下命令为实验楼64位Linux虚拟机环境下适用,32位Linux环境可能会稍有不同) 使用  gcc –S –o main.s main.c -m32 命令编译成汇编代码, 代码如下: int g(int x) { retu

一个简单的Qt程序分析

本文概要:通过一个简单的Qt程序来介绍Qt程序编写的基本框架与一些Qt程序中常见的概念 #include <QApplication> #include <QPushButton> int main(int argc, char *argv[]) { QApplication app(argc, argv); QPushButton *button = new QPushButton("Quit"); QObject::connect(button, SIGNA

Linux系统学习笔记之 1 一个简单的shell程序

不看笔记,长时间不用自己都忘了,还是得经常看看笔记啊. 一个简单的shell程序 shell结构 1.#!指定执行脚本的shell 2.#注释行 3.命令和控制结构 创建shell程序的步骤 第一步:创建一个包含命令和控制结构的文件 第二步:修改这个文件的权限使它可以执行. 使用chmod u+x 第三步:执行shell sh /test/example.sh Shell变量 变量:是shell传递数据的一种方法,用来代表每个取值的符号名 shell有两类变量:临时变量和永久变量 临时变量是sh

实验--反汇编一个简单的C程序(李鹏举)

  攥写人:李鹏举  学号:20132201 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ) 实验部分(以下命令为实验楼64位Linux虚拟机环境下适用,32位Linux环境可能会稍有不同) 使用gcc –S –o main.s main.c -m32命令编译成汇编代码. 代码如下: int g(int x) { return x + 8; } int f(i

反汇编一个简单的C程序

一.实验截图 二.汇编代码分析: cpu首先执行main函数里的pushl %ebp和movl %esp %ebp.如下图: esp减去4就是向上移动4位到1,如下图: 把1赋值给esp,如下图: call f即为eip转到f执行,先push eip,再将f的地址传给eip. ... ... ... 太晚了,先略,以后补上,嘿嘿. 三.对于计算机是如何工作的? 首先是冯诺依曼体系,cpu不断的从内存中读取数据.而当每个程序要运行的时候,内存就把硬盘上的程序加载进来开始给cpu去执行. 基本就是这

《Linux内核分析》MOOC课程 完成一个简单的时间片轮转多道程序内核代码

上一篇文章中介绍了一个进程执行的过程,分析了在调用子程序时栈的变化过程.本文介绍一下多进程的执行过程,当一个进程需要停下来等待某个条件或者cpu给它分配的时间片用完时需要切换给别的进程,在切换时首先会产生一个中断,然后cpu会执行相应的中断处理操作,比如一个重要的操作就是保护当前进程的栈和cpu寄存器的值,当cpu再次调度时可以恢复上一次状态继续执行下去. 按照mykernel上的步骤安装好程序,执行qemu -kernel arch/x86/boot/bzImage看到如下图: 执行的程序如下