从简单的算法初探过程汇编
2012-02-09 10:34
211 查看
不忽视汇编
较于我们日常接触的高级语言,诸如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中位的和。
收获
发现这样一个小小的递归程序,分析起它反汇编如有一种返璞归真的感觉,对理解“递归调用”会更为清晰的思路。纵观上面的分析,递归调用虽然是算法中解决问题常用的方法,但是它对付起庞大递归次数的程序来说(上面因为分析所以选取的递归次数较少),非常消耗内存。 所以在写程序的时候,在时间和空间的消耗抉择上,需要谨慎。通过学习汇编和反汇编代码的分析,将更了解机器的行为,从而写出更为高效的代码。相关文章推荐
- 从简单的算法初探过程汇编
- 从简单的算法初探过程汇编
- 从简单的算法初探过程汇编 栈帧指针 .
- 从简单的算法初探过程汇编 栈帧指针
- 简单汇编程序编译链接执行过程
- 简单反汇编之狐狸吃兔子算法
- 简单反汇编之还原(谁是窃贼算法)C++代码
- 简单OS开发前奏(三)操作系统装载过程及BootSector的汇编语言实现
- 2.1 线性回归算法学习——简单线性回归算法的原理及推导过程
- 面试过程中遇到的几个简单的算法
- Spring源码解析:简单容器中Bean的加载过程初探
- Linux汇编代码学习,反汇编简单的c及分析汇编代码工作过程
- 一个简单程序的汇编执行过程分析
- 20135239益西拉姆 Linux内核分析 汇编一个简单的c程序并分析其指令过程
- J2ME平台A-RPG游戏怪物寻路算法初探
- Windows 系统编程初探 (六)结构化异常处理之三:SEH 的简单应用
- 使用存储过程实现进销存系统中的先进先出算法(1)――数据库与存储过程设计
- 线性表的应用,计算任意两个表简单自然连接过程讨论线性表的应用(参考数据结构教程 李春葆)
- 微软面试中简单的算法题目(转)
- android build 过程 (ramdisk.img、sytem.img、userdata.img)和 启动过程简单分析