从简单的算法初探过程汇编
2012-02-08 17:44
204 查看
不忽视汇编
较于我们日常接触的高级语言,诸如c语言,c++,java等等,汇编语言是更接近机器的语言,它的常用操作简单到把一个数值(立即数,寄存器数或者存储器数据)加载到寄存器,正是这样,所以让汇编完成一个程序任务,过程会比较晦涩;高级语言隐藏了很多的机器细节(比如过程(函数)栈帧的初始化,以及过程结束时栈帧的恢复),代码清晰易懂。真佩服六七十年代那些大牛们,都是怎么过来的...膜拜膜拜。写一个100以内整数的和,即使有充分的汇编文档,这也足够折腾我一阵子,太恶心了。但是了解汇编的行为方式和其中的一些重要细节,有助于理解计算机软件和硬件的工作方式。我就一个简单的算法来认识一下汇编。
过程汇编前奏
过程可以理解为c中的函数,当调用者(caller)调用被调用者(be caller)的时候,系统会为被调用者在栈内分配空间,这个空间就称为栈帧。栈的结构大概如下:View Code
# fun(i);
#00411445 mov eax,dword ptr [i]
#00411448 push eax
#00411449 call fun (4110E6h)
0041144E add esp,4
return 0;
00411451 xor eax,eax
0x0041144E处,add %esp,4,目的是释放一开始入栈的fun的参数,而主函数返回0(return 0),也是用到了异或逻辑运算xor来讲%eax清零。
到这里,相信有点明白了,在递归调用过程中,程序栈是如何变化的,并且上面的函数计算参数i中位的和。
收获
发现这样一个小小的递归程序,分析起它反汇编如有一种返璞归真的感觉,对理解“递归调用”会更为清晰的思路。纵观上面的分析,递归调用虽然是算法中解决问题常用的方法,但是它对付起庞大递归次数的程序来说(上面因为分析所以选取的递归次数较少),非常消耗内存。 所以在写程序的时候,在时间和空间的消耗抉择上,需要谨慎。通过学习汇编和反汇编代码的分析,将更了解机器的行为,从而写出更为高效的代码。文章有点长,欢迎讨论。
捣乱小子 2012年2月8日星期三
相关文章推荐
- 从简单的算法初探过程汇编 栈帧指针
- 从简单的算法初探过程汇编
- 从简单的算法初探过程汇编
- 从简单的算法初探过程汇编 栈帧指针 .
- 2.1 线性回归算法学习——简单线性回归算法的原理及推导过程
- 简单汇编程序编译链接执行过程
- 简单反汇编之狐狸吃兔子算法
- Spring源码解析:简单容器中Bean的加载过程初探
- 简单反汇编之还原(谁是窃贼算法)C++代码
- 简单OS开发前奏(三)操作系统装载过程及BootSector的汇编语言实现
- 面试过程中遇到的几个简单的算法
- Linux汇编代码学习,反汇编简单的c及分析汇编代码工作过程
- 一个简单程序的汇编执行过程分析
- 20135239益西拉姆 Linux内核分析 汇编一个简单的c程序并分析其指令过程
- JSPWiki的配置过程和简单应用
- spring IoC容器构造bean过程简单分析
- 电商搜索与分词算法简单记录
- 最简单的问题与算法(求最大约数)
- 一个连通图,采用邻接表作为存储结构,设计一个算法从顶点v出发的深度优化遍历的非递归过程
- Win32汇编教程三 一个简单的对话框 --- 兼谈资源文件的使用