32位汇编——c语言循环do——while
来源:互联网 发布:windows phone8评测 编辑:程序博客网 时间:2024/06/06 04:11
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的累加
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 += nsubl $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 += nsubl $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位汇编——c语言循环do——while
- Mohican_12/12 C语言—循环 for ,while,do while
- 黑马程序员——while、do...while、for循环
- php中while和do—while循环语句
- Java语言基础(六)之 —— 循环结构(do...while循环)
- C语言(16)-----do-while循环使用
- C语言—switch、while、do while、for、break和countinue
- 32位汇编语言学习笔记(8)--分析do-while循环的汇编代码
- Objective-C学习笔记(十)——循环语句for和do-while的使用
- c语言中不用while,for,do-while实现循环
- c++第一次实验——循环do~while
- PHP学习笔记——循环结构do...while语句
- java学习日志——循环和循环嵌套:for,while.do···while
- C#基础(4)——break语句、continue语句、while循环、do-while循环、for循环、foreach循环
- 黑马程序员——C语言学习之流程结构-if—switch—while—do while
- C语言之while循环语句和do while循环语句、for循环语句、循环嵌套
- 【黑马程序员】C语言循环之while循环、for循环、do...while循环
- C语言 基础反汇编——for循环
- 图像识别中,目标分割、目标识别、目标检测和目标跟踪这几个方面区别是什么?+资料列表
- vue开发过程中跨域最简单解决方案
- 格雷码到普通十进制数二进制表示的转化
- 笔记6 | 从源码理解分析mScrollX和mScrollY,scrollTo()和scrollBy(),smoothScrollTo和smoothScrollBy
- 设计模式(四)
- 32位汇编——c语言循环do——while
- Intellij IDEA创建Maven Web项目(带有webapp文件夹目录的项目)
- Unity平台的预处理
- 实现二分查找(指针和数组)
- css inline-block 与 float的使用
- Handler sendMessage 与 obtainMessage (sendToTarget)比较
- hadoop配置HA简单总结
- 关于Autosar中的NM模块的理解
- 用EXCEL来解决同期比较的问题