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