找回密码
 欢迎注册
查看: 8656|回复: 3

[讨论] 汇编优化经验分享

[复制链接]
发表于 2008-8-26 11:21:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
汇编语言并不常用。在csdn的回帖中,当别人问题汇编语言有什么用时,我一般这样说:
  1.实现一些高级语言不能实现的功能,如操作系统的boot代码,病毒,软件加密,SIMD(但指令多数据) 指令加速。
  2.为了使得程序尽可能小,现在内存越大,这方面的需求不太强烈了。但是如果你想展示一些编程技巧或者为了某个特殊的目的,使得程序尽可能小,汇编就可以派上用场了。
  3.使得程序尽可能快。优化分为空间优化和时间优化。而时间优化一般首先优化算法,最后则是用汇编改写其关键部分,甚至动用SIMD(但指令多数据)指令。
  本帖主要讨论一些减小代码的汇编语言编程技巧,欢迎大家讨论。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 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 [eax-1]
  
另一个类似的例子,求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 [eax+2]
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-8-26 12:51:31 | 显示全部楼层
呵呵
lea虽然短
不见得速度快啊
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-8-26 13:17:25 | 显示全部楼层
dec 也是:它不比 sub 高效。

但楼主讨论的是“减小代码”的汇编,这里确实有很多技巧的。
(我记得楼主曾设过擂台:用最少字节的程序计算大数阶乘)
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-5-3 22:16 , Processed in 0.049687 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表