从汇编看for循环

写一个简短的C语言代码:
int main()
{
    int i;
    for(i=0;i<10;i++)
    {
       printf("%d /n",i);
    }
    return 0;
}
 
照例在编译的时候输出汇编代码,如下:
 
; 3    : int i;
; 4    : for(i=0;i<10;i++)
i=0
       mov DWORD PTR _i$[ebp], 0
跳到循环的开始
       jmp  SHORT $LN3@main
$LN2@main:
i++
       mov eax, DWORD PTR _i$[ebp]
       add  eax, 1
       mov DWORD PTR _i$[ebp], eax
 
循环的起始位置
$LN3@main:
 
以下两条汇编相当于:
if(i>=10)
{
 goto SHORT $LN1@main;
}
cmp DWORD PTR _i$[ebp], 10                 ; 0000000aH
       jge   SHORT $LN1@main
 
 
; 5    : {
; 6    :         printf("%d /n",i);
 
       mov ecx, DWORD PTR _i$[ebp]
       push ecx
       push OFFSET $SG590
       call  _printf
       add  esp, 8
 
; 7    : }
 
       jmp  SHORT $LN2@main
$LN1@main:
 
整个for循环如果再翻译成C语言,那么就相当于下面的样子:
i=0;
loop:
if(i>=0)
{
  goto endloop;
}
printf("%d/n",i);
i++;
goto loop;
 
endloop:
 
很清楚了,让人容易搞错的地方就是会认为“表达式三”比“内嵌语句”先执行,而实际上是内嵌语句先执行,虽然“表达式三”的汇编代码在内嵌语句的前面,也在“表达式二”的前面,通过编译器输出的汇编代码可以得到澄清了。

你可能感兴趣的:(从汇编看for循环)