[转] 通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
原文:http://blog.sina.com.cn/s/blog_7608db8f0102vndr.html
gdb 调试还可以这样用!!
__________________
.对汇编代码分析
用gdb调试跟踪,观察汇编指令执行后,寄存器的情况变化,分析计算机的执行变化。
gcc -g -o main main.c -m32
gdb main
b main
r
layout split
然后通过si单步调试,得到下面这些图,并利用堆栈分析。图中黑色背景的指令,表示下一步要执行的指令,也是eip指向的地址。用r命令调试时,main函数执行的是一条c语句,前四条汇编语句执行后寄存器的结果不能用图显示,这里也用堆栈分析。
程序开始时的堆栈情况
_______________________
几乎所有有计算功能的电子设备,其核心功能基本可以用冯诺依曼体系结构来描述。冯诺依曼体系结构就是指存储程序计算机,从硬件的角度看,逻辑上可以抽象看做是一部分是CPU,一部分是内存,通过总线连接。CPU中有很多寄存器,比较重要的寄存器是IP,指向内存中的代码段,CPU根据CS、IP读取执行指令。从程序员的角度看,CPU可以抽象成一个不断执行下一条指令的循环结构,内存存储指令和数据,CPU 解释和执行指令。
CPU识别什么样的指令,除了API,CPU还有一个ABI(ApplicationBinaryInterface)--应用二进制接口,这里只要关注汇编语言,指令的编码,指令中寄存器的使用约定等。那么单任务计算机是怎么工作的,这里通过分析汇编代码来理解。
1.知识准备
用到的汇编指令的作用
2.实验环境
实验楼64位linux虚拟机
3.实验步骤
使用c语言程序如下,命名为main.c
int g(int x)
{
return x + 1;
}
int f(int x)
{
return g(x);
}
int main(void)
{
return f(7) + 2;
}
终端输入
gcc -S -o main.s main.c -m32
把main.c程序编译成汇编代码main.s,以.开始的代码行是用于链接的辅助信息,不会被实际执行,删掉这些行得到干净的汇编代码如下
4.对汇编代码分析
用gdb调试跟踪,观察汇编指令执行后,寄存器的情况变化,分析计算机的执行变化。
gcc -g -o main main.c -m32
gdb main
b main
r
layout split
然后通过si单步调试,得到下面这些图,并利用堆栈分析。图中黑色背景的指令,表示下一步要执行的指令,也是eip指向的地址。用r命令调试时,main函数执行的是一条c语句,前四条汇编语句执行后寄存器的结果不能用图显示,这里也用堆栈分析。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2019-11-26 【转】win10硬盘序列号查看方法
2019-11-26 littlefs了解一下
2019-11-26 ulimit命令
2019-11-26 [转]SSH 反向隧道 内网穿透,AutoSSH自动重连
2016-11-26 【转】linux ls -l的详解
2016-11-26 git 使用系列(二)---- 分支和合并
2016-11-26 git repository 的使用