gdb反汇编详解C函数底层实现笔记
来源:互联网 发布:上瘾网络剧 豆瓣评分 编辑:程序博客网 时间:2024/06/05 19:17
这篇文章对于初学者是很有帮助的,我把它转载过来。下文中可能有乱码现象,自己在linux下打开一个程序就行反汇编就好。
以下是在读《深入理解计算机系统》前面的章节“程序的机器级表示”时,自己动手在linux上使用了gdb对一个简单的C程序进行反汇编,通过不懈的努力终于查清楚弄明白了绝大多数的语句。且均以注释的形式列在汇编语句后面。
说明:
反汇编指令使用的是:gdb disas [function-name]。另外也可以使用:objdump -d/-D obj-name对整个程序进行反汇编(通过这个反汇编,你可以发现main函数并非一个程序的入口而是__start函数!)。
程序很简单,就两个函数:sum和main,源码如下:
#include
int sum(int x, int y)
{
}
int main( int argc, char **argv)
{
}
编译源程序,不使用优化选项并反汇编分析:
gcc -o test test.c得到test
gdb test
(gdb) disas sum
(gdb) disas main
查看反汇编后的代码
Dump of assembler code for function sum:
0x08048354 :
0x08048355 :
0x08048357 :
0x0804835a :
0x08048361 :
0x08048364 :
0x08048367 :
0x0804836a :
0x0804836d :
0x08048370 :
0x08048373 :
0x08048374 :
main函数反汇编结果:
0x08048375 :
0x08048379 :
0x0804837c :
0x0804837f :
//pushl push都使用了的原因:当要压栈的对象已经确定(也就是说已经知道是字节、字或者双字),那么使用push就不会产生歧义,也就是说汇编器可以自己判断自己要操作的是什么长度的操作对象;但是当汇编器不能自己判断操作对象长度时,就需要使用pushl之类的指令来指明操作对象长度(类似的还有 mov,movl;lea,leal等);
上面的%ebp指的是esp寄存器吧,这是一个32位的寄存器,汇编器是知道这个寄存器存放的是 dworld,不需要显式的指明也没有歧义;而 0xfffffffc(�x)是使用基址寻址方式指向的一个内存空间,内存是连续的,汇编器不能仅仅根据一个内存地址就判断出那里存放的数据的长度,所以直接这样写就会产生歧义,所以要使用pushl之类的指令来指明要操作的数据的长度;
0x08048380 :
0x08048382 :
0x08048383 :
0x08048386 :
0x0804838d :
0x08048394 :
0x08048397 :
0x0804839b :
0x0804839e :
0x080483a1 :
0x080483a6 :
0x080483a9 :
0x080483ac :
0x080483b0 :
0x080483b7 :
0x080483bc :
0x080483c1 :
0x080483c4 :
0x080483c5 :
0x080483c6 :
0x080483c9 :
0x080483ca :
0x080483cb :
0x080483cc :
0x080483cd :
0x080483ce :
0x080483cf :
编译源程序,使用 -O1 优化选项并反汇编分析:
使用 -O1优化后的程序反汇编后的结果:可见优化主要在减少了存取内存的次数,节省了内存空间
Dump of assembler code for function sum:
0x08048354 :
0x08048355 :
0x08048357 :
0x0804835a :
0x0804835d :
0x0804835e :
End of assembler dump.
Dump of assembler code for function main:
0x0804835f :
0x08048363 :
0x08048366 :
0x08048369 :
0x0804836a :
0x0804836c :
0x0804836d :
0x08048370 :
0x08048378 :
0x0804837f :
0x08048384 :
0x08048388 :
0x0804838f :
0x08048394 :
0x08048399 :
0x0804839c :
0x0804839d :
0x0804839e :
0x080483a1 :
0x080483a2 :
0x080483a3 :
0x080483a4 :
编译源程序,使用优化选项 -O2并反汇编分析:
使用 -O2优化后的程序反汇编后的结果:可见较-O1级优化又有大幅的缩短(代码长度)
Dump of assembler code for function sum:
End of assembler dump.
Dump of assembler code for function main:
- gdb反汇编详解C函数底层实现笔记
- gdb反汇编详解C函数底层实现笔记(程序堆栈、内存分配)
- gdb反汇编详解C函数底层实现笔记(程序堆栈、内存分配)
- gdb 反汇编.c程序
- main函数反汇编详解
- 反汇编 函数的调用和实现_笔记
- gdb反汇编小结
- GDB 反汇编
- GDB反汇编
- gdb反汇编
- gdb反汇编
- gdb 的反汇编
- 反汇编C语言的函数
- gdb中反汇编调试
- c&c++反汇编与逆向分析学习笔记(4)--启动函数和用户入口
- c反汇编学习汇编
- 反汇编 c++/c 确定main函数的位置
- 函数反汇编
- 115个Java面试题和答案——终极列表(下)
- HashMap实现原理
- 【splay启发式合并】bzoj 2733 永无乡
- Lucene/spellChecker拼写纠错
- 【PAT】1039. Course List for Student (25)
- gdb反汇编详解C函数底层实现笔记
- placement new的用法及用途
- 黑马程序员——protocol简单使用
- js制作鼠标移动提示层
- iOS中两种定时器的使用和区别
- php 时间函数
- Wifi属性信息
- centos6.5部署svn服务器并同步到同机器的web目录
- HDU2446