x86_64汇编循环翻译通用方法
do-while循环的通用形式如下:
do
body-statement
while(test-expr);
->
loop
body-statement
t = test-expr
if(t)
goto loop;
while循环的通用形式如下:
while(test-expr)
body-statement
将会产生两种翻译方法:
第一种翻译方法:
我们称为跳转到中间(jump to middle),它执行一个无条件跳转到循环结尾处的测试,以此来执行初始的测试。
-->
goto test:
loop:
body-statement
test:
t = test-expr;
if(t)
goto loop;
第二种翻译方法:
我们称之为guarded-do,首先使用条件分支,如果初始条件不成立就跳过循环,把代码变换为do-while循环。当使用较高优化等级编译时,例如采用-O1参数,GCC会采用这种策略。当采用这种策略时,编译器常常可以优化初始的测试,例如认为测试条件总是满足。
-->
t = test-expr
if(!t)
goto done;
loop:
body-statement
t = test-expr;
if(t)
goto loop;
done:
for循环的通用形式如下:
for(init-expr; test-expr; update-expr)
body-statement
GCC为for循环产生的代码是while循环的两种翻译之一,这取决于优化的等级。
跳转到中间策略产生的代码如下:
init-expr;
goto test;
loop:
body-statement
update-expr;
test:
t = test-expr;
if(t)
goto loop;
guarded-do策略产生的代码如下:
init-expr;
t = test-expr;
if(!t)
goto done;
loop:
body-statement
update-expr;
t = test-expr;
if(t)
goto loop;
注意:
在C语言中执行continue语句会导致程序跳到当前循环迭代的结尾。
当处理continue语句时,将for循环翻译成while循环的描述规则需要一些改进。