登 录
#include "stdafx.h" void main() { short a =12; /************************************************************************/ /* 下面这两个计算效率其实是一样的,汇编码如下 a=a+a; 00412513 movsx eax,word ptr [a] 00412517 movsx ecx,word ptr [a] 0041251B add eax,ecx 0041251D mov word ptr [a],ax a += a; 00412521 movsx eax,word ptr [a] 00412525 movsx ecx,word ptr [a] 00412529 add ecx,eax 0041252B mov word ptr [a],cx */ a=a+a; a += a; _asm { push ax;保护代码 mov ax , a;;下面这三行代码是实现a=a+a,所以从实际效果看,用汇编写的代码有可能会比编译器优化做的更好 add ax,ax; mov a,ax; pop ax;//恢复现场 } /************************************************************************/ //当表达式当中不含有变量时,编译器会直接做优化,如下所有的生成的汇编码都是mov word ptr [a],22h a= 34; a= 22+12; a= 2*(5+6)+12; a= 1*(2*(5+6))+12;//编译器在做这类没有变量的运算时直接优化成即该常量表达式的值付给a /************************************************************************/ //当表达式当中含有变量时,如下所示 /* 下面虽然三种表达式虽然都是求一个值,但是由于写法的不同,会生成不同长度的汇编码,基本上表达式越精简,产生的汇编语句越少 a= 1*(3*(5+a))+12; 00412505 movsx eax,word ptr [a] 00412509 add eax,5 0041250C imul eax,eax,3 0041250F add eax,0Ch 00412512 mov word ptr [a],ax a=15+3*a+12;//对15和12进行了合并 00412516 movsx eax,word ptr [a] 0041251A imul eax,eax,3 0041251D add eax,1Bh 00412520 mov word ptr [a],ax a=27+3*a; 00412524 movsx eax,word ptr [a] 00412528 imul eax,eax,3 0041252B add eax,1Bh 0041252E mov word ptr [a],ax */ /************************************************************************/ a= 1*(3*(5+a))+12; a=15+3*a+12; a=27+3*a; /************************************************************************/ /* 但是表达式如果分着写是效率最低的,关于如下表达式与上边的三个目的相同,但是 产生了六条汇编语句 short b=3*a; a=27+b; //但是请注意如果表达式较复杂时,这种编写方式程序是最容易维护的,同时也是最灵活的,因为子表达式的名称可以表示实际意义 short b=3*a; 00412574 movsx eax,word ptr [a] 00412578 imul eax,eax,3 0041257B mov word ptr [b],ax a=27+b; 0041257F movsx eax,word ptr [b] 00412583 add eax,1Bh 00412586 mov word ptr [a],ax */ /************************************************************************/ short b=3*a; a=27+b; printf("%d/n",a); getchar(); }
没事捉摸捉摸这些东西非常有好处。
抱歉!评论已关闭.