32位汇编——c语言循环do——while
2017-09-03 22:16
459 查看
c语言中提供多种循环结构,即do-while while for,汇编中没有响应指令提供这三种循环
但是可以使用条件测试和跳转进行组合起来 以实现上述三种循环效果,
大多数汇编会根据一个循环的do-while来产生代码,但是实际c代码中相对较少用到这种循环,
这时其它的循环会转化为do-while形式,然后在编译为机器代码
do
body-statement
while (test-expr)
do-while循环至少会执行一次body-statement
而当将其翻译成goto语句如下:
loop:
body-statement
t = test-expr;
if ( t )
goto
c代码:完成1到N的累加
while的通用形式:
while(test-expr)
body=statement
在执行第一次循环之前对test-expr进行测试
而将while翻译为汇编有很多种方式一种常见的方法使用条件分支进行第一次循环前的条件测试
当通过了第一次条件测试之后相当于进入do-while循环
if(!test-expr)
goto done;
do
body-statement
while(test-expr)
done:
若将其翻译为goto语句代码则与do-while循环相差的仅仅是if处的分支
将上面do-while改为while型循环 这里只贴出汇编代码
movl 8(%ebp), %edx//将n %edx寄存器中
movl $1, %eax//初始result
for循环
for(init-expr;test-expr;update-expr)
body-statement
c语言标准说明(有一个例外),for循环与下面的while循环代码的行为相同
init-expr;
while(test-expr)
{
body-statement
update-expr;
}
综上所述,c语言中三种形式的循环 for while do-while都可以用一种简单的策略来翻译,即产生一个或多个条件分支的代码。
条件转移为循环 翻译成机器代码提供了基本机制
也就是说for循环转化为汇编前经过
for-->whle-->do-while-->goto-->汇编
在c语言中执行continue语句会导致程序跳到当前循环迭代的结尾。这时将for翻译成while需要进行一些改进
而解决方法是使用goto语句跳过while中余下的代码而到达update部分
例如
int sum = 0
int i;
for(i = 0; i< 10; i++)
{
if(i&1)
continue;
sum +=i;
}
for更改后的while代码
int sum = 0
int i = 0;
while(i<10)
{
if(i&1)
goto update;//将此处continue更改为goto
sum +=i;
update:
i++
}
但是可以使用条件测试和跳转进行组合起来 以实现上述三种循环效果,
大多数汇编会根据一个循环的do-while来产生代码,但是实际c代码中相对较少用到这种循环,
这时其它的循环会转化为do-while形式,然后在编译为机器代码
do
body-statement
while (test-expr)
do-while循环至少会执行一次body-statement
而当将其翻译成goto语句如下:
loop:
body-statement
t = test-expr;
if ( t )
goto
c代码:完成1到N的累加
int fact_do(int n) { int result = 1; do{ result += n; n = n-1; }while(n > 1) return nresult; }
汇编代码:
movl 8(%ebp), %edx//将n %edx寄存器中 movl $1, %eax//初始result .L2: addl %edx, %eax//相当于result += n subl $1, %edx//n减一 cmpl $1, %edx//测试条件 jg .L2//决定是否退出循环while循环翻译到汇编上和do-while是很相似的
while的通用形式:
while(test-expr)
body=statement
在执行第一次循环之前对test-expr进行测试
而将while翻译为汇编有很多种方式一种常见的方法使用条件分支进行第一次循环前的条件测试
当通过了第一次条件测试之后相当于进入do-while循环
if(!test-expr)
goto done;
do
body-statement
while(test-expr)
done:
若将其翻译为goto语句代码则与do-while循环相差的仅仅是if处的分支
将上面do-while改为while型循环 这里只贴出汇编代码
movl 8(%ebp), %edx//将n %edx寄存器中
movl $1, %eax//初始result
cmpl $1, %edx//执行do-while前的条件测试
jle .L3//如果第一次执行前的条件测试没有通过将跳过循环(不进入)
.L2: addl %edx, %eax//相当于result += n subl $1, %edx//n减一 cmpl $1, %edx//测试条件 jg .L2//决定是否退出循环.L3:
for循环
for(init-expr;test-expr;update-expr)
body-statement
c语言标准说明(有一个例外),for循环与下面的while循环代码的行为相同
init-expr;
while(test-expr)
{
body-statement
update-expr;
}
综上所述,c语言中三种形式的循环 for while do-while都可以用一种简单的策略来翻译,即产生一个或多个条件分支的代码。
条件转移为循环 翻译成机器代码提供了基本机制
也就是说for循环转化为汇编前经过
for-->whle-->do-while-->goto-->汇编
在c语言中执行continue语句会导致程序跳到当前循环迭代的结尾。这时将for翻译成while需要进行一些改进
而解决方法是使用goto语句跳过while中余下的代码而到达update部分
例如
int sum = 0
int i;
for(i = 0; i< 10; i++)
{
if(i&1)
continue;
sum +=i;
}
for更改后的while代码
int sum = 0
int i = 0;
while(i<10)
{
if(i&1)
goto update;//将此处continue更改为goto
sum +=i;
update:
i++
}
有不足或者错误的地方希望可以在下面回复 谢谢!
相关文章推荐
- 32位汇编语言学习笔记(8)--分析do-while循环的汇编代码
- C语言中循环结构语句 for循环及while,do--while 的使用
- 9.从零开始学习C语言--do...while循环语句
- C语言中for循环,while循环与do-while 循环的比较
- 【C语言简单说】十六:do...while循环
- 《IOS_C语言》while|循环,do...while循环,for循环
- C语言学习-while循环、do-while、for循环
- [iOS]C语言技术视频-05-程序循环结构(do{}while();)
- 作业《IOS_C语言》while|循环,do...while循环,for循环
- 基于proteus的51单片机仿真实例三十二、C语言的do-while循环语句
- [iOS学习]C语言-04-程序循环结构-do…while循环解说
- 32位汇编语言学习笔记(9)--分析while循环的汇编代码
- C语言学习10(循环结构:do-while语句)
- c语言中不用while,for,do-while实现循环
- while/do...while循环(笔记整理)
- if/switch/while/do while/for/等循环及判断的简要用法案例
- Java 循环结构for、do...while、while
- C语言-define 与do{}while(0)
- Unit 4 循环结构(while和do-while)
- Java 循环结构 - for, while 及 do...while