对于循环结构而言,主要就三种,do-while循环,while循环,for循环,这三种循环,在debug下其特点还是比较明显的,在release下的话可以说基本上都被优化为do-while循环(效率高),所以说release下的循环,根据其汇编代码我们只能做等价的还原。
下面先来看do-while循环
int main(int argc, char* argv[])
{
int i = 0;
int sum = 0;
do
{
sum += i;
++i;
} while (i < argc);
printf("%d\r\n",sum);
return 0;
}
对应的汇编代码
9: int i = 0;
0040D718 C7 45 FC 00 00 00 00 mov dword ptr [ebp-4],0
10: int sum = 0;
0040D71F C7 45 F8 00 00 00 00 mov dword ptr [ebp-8],0
11: do
12: {
13: sum += i;
0040D726 8B 45 F8 mov eax,dword ptr [ebp-8]
0040D729 03 45 FC add eax,dword ptr [ebp-4]
0040D72C 89 45 F8 mov dword ptr [ebp-8],eax
14: ++i;
0040D72F 8B 4D FC mov ecx,dword ptr [ebp-4]
0040D732 83 C1 01 add ecx,1
0040D735 89 4D FC mov dword ptr [ebp-4],ecx
15: } while (i < argc);
0040D738 8B 55 FC mov edx,dword ptr [ebp-4]
0040D73B 3B 55 08 cmp edx,dword ptr [ebp+8]
0040D73E 7C E6 jl main+26h (0040d726) 小于则跳转
可以发现,do-while循环的汇编代码和高级代码的逻辑真的是一模一样,对于其跳转的逻辑也是一样的(if相反),因为对于循环而言,条件满足则进行循环,这里和汇编的逻辑也是一样的,条件满足进行跳转。
对于Do-While循环的大体架构如下:
DO_BEGIN:
//.... 中间循环体
jxx DO_BEGIN //这里是一个减量地址
DO_END:
这里do-while循环的release版本与debug结构是类似的,所以这里就不分析了。
下面再来看while循环
int main(int argc, char* argv[])
{
int i = 0;
int sum = 0;
while (i < argc)
{
sum += i;
++i;
}
printf("%d\r\n",sum);
return 0;
}
对应的反汇编代码
9: int i = 0;
0040D718 C7 45 FC 00 00 00 00 mov dw