首先来看看for循环,C++的代码如下
int temp =0;
for (int i = 0; i< 10; i ++)
{
temp = i;
}
对应汇编代码是:
0116136E mov dword ptr [temp],0
01161375 mov dword ptr [i],0
0116137C jmp wmain+37h (1161387h)
0116137E mov eax,dword ptr [i]
01161381 add eax,1
01161384 mov dword ptr [i],eax
01161387 cmp dword ptr [i],0Ah
0116138B jge wmain+45h (1161395h)
0116138D mov eax,dword ptr [i]
01161390 mov dword ptr [temp],eax
01161393 jmp wmain+2Eh (116137Eh)
让我们一行一行来解释
1.初始化temp变量,赋0
2.给循环的i赋值,赋0
3.这一行跳转到wmain+37h,也就是1161387h,在这里执行比较将i值与0ah(10)进行比较,
4.接下来会执行到0116138B:如果cmp的结果是i>=10,那么跳转至wmain+45h(1161395h)处,也就是循环体之外的第一条指令位置,然后结束循环
5.如果i<10,执行循环体,用两条mov将i值放到temp中,即temp = i;
6.随后jmp跳转至wmain+2eh(116137Eh)处,执行i++的操作,随后再次比较i是否小于10,直至i>=10跳出循环
然后是while语句
C++代码如下
int i= 0;
int temp =0;
while(i<10)
{
temp = i;
}
对应汇编代码如下:
00B6136E mov dword ptr [i],0
00B61375 mov dword ptr [temp],0
00B6137C cmp dword ptr [i],0Ah
00B61380 jge wmain+3Ah (0B6138Ah)
00B61382 mov eax,dword ptr [i]
00B61385 mov dword ptr [temp],eax
00B61388 jmp wmain+2Ch (0B6137Ch)
1.给i和temp赋值
2.将i和10进行比较
3.如果大于等于10则跳出循环
4.否则对temp进行赋值,然后跳到wmain+2ch(0b6137ch)处继续执行比较
看上去指令数比for要少很多,一共只有6条,不知道是否用while会拥有更好的性能,有待进一步研究。
do…while 语句
C++代码如下:
int i= 0;
int temp =0;
do
{
temp = i;
}
while(i<10)
对应汇编代码:
011E136E mov dword ptr [i],0
011E1375 mov dword ptr [temp],0
011E137C mov eax,dword ptr [i]
011E137F mov dword ptr [temp],eax
011E1382 cmp dword ptr [i],0Ah
011E1386 jl wmain+2Ch (11E137Ch)
1.给i赋0,给temp赋0
2.将i赋给temp
3.比较i是否小于10,如果成立跳转到wmain+2ch(11e137ch)处继续执行循环,否则跳出循环