从汇编看for循环

从汇编看for循环

 

看看在汇编中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:

 

很清楚了,让人容易搞错的地方就是会认为“表达式三”比“内嵌语句”先执行,而实际上是内嵌语句先执行,虽然“表达式三”的汇编代码在内嵌语句的前面,也在“表达式二”的前面,通过编译器输出的汇编代码可以得到澄清了。

 

你可能感兴趣的:(c,汇编,语言,编译器)