(1)
int main() { int i=1; while (i<10) { printf("%d %s/n",i,"Aul0r"); i++; } return 0; }
int i=1; 003813BE mov dword ptr [i],1 while (i<10) 003813C5 cmp dword ptr [i],0Ah ;比较i和10 003813C9 jge main+56h (3813F6h) ;i>=10则跳转,跳出循环 { printf("%d %s/n",i,"Aul0r"); 003813CB mov esi,esp 003813CD push offset string "Aul0r" (385744h) ;字符串地址压入堆栈 003813D2 mov eax,dword ptr [i] ;eax=i 003813D5 push eax ;参数入栈 003813D6 push offset string "%d %s/n" (38573Ch) 003813DB call dword ptr [__imp__printf (3882BCh)] ;调用printf函数输出 003813E1 add esp,0Ch ;弹出0Ch字节 003813E4 cmp esi,esp 003813E6 call @ILT+310(__RTC_CheckEsp) (38113Bh) i++; 003813EB mov eax,dword ptr [i] ;eax=i 003813EE add eax,1 003813F1 mov dword ptr [i],eax ;i加1 } 003813F4 jmp main+25h (3813C5h) ;无条件跳转到比较处,继续循环 return 0; 003813F6 xor eax,eax
do…while实现机制类似。但是是先输出,然后比较
(2)for语句实现机制 前面笔记中有
(3)continue和break实现机制
在汇编中都用jmp无条件跳转指令实现
区别:
continue是跳转到修改循环条件的地方
break是跳转到循环外面,即跳过循环,在极端的情况下break还会忽略后面的语句和删除循环结构的某些跳转指令。