您的位置:首页 > 其它

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

2011-07-24 23:18 232 查看
#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]
这样无形中节约了一条指令..
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: