关于一个加法优化的一个地方.....

#include <stdlib.h> 
#include <stdio.h> 
#include "Base.h"

int main(int argc, char* argv[], char* envp[])  
{  

int nNum;
int nA = 12;


nNum = argc + nA;
printf("%d\r\n", nNum);


nNum = argc + 9;
printf("%d\r\n", nNum);


nNum = nNum + 1;
printf("%d\r\n", nNum);

return 0;


下面是汇编:

01291000 >/$  55            PUSH EBP
01291001  |.  8BEC          MOV EBP,ESP
01291003  |.  56            PUSH ESI
01291004  |.  8B35 A0202901 MOV ESI,DWORD PTR DS:[<&MSVCR100.printf>>;  MSVCR100.printf
0129100A  |.  57            PUSH EDI
0129100B  |.  8B7D 08       MOV EDI,DWORD PTR SS:[EBP+8]             ;  EDI的值变为1
0129100E  |.  8D47 0C       LEA EAX,DWORD PTR DS:[EDI+C]             ;  EAX的值变为9
01291011  |.  50            PUSH EAX                                 ; /<%d>
01291012  |.  68 F4202901   PUSH OFFSET Bug_C++.??_C@_04HGIPLDBL@?$C>; |format = "%d
"
01291017  |.  FFD6          CALL ESI                                 ; \printf
01291019  |.  83C7 09       ADD EDI,9
0129101C  |.  57            PUSH EDI
0129101D  |.  68 F4202901   PUSH OFFSET Bug_C++.??_C@_04HGIPLDBL@?$C>;  ASCII "%d
"
01291022  |.  FFD6          CALL ESI
01291024  |.  47            INC EDI
01291025  |.  57            PUSH EDI
01291026  |.  68 F4202901   PUSH OFFSET Bug_C++.??_C@_04HGIPLDBL@?$C>;  ASCII "%d
"
0129102B  |.  FFD6          CALL ESI
0129102D  |.  83C4 18       ADD ESP,18
01291030  |.  5F            POP EDI
01291031  |.  33C0          XOR EAX,EAX
01291033  |.  5E            POP ESI
01291034  |.  5D            POP EBP
01291035  \.  C3            RETN


0129100B  |.  8B7D 08       MOV EDI,DWORD PTR SS:[EBP+8]             ;  EDI的值变为1
0129100E  |.  8D47 0C       LEA EAX,DWORD PTR DS:[EDI+C]             ;  EAX的值变为9

mov edi, dword ptr ss:[ebp + 8]

把内存单元中的内容送入edi

lea eax, dword ptr ds:[edi + c]

这里之所以要用lea是因为lea载入的是相对偏移地址...就是edi + c的结果..

如果用add做

mov eax, 8(或者在内存中取)

add eax, edi

因为两个数不可能是立即数...所以只能从内存中拿...如果用mov 则一共需要3条指令

mov eax, 9

mov edi, xxxx

add eax, edi


但是用lea就可以将指令缩短为2条..因为它支持3个OP的操作...

lea eax, dword ptr ds:[edi + 9]

这样无形中节约了一条指令..


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值