汇编优化经验分享
汇编语言并不常用。在csdn的回帖中,当别人问题汇编语言有什么用时,我一般这样说:1.实现一些高级语言不能实现的功能,如操作系统的boot代码,病毒,软件加密,SIMD(但指令多数据) 指令加速。
2.为了使得程序尽可能小,现在内存越大,这方面的需求不太强烈了。但是如果你想展示一些编程技巧或者为了某个特殊的目的,使得程序尽可能小,汇编就可以派上用场了。
3.使得程序尽可能快。优化分为空间优化和时间优化。而时间优化一般首先优化算法,最后则是用汇编改写其关键部分,甚至动用SIMD(但指令多数据)指令。
本帖主要讨论一些减小代码的汇编语言编程技巧,欢迎大家讨论。 1.累加器就有更短的编码,看似同样的指令其所占空间并不相同
80E905 SUB CL,05
2C05 SUB AL,05
可以看到,使用al寄存器减去一个立即数,使用2个byte。而使用cl寄存器,同样的指令格式却需要3个字节。
2. 巧用lea 指令可以节省内存空间
在编程中,经常需要实现 x= y-1 这样的操作,
方法1,常用写法(左边为机器码,下同),占用2+3=5个字节,见下
8b d8 mov ebx, eax
83 eb 01 sub ebx, 1
方法2:这种方法占用2+1=3个字节
8b d8 mov ebx, eax
4b dec ebx
方法3:只需一条指令,占用3个字节
8d 58 ff lea ebx, DWORD PTR
另一个类似的例子,求y=x+2
方法1:占用5个字节
8b d8 mov ebx, eax
83 c3 02 add ebx, 2
方法2:仅仅一条指令,占用3个字节
8d 58 02 lea ebx, DWORD PTR 呵呵
lea虽然短
不见得速度快啊 dec 也是:它不比 sub 高效。
但楼主讨论的是“减小代码”的汇编,这里确实有很多技巧的。
(我记得楼主曾设过擂台:用最少字节的程序计算大数阶乘)
页:
[1]