找回密码
 欢迎注册
查看: 13928|回复: 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-11-22 00:00 , Processed in 0.033599 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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