x86_64汇编循环翻译通用方法

x86_64汇编循环翻译通用方法

  1. do-while循环

do-while循环的通用形式如下:

do
	body-statement
	while(test-expr);

->

loop
	body-statement
	t = test-expr
	if(t)
			goto loop;
  1. while循环

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:
  1. for循环

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循环的描述规则需要一些改进。

你可能感兴趣的:(CSAPP)