第7章 程序.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第7章 程序.doc

第7章 程序 本章介绍用汇编语言编写各种常见程序结构和功能的具体方法,包括循环和分支结构,字符串(内存块)处理和位操作等功能。 7.1 循环与串处理 计算机主要靠循环来进行各种处理和计算。所以,循环结构在程序设计中,有举足轻重的地位。 高级语言中有for和while等循环,汇编语言中有loop循环。在Intel CPU的指令集中,还有许多循环加串处理的组合指令。 7.1.1 循环 1. 高级语言循环 C/C++语言的三种循环结构: for循环:for (初始化; 终止测试; 计算新值) 语句 工作过程: 计算“初始化”表达式的值(用于设置循环控制变量的初值); 计算“终止测试”表达式的值,若为0,则终止循环; 执行循环体“语句”(此语句一般为复合语句{……}); 求“计算新值”表达式的值(更新循环控制变量/完成其增量运算); 转2(继续循环)。 例子: for (int i = 0; i 100; i++) { …… } while循环:while (控制表达式) 语句 工作过程: 计算“控制表达式”的值,若为0,则退出循环; 执行循环体“语句”(此语句一般为复合语句{……}); 转1(继续循环)。 例子: int i = 0; while (i 100) { …… i++; } do-while循环:do 语句 while (控制表达式); 工作过程: 执行循环体“语句”(此语句一般为复合语句{……}); 计算“控制表达式”的值,若为0,则退出循环; 转1(继续循环)。 例子: int i = 0; do { …… i++; } while (i 100); for循环结构 while循环结构 do-while循环结构 其中,for循环为计数循环,用于明确知道循环次数的情形;while和do-while循环为条件循环,用于知道终止条件的情形。 do-while和while类似,只是前者是先执行后判断,所以无论对条件的判断如何,都会至少执行一次循环体语句;而后者则是先判断后执行,所以循环体语句不一定会被执行。 对while和do-while循环,在循环体语句中,应该包含改变控制表达式中变量值的语句,不然可能导致无限死循环。 2. 汇编语言循环 高级语言的循环结构,编译时还是用汇编语言来实现的。 但是在汇编语言中,并没有while和do-while这样的语句和指令,我们可以通过计算或比较来实现循环控制条件的判断,再用条件转移指令来实现退出或继续循环。 do-while循环的汇编设计: 语句标签: 循环体代码块 CMP …… JXX语句标签 ; 分支跳转和循环跳转合二为一 只有一个跳转语句,条件判断的分支跳转和返回循环开始处的循环跳转合二为一。 例如(循环读用户按键,直到ESC键终止): Keyin: ; 读按键 mov ah, 0 ; 0号功能(读按键) int 16h ; 调用16H号键盘中断 ; 对非ESC键:继续循环 cmp al, 1bh ; 比较AL中的键入字符与ESC字符(ASCII码为0x1B) jne Keyin ; 不等跳转到前面的“读按键”标签处继续循环 ; 对ESC键:退出 ret ; 从例程返回 其中,绿色为循环体,红色为循环控制条件的判断和跳转,蓝色为循环开始标签。 又例如(将AX中的二进制整数,转换为十进制数字串,存放在sbuf中。颜色的含义同上): ; ; 获取字整数值的十进制串例程 GetDigStr: ; 以AX为传递参数,[串地址]BP和[字符个数]CX为返回值 mov cx, 1 ; 位数=1(初值) mov bp, sbuf ; BP = sbuf + dn - 1 = sbuf的当前位置 add bp, dn - 1 mov bx,10 ; 除数=10 DLoop: ; 循环开始处 mov dx, 0 ; DX=0 div bx ; DX:AX / BX - 商AX、余DX add dl, 30h ; 余数 + 30h = 对应的数字符ASCII码 mov [bp], dl ; sbuf[BP] = DL cmp ax, 0 ; 商AX = 0 ? je OutLoop ; = 0 跳出循环 inc cx ; 位数CX++ dec bp ; 数字符的当前位置BP-- jmp DLoop ; 继续循环 OutLoop: ; 退出循环 ret ; 从例程返回 dn equ 5 ; 最大位数 sbuf resb dn ; 用于存放十进制数字串的缓冲区,大小 = 常量dn(=5) while循环的汇编设计: 开始标签: CMP …… JXX退出标签 ; 分

文档评论(0)

wsh1288 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档