个人总结,也可能和编译器与环境有关,没有绝对!下边以linux系统、AT&T指令集、GCC编译器为编译运行环境。
1.循环条件和下标的设立,尽量迁就下标操作,下标有加法的话,会增加计算偏移量的汇编语句。
比如这个十六进制转换十进制的例子,这个下标加2是为了跳过十六进制的开头"0x",(此例假设输入正确,直接跳,也可以加"0x"是否合法的判定,不赘述):
x11 input = "0x123"; x
x12
B+ x13 for(int i = 0;i < input.size() - 2;i++) x
x14 { x
B+ x15 if(input[i + 2] >= 'a' && input[i + 2] <= 'f')
x16 { x
x17 iTemp = input[i + 2] - 'a' + 10; x
x18 }else if(input[i + 2] >= 'A' && input[i + 2] <= 'F')
x19 { x
x20 iTemp = input[i + 2] - 'A' + 10; x
x21 }else if(input[i + 2] >= '0' && input[i + 2] <= '9') x
x22 { x
>x23 iTemp = input[i + 2] - '0'; x
x24 } x
x25 iResult = iResult * 16 + iTemp;
x26 }
尽量不要这样做,因为这样会有额外的加法产生,无论条件判断,还是内部操作
>x0x804894f <main()+379> mov 0x1c(%esp),%eax x
x0x8048953 <main()+383> add $0x2,%eax x
x0x8048956 <main()+386> mov %eax,0x4(%esp) x
x0x804895a <main()+390> lea 0x10(%esp),%eax x
x0x804895e <main()+394> mov %eax,(%esp) x
x0x8048961 <main()+397> call 0x8048674 <_ZNSsixEj@plt>
既然都是i+2,就把for循环改一下:
input = "0x123";
for(int i = 2;i < input.size() ;i++)
{
if(input[i] >= 'a' && input[i] <= 'f')
{
iTemp = input[i] - 'a' + 10;
}else if(input[i] >= 'A' && input[i] <= 'F')
{
iTemp = input[i] - 'A' + 10;
}else if(input[i] >= '0' && input[i] <= '9')
{
iTemp = input[i] - '0';
}
iResult = iResult * 16 + iTemp;
换此处
}
可读性可能略差一筹,但是这样执行效率更高:
>x0x8048937 <main()+355> mov 0x1c(%esp),%eax x
x0x804893b <main()+359> mov %eax,0x4(%esp) x
x0x804893f <main()+363> lea 0x10(%esp),%eax x
x0x8048943 <main()+367> mov %eax,(%esp) x
x0x8048946 <main()+370> call 0x8048674 <_ZNSsixEj@plt>
少了一次地址偏移量的计算!