1、do-while 循环
do-while 语句的通用形式如下:
do
body-statement
while(test-expr);
do-while 的通用形式可以翻译成如下所示的条件和 goto 语句:
loop:
body-statement
t = test-expr;
if (t)
goto loop;
理解产生的汇编代码与原始代码之间的关系,关键是找到程序值和寄存器之间的映射关系。
2、while 循环
while 语句的通用形式如下:
while (test-expr)
body-statement
将 while 循环翻译成机器代码有很多种方法。一种常见的方法,也是 GCC 采用的方法是使用条件分支,在需要时省略循环体的第一次执行,从而将代码转换成do-while循环,如下:
if (!test-expr)
goto done;
do
body-statement
while (test-expr)
done:
接下来,这个代码可以直接翻译成 goto 代码,如下:
t = test-expr;
if (!t)
goto done;
loop:
body-sttement
t = test-expr;
if (t)
goto loop;
done:
使用这种实现策略,编译器常常会优化最开始的测试,比如说认为总是满足测试条件。
3、for 循环
for 循环的通用形式如下:
for (init-expr; test-expr; update-expr)
body-statement
C 语言标准说明(注意:当循环体中有continue时,不可直接转换),这样的一个循环的行为与下面这段使用 while 循环代码的行为一样:
init-expr;
while (test-expr)
{
body-statement;
update-expr;
}
这段代码编译后的形式,基于前面讲过的从 while 到 do-while 的转换,首先给出 do-while 形式:
init-expr;
if (!test-expr)
goto done;
do
{
body-statement
update-expr;
}while (test-expr);
done:
然后,将踏转换成 goto 代码:
init-expr;
t = test-expr;
if (!t)
goto done;
loop:
body-statement
update-expr;
t = test-expr;
if (t)
goto loop:
done: