先看看下面这段返回点代码
int __cdecl main(int argc, const char **argv, const char **envp)
.text:00401000 _main proc near ; CODE XREF: start+AF↓p
.text:00401000
.text:00401000 argc = dword ptr 4
.text:00401000 argv = dword ptr 8
.text:00401000 envp = dword ptr 0Ch
.text:00401000
.text:00401000 mov ecx, 0C0h
.text:00401005 xor eax, eax
.text:00401007
.text:00401007 loc_401007: ; CODE XREF: _main+D↓j
.text:00401007 sub ecx, eax
.text:00401009 inc eax
.text:0040100A cmp eax, 0Ah
.text:0040100D jl short loc_401007
.text:0040100F push ecx
.text:00401010 push offset aNumD ; "num = %d\n"
.text:00401015 call sub_401020
.text:0040101A add esp, 8
.text:0040101D xor eax, eax
.text:0040101F retn
.text:0040101F _main endp
这段程序是一个循环,循环示意图如下图
运行上面代码
返回的结果是:
用IDA的F5功能
直接翻译出如下代码
下面我们运行下面的C代码 运行结果复合预期。
#include<Windows.h>
#include<stdio.h>
int main()
{
int v3; // ecx
int i; // eax
v3 = 192;
for (i = 0; i < 10; ++i)
v3 -= i;
printf("num = %d\n", v3);
return 0;
}
运行结果
我们把上面for语句改为do while结构看下运行结果复合预期
#include<Windows.h>
#include<stdio.h>
int main()
{
int v3 = 192; // ecx
int i = 0; // eax
do
{
v3 -= i;
i++;
} while (i<10);
printf("num = %d\n", v3);
return 0;
}