黑客风云——风云网络
设为首页 加入收藏 我要投稿 网站地图

您现在的位置: 黑客风云 >> 黑客文章 >> 黑客进阶 >> 软件破解 >> 正文
·完美空间提供500M免费AS04-10·企业安全之YY内网准入以04-09
·企业安全之意识与策略04-09·剑走偏锋:IIS漏洞利用04-09
·我来免费网提供100M免费04-09·1122mb.com提供20G超大免04-08
·映像劫持与反劫持技术04-07·让所有"暴力删除工具"无04-07
·入侵88red系统的详细过程04-07·Sql Injection脚本注入终04-07
·vbs+delphi 反弹后门生成04-07·飞讯网提供100MB免费PHP04-07
·突破SQL注入攻击时输入框04-04·结合内核和病毒技术的最04-04
·Real Player rmoc3260.d04-04·亿万网络今月最后为您提04-04
·php+mysql 5 sql inject04-03·Real Player rmoc3260.d04-03
·oblog文件下载漏洞04-03·免费啦提供1G-2G免费全能04-03
·完全解析网页后门和挂马04-02·一句话开3389(只测试过04-02
·萧萧免费空间网提供100M04-02·谷道免费空间网提供1G免04-01
·从本地入手解决双线路由03-31·sablog 1.6 多个跨站漏洞03-31
·富文本编辑器的跨站脚本03-31·Cookie注入是怎样产生的03-31
[推荐]汇编知识:32位汇编代码优化
      ★★★★★

汇编知识:32位汇编代码优化

文章整理发布:黑客风云 文章来源:www.05112.com 更新时间:2006-12-2 11:22:32

代码优化的含义: 对于PEDIY的朋友有帮助

代码优化的目标当然是体积小和速度快,但是在通常的情况下二者就象鱼和熊掌一样不能得兼,我们通常寻找的是这二者的折中,究竟应该偏向何方,那就得具体看我们的实际需要.

但有些常识是我们应该牢记的,下面就结合我们最常遇到的具体情况来漫谈一下:

1.寄存器清0
我绝对不想再看到下面的写法:
1) mov eax, 00000000h ;5 bytes
看起来上面的写法很符合逻辑,但你应当意识到还有更加优化的写法:
2) sub eax, eax ;2 bytes
3) xor eax, eax ;2 bytes
看看后面的字节数你就应该理解为什么要这么作了,除此之外,在速度上也没有损失,他们一样快,但你喜欢xor还是sub呢?我是比较喜欢xor,原因很简单,因为我数学不好....
不过Microsoft比较喜欢sub....我们知道windows运行的慢....(呵呵,当然是玩笑这并不是真正原因X-D!)


2.测试寄存器是否为0
我也不希望看到下面的代码:
1) cmp eax, 00000000h ;5 bytes
je _label_ ;2/6 bytes (short/near)
[* 注意很多指令针对eax作了优化,你要尽可能多地实用eax,比如CMP EAX, 12345678h (5 bytes)
如果你使用其他寄存器,就是6bytes *]
让我们看看,简单的比较指令居然要用7/11 bytes,No No No,试试下面的写法:
2) or eax, eax ;2 bytes
je _label_ ;2/6 (short/near)
3) test eax, eax ;2 bytes
je _label_ ;2/6 (short/near)
呵呵,只有4/8 bytes,看看我们可节省多少字节啊3/4字节...那么接下来的问题是你喜欢OR还是TEST呢,就我个人而言,比较喜欢TEST,因为test不改变任何寄存器,并不向任何寄存器写入内容,这通常能在pentium机上取得更快的执行速度.
别高兴的太早,因为还有更值得我们高兴的事情,假如你要判断的的是eax寄存器,那么看看下面的,是不是更有启发?
4) xchg eax, ecx ;1 byte
jecxz _label_ ;2 bytes
在短跳转的情况下我们比2)和3)又节省了1字节.oh....___...


3.测试寄存器是否为0FFFFFFFFh
一些API返回-1,因此如何测试这个值呢?看你可能又要这样:
1) cmp eax, 0ffffffffh ;5 bytes
je _label_ ;2/6 bytes
hey,不要这样,写代码的时候想一想,于是有了下面的写法:
2) inc eax ;1 byte
je _label_ ;2/6 bytes
dec eax ;1 byte
可以节省3 bytes并且执行速度会更快.


4.置寄存器为0FFFFFFFFh
看看假如你是Api的作者,如何返回-1?这样吗?
1) mov eax, 0ffffffffh ;5 bytes
看了上面的不会再这么XXX了吧?看看下面的:
2) xor eax, eax / sub eax, eax ;2 bytes
dec eax ;1 byte
节省一个字!还有写法:
3) stc ;1 byte
sbb eax, eax ;2 bytes
这有时还可以优化掉1 byte:
jnc _label_
sbb eax, eax ;2 bytes only!
_label_: ...
我们为什么用asm呢?这就是原因.


5.寄存器清0并移入低字数值
1) xor eax, eax ;2 bytes
mov ax, word ptr [esi+xx] ;4 bytes
????--->不会吧,这可能是最多初学者的写法了,我当然原来也是,看了benny的文章之后我决定改写为:
2) movzx eax, word ptr [esi+xx] ;4 bytes
收获2 bytes!
下面的
3) xor eax, eax ;2 bytes
mov al, byte ptr [esi+xx] ;3 bytes
就相应改为:
4) movzx eax, byte ptr [esi+xx] ;4 bytes
我们应当尽可能利用movzx
5) xor eax, eax ;2 bytes
mov ax, bx ;3 bytes
因为执行速度不慢并通常能节省字节...
6) movzx eax, bx ;3 bytes

[1] [2] [3] 下一页

文章录入:cainiaowang    责任编辑:cainiaowang 
  • 上一篇文章:

  • 下一篇文章:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    VIP 专 区
    Copyright @2006 黑客风云 ●业务联系:QQ 联系怪人 联系奇人 Email:给怪人发邮件 给奇人发邮件
    ICP备案:冀06009886