liangbch 发表于 2008-8-26 11:21:41

汇编优化经验分享

汇编语言并不常用。在csdn的回帖中,当别人问题汇编语言有什么用时,我一般这样说:
1.实现一些高级语言不能实现的功能,如操作系统的boot代码,病毒,软件加密,SIMD(但指令多数据) 指令加速。
2.为了使得程序尽可能小,现在内存越大,这方面的需求不太强烈了。但是如果你想展示一些编程技巧或者为了某个特殊的目的,使得程序尽可能小,汇编就可以派上用场了。
3.使得程序尽可能快。优化分为空间优化和时间优化。而时间优化一般首先优化算法,最后则是用汇编改写其关键部分,甚至动用SIMD(但指令多数据)指令。
本帖主要讨论一些减小代码的汇编语言编程技巧,欢迎大家讨论。

liangbch 发表于 2008-8-26 11:46:10

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

无心人 发表于 2008-8-26 12:51:31

呵呵
lea虽然短
不见得速度快啊

gxqcn 发表于 2008-8-26 13:17:25

dec 也是:它不比 sub 高效。

但楼主讨论的是“减小代码”的汇编,这里确实有很多技巧的。
(我记得楼主曾设过擂台:用最少字节的程序计算大数阶乘)
页: [1]
查看完整版本: 汇编优化经验分享