- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)