[工学]第3章汇编语言程序设计初步课件

PPT
  • 阅读 96 次
  • 下载 0 次
  • 页数 99 页
  • 大小 484.012 KB
  • 2022-11-12 上传
  • 收藏
  • 违规举报
  • © 版权认领
下载文档30.00 元 加入VIP免费下载
此文档由【小橙橙】提供上传,收益归文档提供者,本网站只提供存储服务。若此文档侵犯了您的版权,欢迎进行违规举报版权认领
[工学]第3章汇编语言程序设计初步课件
可在后台配置第一页与第二页中间广告代码
[工学]第3章汇编语言程序设计初步课件
可在后台配置第二页与第三页中间广告代码
[工学]第3章汇编语言程序设计初步课件
可在后台配置第三页与第四页中间广告代码
[工学]第3章汇编语言程序设计初步课件
[工学]第3章汇编语言程序设计初步课件
还剩10页未读,继续阅读
【这是免费文档,您可以免费阅读】
/ 99
  • 收藏
  • 违规举报
  • © 版权认领
下载文档30.00 元 加入VIP免费下载
文本内容

【文档说明】[工学]第3章汇编语言程序设计初步课件.ppt,共(99)页,484.012 KB,由小橙橙上传

转载请保留链接:https://www.ichengzhen.cn/view-2104.html

以下为本文档部分文字说明:

第3章汇编语言程序设计初步第3章汇编语言程序设计初步3.1系统功能调用3.2汇编语言源程序的设计的基本步骤3.3分支结构的汇编语言源程序的编写3.4循环结构的汇编语言源程序的编写开始第3章汇编语言程序设计初步3.1系统功能调用3.1.1

系统功能调用概述3.1.2基本I/O调用返回本章首页第3章汇编语言程序设计初步3.1.1系统功能调用概述我们在编制汇编源程序时,常常要与外部设备发生关系,如希望能从键盘输入字符或在显示器上显示出程序运行的结果,但由于计算

机机种的不同、外部设备型号的差异,控制它们工作的程序也会有差异。如果每次都需要根据自己的工作环境来设计“控制这些外设工作的程序”,则必须要先弄清楚与之有关的设备、电路、接口等各方面的情况,是一件既复杂

,效率又低的事情,并且没有通用性。如果把这些控制过程预先编写成一个一个子第3章汇编语言程序设计初步程序,作为操作系统的一部分事先放在系统盘上,用户在需要时只要按规定的格式设置好参数,直接调用这些子程序即可。美国MICROSOFT公司为我们

提供的磁盘操作系统(DOS)就具有这种功能,称为“利用操作系统的标准功能调用(简称系统功能调用)”,编号从0~62H(3.0版),主要分为设备管理(如键盘、显示器、打印机、磁盘等的管理)、文件管理、目录管理及其他功能调用4大类。第3章汇编语言程序设计初步●系统功能调用的基本方法采用一

条软中断指令INTn。所谓中断,是指当计算机正在执行正常的程序时,计算机系统中的某个部分突然出现某些异常情况或特殊请求,CPU这时就中止(暂停)它正在执行的程序,而转去执行申请中断的那个设备或事件的中断服务程序,执行完这个服务程序后,再自动返回到程序断点执行原

来中断了的正常程序。这个过程或这种功能就叫做中断。软中断是以指令方式产生的中断,n是中断类型号,不同的n将转入不同的中断处理程序。系统功能调用是21号软中断。第3章汇编语言程序设计初步常用的系统功能调用表:表3-1最常用的系统功能调用表第3章汇编语言程序设计初步●系统功能调

用的步骤:1)将调用参数装入指定的寄存器。2)如需要功能调用号(即欲调用的子程序编号),把它装入寄存器AH。3)如需要子功能调用号,把它装入AL。4)按中断号调用DOS(发出中断指令:INT21H)。5)检查返回参数是否正确。第3章汇编语言程序

设计初步3.1.2基本I/O调用1.01H号调用功能:从标准输入设备上(通常为键盘)读取字符,并在标准输出设备上(通常为显示器)回显。格式:MOVAH01HINT21H说明:输入字符的ASCII码送入AL中,如果读到的字符是Ctrl+C或Ctrl+Break,则结束程序。2.02H号调用功能:

通过标准输出设备(多为显示器)输出字符。第3章汇编语言程序设计初步格式:MOVDL,X;(X为要输出显示的ASCII字符代码)MOVAH,02HINT21H说明:DL寄存器中的内容等于要输出字符的ASCII码,在显示输出时

检查到的字符是Ctrl+C或Ctrl+Break键的,则结束程序。3.09H号调用功能:在标准输出上(通常为显示器)显示一个字符串。字符串要以字符“$”为结束标志。格式:MOVAH09HINT21H说明:要输出显示的字符串的首地址送到DS、DX两个寄存器中

,其中段地址送DS寄存器,第3章汇编语言程序设计初步偏移地址送DX寄存器。4.0AH号调用功能:从标准输入设备上(通常为键盘)读一个字符串,存入内存,直到按回车键为止。格式:MOVAH,0AHINT21H说明:此项操作,要求事

先定义一个输入缓冲区,它的缓冲区首地址送到DS、DX两个寄存器中,其中段地址送DS寄存器,偏移地址送DX寄存器。第3章汇编语言程序设计初步【例3-1】在显示器上显示字符串WelcometoTianHecollege!DAT

ASSEGMENT;/数据段定义开始STRINGDB'WelcometoTianHecollege!',0AH,0DH,'$';/定义字符串,0AH,0DH表示显示字符串后,光标可自动回车换行,字符串必须以$结束。DATASENDS;/数据段定义结束CODESSEGMEN

T;/代码段定义开始ASSUMECS:CODES,DS:DATAS,SS:STACKS;/说明段和段寄存器之间的关系START:MOVAX,DATAS;/将数据段的段地址送寄存器AXMOVDS,AX;/将AX内容送DS寄存器,即初始化DSLEADX,STRING;/将STRING的偏

移地址送DX寄存器第3章汇编语言程序设计初步MOVAH,9;/字符串显示子功能,9号系统功能调用INT21H;/系统调用MOVAH,4CH;/返回DOSINT21H;/系统调用CODESENDS;/代码段定义结束ENDSTART【例

3-2】从键盘输入字符串,把它放到缓冲区中存储起来。DATASEGMENTMAXLENDB100;/定义缓冲区的最大容量ACLENDB?;/定义实际读入的字符数STRINGDB100DUP(?);/定义接收字符串空间DA

TAENDS第3章汇编语言程序设计初步CODESEGMENTMOVAX,DATAMOVDS,AX;/数据段初始化LEADX,MAXLEN;/送MAXLEN的偏移地址到寄存器DXMOVAH,10;/10号系统功能调用INT21H;

/系统调用CODEENDS运行程序时,若从键盘输入“Thankyou!”(共计10个字符),则输入缓冲区MAXLEN各单元的内容如图3-1所示。图3-1存储空间分配示意第3章汇编语言程序设计初步3.2汇编语言源程序的设计的基本步骤3.2.1源程序的

基本框架3.2.2汇编语言源程序设计的基本步骤3.2.3顺序结构的汇编语言源程序的编写返回本章首页第3章汇编语言程序设计初步3.2.1源程序的基本框架一个汇编语言源程序由两大部分组成的。其中主要部分就是指令,位于代码段内,代码段可以有好几个

。其他部分是为指令服务的,包括数据的准备,存储区域的划分和地址的标注。其他部分由数据段、堆栈段和扩展段组成。也各可以有好几个。段之间的顺序可以随意安排。但通常是其他部分(数据段、堆栈段和扩展段等)在前,代码段在后。

虽然可以定义多个段,但由于段首址存放在CPU的寄存器中,所以可以同时使用6个段:代码段(CS)、数据段(DS)、堆栈段(SS)和3个扩展段(ES、FS和GS)。扩展段其实也是数据段,只是段地址在寄存器ES、FS和GS中。程序通过修改段寄存器的值实现段的切换。第3

章汇编语言程序设计初步一个程序至少包含一个代码段和END指令。其他段的设置由程序的具体功能需要而定。程序较小时,可以不设置堆栈段。操作系统在装载不含堆栈段的程序时,会指定一个段作为堆栈段使用。这样,程序连接时,LINK会产生一条警告信息:WARNING:NOSTACKSEGMENT但不会影响

程序的运行,可以忽略它。程序中的段名可以是唯一的,也可以与其它段同名。在同一模块中,如果有两个段同名,则后者被认为是前段的后续,这样,它们就属同一段。当同一模块出现两个同名段时,则后者的可选项属性要么与前者相同,要么不写其属性而选用前者

的段属性。第3章汇编语言程序设计初步【例3-4】段寄存器与段的对应方法1:用一个段寄存器对应两个数据段DATA1SEGMENT;/定义第一个数据段b1DB10h;/定义变量DATA1,字节变量DATA1ENDS;/第一个数据段结束DATA2SEGME

NT;/定义第二个数据段b1DB23h;/定义变量DATA2,字节变量DATA2ENDS;/第二个数据段结束CODE1SEGMENT;/定义第一个代码段ASSUMECS:CODE1,DS:DATA1;/指定段寄存器START:MOVAX,

DATA1;/指令开始,MOVDS,AX;/把数据段DATA1的段首址赋给段寄存器DS第3章汇编语言程序设计初步………………MOVBL,b1;/引用DS来访问DATA1中的变量b1………………ASSUMEDS

:DATA2;/说明DS与DATA2建立联系MOVAX,DATA2;MOVDS,AX;/把数据段DATA2的段值赋给段寄存器DS………………/实现段的切换MOVAL,b2;/引用DS来访问DATA2中的变量b2……………

…CODE1ENDS;/代码段CODE1结束ENDSTART;/程序结束在方法1中,因为只使用一个段寄存器DS来对应两个数据段,所以,需要切换DS的对应关系。但我们也可以用段寄存器DS和ES来分别对应段DATA1和DATA2,这样,方法1就可变成方法2。第3章汇编语言程序设

计初步方法2:用两个段寄存器对应两个数据段DATA1SEGMENT;/定义第一个数据段b1DB10h;/定义变量DATA1,字节变量DATA1ENDS;/第一个数据段结束DATA2SEGMENT;/定义第二个数

据段b2DB23h;/定义变量DATA2,字节变量DATA2ENDS;/第二个数据段结束CODE1SEGMENT;/定义第一个代码段ASSUMECS:CODE1,DS:DATA1,ES:DATA2;/指定段寄存器START:MOVAX,DA

TA1;/指令开始,MOVDS,AX;/把数据段DATA1的段首址赋给段寄存器DSMOVAX,DATA2MOVES,AX;/把数据段DATA2的段首址赋给段寄存器ES………………第3章汇编语言程序设计初步MOVBL,b1;/引用DS来访问DATA1中的变量b1………………MOVAL,b2;/引用

ES来访问DATA2中的变量b2………………CODE1ENDS;/代码段CODE1结束ENDSTART;/程序结束我们还可以用“段组”来简化段寄存器的使用,把段DATA1和DATA2组成一个数据段。所以,把方法

2再改写成方法3的形式。方法3:用一个段组组成两个数据段GSEGGROUPDATA1,DATA2;/定义段组DATA1SEGMENT;/定义第一个数据段第3章汇编语言程序设计初步b1DB10h;/定义变量DATA1,字节变量DATA1ENDS;/第一个数据段结束DATA2SEG

MENT;/定义第二个数据段b2DB23h;/定义变量DATA2,字节变量DATA2ENDS;/第二个数据段结束CODE1SEGMENT;/定义第一个代码段ASSUMECS:CODE1,DS:GSEGSTART:MOVAX,GSEG;/指令开始,MOVDS,AX;/把段组GSE

G的段值赋给段寄存器DS………………MOVBL,b1;/引用DS来访问DATA1中的变量b1………………MOVAL,b2;/引用DS来访问DATA2中的变量b2………………第3章汇编语言程序设计初步………………CODE1E

NDS;/代码段CODE1结束ENDSTART;/程序结束定义段组后,段组内各段所定义的标号和变量,除了与定义它们的段起始点相关外,还与段组的起始点相关。规定如下:如果在ASSUME伪指令中说明段组与段寄存器相对应,那么,有关标号或变量的偏移量就相对于段组起点计算;如果在ASSUME伪指令中

说明段组内的某段与段寄存器相对应,那么,有关标号或变量的偏移量就相对于该段的起点。所以,在使用段组后,程序员要谨慎使用ASSUME伪指令,并保证段寄存器的值与段组或段相一致。第3章汇编语言程序设计初步3.2.2汇编语言源程序设计的基本步骤1.汇编语言源程序的主要基本结

构:顺序结构分支结构循环结构2.好程序的要求一个好的程序,首先应该能正常运行,实现预定的功能。还应该满足:结构简明,明白易懂,调试方便,修改容易。执行速度快(程序执行时间短,程序语句行数尽量少)。占用内存空间少。第3章汇编语言程序设计初步3.基本步骤分析

问题,从中抽象出恰当的数学模型。确定解决问题的合理算法。画出程序流程图,根据算法,细化并找出解决问题的思路和具体方法。确定汇编语言程序的基本框架:各个存储段的定义,存储空间的分配,寄存器的配置,指针和计数器的选择。根据程序流程图确定程序的基本结构,并编写程序。第3章汇编语言程序设计初步3.

2.3顺序结构的汇编语言源程序的编写顺序结构是最简单的程序结构,没有分支,没有循环,程序的执行顺序就是指令的编写顺序,所以,又称直线程序。因此,安排指令的先后次序就显得至关重要。另外,在编程序时,还要妥善保存已得到的处理结果,为后面的进一步处理直接提供前面的处理结果,从而

避免不必要的重复操作。第3章汇编语言程序设计初步【例3-5】两个64位无符号数相加●分析问题:在8086/8088CPU中,只有8位或16位运算指令,没有32位和64位以上的运算指令。●确定算法:要进行64位的加法运算,可以确定算法:利用1

6位加法指令分别相加4次来实现。●画程序流程图:本问题简单,无需画程序流程图。●确定汇编语言程序的基本框架:可见,汇编语言程序的基本框架至少要两个段:数据段和代码段。数据段中至少定义3个变量:两个加数N1、N2,还有一个和数SUM,都是DW类型。和

数SUM尚属未知,故应定义一个5个字长(比64位字长富余一点)的缓冲区。因为要加4次,需要一个计数器或指针,可选寄存器BX充当。●编写程序,可以想得到,需要MOV、ADD、ADC和INC等指令。具体程序如下:第3章汇编语言程序设计初步DATASEGME

NT;/定义数据段N1DW1234H,5678H,9ABCH,0DEF0H;/定义字变量N1N2DW1971H,0313H,1968H,1123H;/定义字变量N2SUMDW5DUP(?);/定义缓冲区SUMDATA1END;/数据段结束COD

ESEGMENT;/定义第一个代码段ASSUMECS:CODE,DS:DATA;/指定段寄存器MAINPROCNEARSTART:MOVAX,DATA;/指令开始,MOVDS,AX;/把数据段的段首址赋给段寄存器DSLEABX,N1;/将N1的偏移地址送BXMOVAX,

[BX];/引用DS来访问DATA中的变量N1的最低位第3章汇编语言程序设计初步ADDAX,[BX+8];/最低位字相加,因两个数偏移地址相差8个字节MOV[BX+16],AX;/存最低位和。[BX+16]

指示SUM的偏移地址此句也可以写为:MOV[SUM],AXINCBXINCBX;/指针指向下一个字MOVAX,[BX];/引用DS来访问DATA中的变量N1的次低位ADCAX,[BX+8];/次低位字

相加,因两个数偏移地址相差8个字节MOV[BX+16],AX;/存次低位和。[BX+16]指示SUM+1的偏移地址,此句也可以写为:MOV[SUM+1],AXINCBXINCBX;/指针指向下一个字MOVAX,[BX];/引

用DS来访问DATA中的变量N1的次高位ADCAX,[BX+8];/次高位字相加,因两个数偏移地址相差8个字节第3章汇编语言程序设计初步MOV[BX+16],AX;/存次高位和。[BX+16]指示SUM+2

的偏移地址,此句也可以写为:MOV[SUM+2],AXINCBXINCBX;/指针指向下一个字MOVAX,[BX];/引用DS来访问DATA中的变量N1的最高位ADCAX,[BX+8];/最高位字相加,因两个数偏移

地址相差8个字节MOV[BX+16],AX;/存最高位和。[BX+16]指示SUM+3的偏移地址,此句也可以写为:MOV[SUM+3],AXMOVAX,0;/对AX清零ADCAX,0;/计算进位MOV[BX+18],AX;/存进位位MOVAH

,4CH;/此句也可写成:MOVAX,4C00HINT21HMAINENDPCODEENDS;/代码段CODE1结束ENDSTART;/程序结束第3章汇编语言程序设计初步【例3-6】两个32位无符号数乘法程序●分析问题:在8086/8088CPU

中,只有8位或16位运算指令,没有32位以上的乘法运算指令。●确定算法:要进行32位的乘法运算,可以确定算法:利用16位乘法指令做4次乘法,然后把部分积相加来实现。每次的积的低位送AX,高位送DX。如图3-2所示。●画程序流程图:程序流程图如图3-3所示。●确定汇编语言程序的基本框架:可见,汇

编语言程序的基本框架至少要两个段:数据段和代码段。数据段中至少定义3个变量:两个乘数,还有一个积数,都是DW类型。积数尚属未知,故应定义一个4个字长(积的字长应该是乘数字长的两倍)的缓冲区。因为要乘4次,需要一个计数器或指针,可选寄存器BX充当。另外,本程序为了教学的需要,不采用MOV

AH,4CHINT21H第3章汇编语言程序设计初步来返回DOS。而改用“先将程序段前缀的起始地址及数据段DS段首址和偏移地址AX存入堆栈,再用指令RET返回DOS的方法。所以,又定义了100个字节的堆栈段。同时堆栈段又为保存最后的进位位提供了条件。●编写程序,可以

想得到,需要MOV、MUL、ADD、ADC、PUSH、PUSHF和RET等指令。具体程序如下:第3章汇编语言程序设计初步NUME32bitMULTIPLY;程序名“32位乘法”DATASEGMENT;数据段定义开始MU

LNUMDW0000H,0FFFFH,0000H,0FFFFH,4DUP(?);DATAENDS;数据段定义结束STACKSEGMENTPARASTACK‘STACK’;堆栈段定义开始DB100DUP(?);堆栈段长度为100字节STACKENDS;堆栈段定义

结束CODESEGMENT;代码段开始ASSUMECS:CODE,DS:DATA,SS:STACK;指定段寄存器STARTPROCFAR;图3-3程序流程图第3章汇编语言程序设计初步BEGIN:PUSHDS;将DS中包含的程序段前缀压栈保存MOVAX,0;将0送AX,

即设置AX的初值为0PUSHAX;将DS中AX的偏移地址压栈,这三句即保存返回至DOS的段值和IP值。MOVAX,DATA;MOVDS,AX;将数据段首地址送DSLEABX,MULNUM;将MULNUM的偏移地址送BX,定义了地址指针MULNUM32:MOVAX,[

BX];被乘数的低16位B→AXMOVSI,[BX+4];乘数的低16位D→SIMULSI;B×D,部分积1的低位送AX,部分积1的高位送DX,MOV[BX+8],AX;保存部分积1的低位MOV[BX

+0AH],DX;保存部分积1的高位MOVAX,[BX+2];被乘数的高16位A→AX第3章汇编语言程序设计初步MULSI;A×D,部分积2的低位送AX,部分积2的高位送DXADDAX,[BX+0AH];部分积1的高位+

部分积2的低位ADCDX,0;加入部分积1的低位的进位MOV[BX+0AH],AX;保存部分积1的高位+部分积2的低位MOV[BX+0CH],DX;保存部分积2的高位MOVAX,[BX];被乘数的低16位B→AXMOVDI,[BX+6];乘数的高16位C→DIMULDI

;B×C,部分积3的低位送AX,部分积3的高位送DXADDAX,[BX+0AH];部分积1的高位+部分积2的低位+部分积3的低位ADCDX,[BX+0CH];部分积2的高位+部分积3的高位+进位MOV[BX+0AH],AX;保存部分积1的高位

+部分积2的低位+部分积3的低位第3章汇编语言程序设计初步MOV[BX+0CH],DX;保存部分积2的高位+部分积3的高位+进位PUSHF;将标志寄存器压栈,保存“部分积2的高位+部分积3的高位+进位”的进位位MOVAX,[BX+2];被乘数的高16

位A→AXMULDI;A×C,部分积4的低位送AX,部分积4的高位送DXPOPF;弹出堆栈保存的“部分积2的高位+部分积3的高位+进位”ADCAX,[BX+0CH];部分积4的低位+部分积2的高位+部分积3的高位+进位ADCDX,

0;部分积4的高位+进位MOV[BX+0CH],AX;保存“部分积4的低位+部分积2的高位+部分积3的高位+进位”+进位MOV[BX+0EH],DX;保存部分积4的高位+进位RETSTARTENDPCODEENDSENDBEGIN第3章汇编语言程序设计初步3.3分支结构的汇编

语言源程序的编写3.3.1条件转移指令3.3.2汇编语言分支结构程序的编写返回本章首页第3章汇编语言程序设计初步在汇编语言程序设计中,常利用条件转移指令实现程序的分支。指令助记符是随条件变化而变化的,其构成方法是:第一个字母是J,紧接着的字母是标志寄存器的代号P、S、Z、……,表示“条件”,条

件满足,则转移。例如JZ,表示结果为0,则转移;如果“条件”是否定的,就在已构成的两个字母间加字母N,例如JNZ,表示结果不为0,则转移。条件转移指令只有一个操作数,指出转移的目标地址,并且只能是一个短标号,即转移

的偏移地址是8位的。有一个条件转移指令JCXZ,构成方法较特殊,它的转移条件是寄存器CX的内容为0,而不是标志寄存器的某位的标志。所有的条件转移指令都不影响标志位。3.3.1条件转移指令第3章汇编语言程序设计初步(1)根据单个标志的设

置情况的转移指令。共五种10条:1)JZ(或JE);上一步的结果为零(或相等)则转移。格式:JE(或JZ)标号测试条件:ZF=12)JNZ(或JNE);上一步的结果不为零(或不相等)则转移。格式:JNZ

(或JNE)标号测试条件:ZF=03)JS;上一步的结果为负,则转移。格式:JS标号测试条件:SF=14)JNS;上一步的结果为正,则转移。现将所有的条件转移指令列举如下:第3章汇编语言程序设计初步格式:JNS标号测试条件:SF=05)JO;上一步

的结果为溢出,则转移。格式:JO标号测试条件:OF=16)JNO;上一步的结果不为溢出,则转移。格式:JNO标号测试条件:OF=07)JP(或JPE);上一步的结果的奇偶标志位为1,则转移。格式:JP标号测试条件:PF=18)JNP

(或JPO);上一步的结果的奇偶标志位为0,则转移。格式:JNP(或JPO)标号测试条件:PF=09)JC;上一步有进位或借位,则转移。第3章汇编语言程序设计初步格式:JC标号测试条件:CF=110)JNC;上一步无进位或无借位,则转移。格式:JNC标号测试条件:CF=0(2)比较

两个无符号数,并根据比较结果的高低转移。1)JAJNBE(或JNBE)高于,即不低于或等于,则转移。格式:JA(或JNBE)标号测试条件:CF=0且ZF=02)JNA(或JBE)不高于,即低于或等于,即则转移。格式:JBE(或JNA)标号测试条件:CF=0或ZF=13)JB(或JN

AE,JC)低于,即不高于或等于,或进位为1则转移格式:JB(或JNAE,JC)标号第3章汇编语言程序设计初步测试条件:CF=14)JNB(或JAE,JNC)不低于,或高于或等于,或进位为0则转移格式:同

上测试条件:CF=0(3)比较两个带符号数,并根据比较的结果的大小转移。1)JL(或LNGE)小于,或者不大于且等于,则转移。格式:JL(或JNGE)标号测试条件:SF异或OF=12)JNL(或JGE)不小于,即或者大于或者等于则转移。格式:JNL(或JGE)标号测

试条件:SF异或OF=03)JLE(或JNG)小于或等于,即不大于则转移。格式:JLE(或JNG)标号测试条件:(SF异或OF)或ZF=1第3章汇编语言程序设计初步4)JNLE(或JG)不小于或等于,即大于则转移。格式:JNLE(或JG)标号测试条件:(SF异或OF)或ZF

=0(4)测试CX的值为0则转移指令格式:JCXZ标号测试条件:(CX)=0第3章汇编语言程序设计初步3.3.2汇编语言分支结构程序的编写在设计分支程序时必须注意以下几点:(1)正确选择分支形成的判定条件和相应的

条件转移指令。(2)对每个分支程序的入口,一定要给出标号,标明不同分支的转向地址。必须保证每条分支都有完整的结果。(3)在检查和调试时必须对所有的分支进行,因为某几条分支正确,不足以说明整个程序是正确的。第3章汇编语言程序设计初步分支结构程序的分类:♦简单的二分支结

构程序♦多分支结构程序第3章汇编语言程序设计初步1.简单的二分支结构设计举例【例3-7】把a,b两个8位数中较大的数赋值给max。●分析问题:这是典型的二分支结构。确定分支的条件是a>b吗?●确定算法:

采用比较转移指令,在汇编语言中用AL来保存中间结果。因为读取寄存器比读取存储器要快,并且,汇编语言指令不允许两个操作数都为存储单元。●画程序流程图:画程序流程图,见图3-5。图3-5例3-7程序流程图第3章汇编语言程序设计初步●确定汇编语

言程序的基本框架:可见,该汇编语言程序的基本框架至少要两个段:数据段和代码段。数据段中至少定义3个变量:两个数a、b,还有一个最大数max,都是8位数,应选DB类型,但考虑到执行CMP指令实际上是作减法,可能有借位的情况,故选DW类型。max尚属未知,故应定义一个字长的缓冲区。还要用

到寄存器AL。●编写程序,可以想得到,需要MOV、CMP等指令。最后要返回DOS。具体程序如下:DATASEGMENT;/定义数据段aDW?;/定义字变量abDW?;/定义字变量bmaxDW?;/定义字变量maxDATAEDNS;/数

据段定义结束CODESEGMENTASSUMECS:CODE,DS:DATA第3章汇编语言程序设计初步START:MOVAX,DATAMOVDS,AXMOVAL,aCMPAL,b;/比较a和b,产生分支JAEXIT;/如果a>b,则跳转到EXIT语句,否则,

执行下列语句MOVAL,b;/送b到寄存器EXIT:MOVmax,AL;/送(AL)到存储单元maxMOVAH,4CH;INT21H;/返回DOSCODEENDS;/代码段结束ENDSTART;/程序结束第3章汇编语言程序设计初步2.多分支结构程序设计多分支结构程序设计比较复杂一些。关

键是怎样根据条件对多分支进行判断,确定不同分支程序转移的入口地址。方法有:(1)逻辑分解流程图法根据逻辑分解流程图,按照判别条件的先后,逐个进行判断和转移。设分支条件为X1,X2,……,XN,则逻辑分解流程图为3-6所示。图3-6逻辑分解流程图第3章汇编语言程序

设计初步【例3-8】试编写执行符号函数的程序。−−==)127X128(;0X1;0X0;0X1当当当Y●分析问题:由题意可知,这是多分支结构。本题有三个分支:X>0、X=0和X<0。按照逻辑分解的方法,可以先将其归并为两

个条件:X≥0和X<0,由此形成两个分支;再将分支X≥0分解为X>0和X=0,各分支均用条件转移指令来实现。●确定算法:采用比较转移指令。●画程序流程图:画程序流程图,见图3-7。●确定汇编语言程序的基本框架:可见,该汇编语言程序的基本框架至少要两个段:数据段和代码段。

数据段中至少定义2个变量:两个数X和Y,由题设为8位数,应选DB类型,但考虑到执行CMP指令实际上是作减法,可能有借位的情况,故选DW类型。假设任意给定的X值存放在XX单元,函数Y的值存放在YY单元。●编写程序,可以想得到,需要MOV、CMP和程序转移等指令。第3章汇编语言

程序设计初步最后要返回DOS。具体程序如下:DATASEGMENT;/定义数据段XXDW;/定义字变量XYYDW?;/定义字变量YDATAEDNS;/数据段定义结束CODESEGMENTASSUMECS:CODE,DS:DATAST

ART:MOVAX,DATAMOVDS,AX;/给DS赋值MOVAL,XX;CMPAL,0;/XX与零比较开始(AL)←XX(AL)≥0(AL)>0(AL)←1结束YN图3-7例3-8程序流程图(AL

)←-1(AL)←0YN第3章汇编语言程序设计初步JGEBIGR;/X=(AL)≥0,则转移到BIGR语句MOVAL,0FFH;/否则,X<0时,将–1送入ALJMPEQUL;/无条件转移语句,转移到EQUL语句BIGR:JEEQUL;/X=0,则转移到EQUL语句MOVAL,1;/

X>0时,将1送入ALEQUL:MOVYY,AL;/无论结果如何,都将(AL)送入YY单元HLT;/暂停(2)跳转地址表法如果各分支的判定结果可以用一个寄存器的不同的有序的值来表示,则可将各分支程序的入口地址与寄存器的不同的有序的值一一对应,列入一张表中,此

表称为跳转地址表。第3章汇编语言程序设计初步如图3-8所示。各分支程序的入口地址的计算公式是:各分支程序的入口地址=寄存器的值×2+跳转地址表首地址这种利用跳转地址表实现多分支程序的转移的方法,称为跳转地址表法。图3-8分支程序入口地址表第3章汇编语言程序设计初步【例3-9】根据AL中的被置位的

情况来控制转移到8个分支程序R1~R8中的一个(在中断响应时,通过软件查询,从而转到相应的中断服务程序入口就类似于这种情况)。如果AL中为00000001则转至R1如果AL中为00000010则转至R2如果AL中为00000100则转至R3如果AL中为00001000则转

至R4如果AL中为00010000则转至R5如果AL中为00100000则转至R6如果AL中为01000000则转至R7如果AL中为10000000则转至R8实现上述要求的程序框图如图3-9所示。我们可以把8个子程序的入口地址编成如图3-8所示的分支程序入口地址表。根据流

程图可以写出如下程序:第3章汇编语言程序设计初步●分析问题:由题意可知,要求根据某种条件实现8个分支程序●确定算法:采用跳转地址表法(见图3-8分支程序入口地址表),结合条件转移指令来实现。●画程序流程图:见图3-9。●确定汇编语言程序的基本框架:可见,该

汇编语言程序的基本框架要三个段:数据段、堆栈段和代码段。数据段中创建分支程序入口地址表,应选DW类型,使用寄存器BX定位。●编写程序,可以想得到,需要MOV、JMP、JC、INC、LEA和PUSH等指令

。最后要返回DOS。未想到的,在编写过程中根据需要随时添加,如RCR指令等。具体程序如下:NAMEBRANCH_PROGDATASEGMENT第3章汇编语言程序设计初步BRTABDWR11;/开始创建分支程序入口地

址表。第一步创建分支程序R1入口地址的IP值DWR12;/创建分支程序R1入口地址的码段值DWR21;/仿DWR11,下同DWR22;/仿DWR12,下同DWR31DWR32DWR41DWR42DWR51DWR52DWR61

DWR62DWR71DWR72DWR81DWR82图3-9分支程序转移流程图第3章汇编语言程序设计初步DATAENDSSTACKSEGMENTPARASTACK'STACK'DB100DUP(?);/定义一个100个字节的堆栈空间TOPEQU$-STACK;/栈顶的地址为程序的当前地址与堆

栈首地址的差。STACKENDSCODESEGHENTSTARTPROCFARASSUMECS:CODE,DS:DATA,SS:STACKBEGIN:PUSHDS;/将数据段首址压栈MOVAX,0;/将寄存器AX清零PUSHAX;/使程序能返回DOSMOVAX,DATAMO

VDS,AX;/将DATA段首址(即分支程序入口地址表)送寄存器DS第3章汇编语言程序设计初步MOVAX,STACK;MOVSS,AX;/将堆栈段首址送寄存器SSMOVAX,TOPMOVSP,AX;/将堆栈段栈顶地址送堆栈指针寄存器SPLEABX,BRT

AB;/设跳转表的地址指针GTBIT:RCRAL,l;/通过进位循环右移JCGETAD;/在循环右移过程中顺序检查AL中各位的状态INCBX;/BX自动加1INCBX;/BX自动加1,移到下一分支INCBX;/BX自动加1INCBX;/BX自动

加1,完成寄存器的值×2JMPGTBITGETAD:JMPDWORDPTR[BX];/段间间接转移STARTENDPCODEENDSENDBEGIN第3章汇编语言程序设计初步(3)跳转指令表法跳转指令表法的思路与跳转地址表法

基本相同,不同的只是它是在代码段中把转移到各个分支程序段的跳转指令放在一个表中,该表就称为“跳转指令表”。表内跳转转移指令的地址的计算公式:表内跳转指令表的地址=(编号-1)×2+跳转指令表的首地址=编号×2-2+跳转指令表的首地址第3

章汇编语言程序设计初步当N=1时,显示信息(DSPLAY);N=2时。传送信息(TRAN);N=3时。处理信息(PROCl);N=4时,打印信息(PRTN);N=5时。结束程序(EXIT).相应的处理为一独立的程序段,它们的入口地址分别为DSPLAY,TRAN,PROCl,PRIN,E

XIT。当这些程序处理结束时仍返回读入N。只有当N=5时程序才结束。试利用跳转指令表的分支程序实现这些要求。【例3-10】由键盘输入一个数N,当N为不同值时应作不同处理第3章汇编语言程序设计初步●分析问题:由题意可知,这是一个五分支程序。它们的入口地

址分别为DISPLAY,TRAN,PROCl,PRIN,EXIT。当这些程序处理结束时仍返回读入N。只有当N=5时程序才结束.●确定算法:构建跳转指令表,采用通过执行跳转指令表中相应的跳转指令,就可以转移到不同的分支。●画程序流程图:略。●确定汇

编语言程序的基本框架:可见,该汇编语言程序的基本框架至少要两个段:堆栈段和代码段。堆栈段中定义一个256个字的缓冲区,当然是DW类型,再定义一个字类型的栈顶,用栈顶指针SP定位。采用寄存器AL,AX存数字,寄存器BX存跳转指令的地址。●编写程序,可以想得到,需要MOV、JMP、

LEA、SUB、ADD、CMP和JB、JA、CBW等指令。最后要返回DOS。未想到的,在编写过程中根据需要随时添加,如SHL指令等。为了简化程序,每段处理程序除了EXIT以外仅给出了一条转移指令表示当某项处理完成后返回AGAIN继续从键盘读入一个字符直到输入字符为‘5’第3章汇编

语言程序设计初步为止。例中存放转移指令的表JADT2在代码段中。具体程序如下:STACKSBGMENTSTACKDW256DUP(?);/在堆栈中,定义一个256个字的数据缓冲区TOPLABELWORD;/定义栈顶变量TOP,字类型STACKENDSCOD

ESEGMENTASSUMECS:CODE,SS:STACKSTART:MOVAX,STACK;MOVSS,AX;/堆栈段寄存器SS初始化MOVSP,OFFSSETTOP;/送栈顶的偏移地址到寄存器SPAGAIN:MOV

AH,01;/(AH)=01,1号功能(键盘输入)调用第3章汇编语言程序设计初步INT2lH;/DOS功能调用SUBAL,30H;/将键盘输入的数字字符的ASCII码减去数字字符“0”的ASCII码“30H”,求出输入数字的二进制表示的值,放在AL中CMPAL,01;/与“1”比较

输入数字的值JB,AGAIN;/若输入数字的值比1小,返回程序AGAIN,由键盘重新输入。若输入数字的值比1大,接着执行下一指令CMPAL,05;/与“5”比较输入数字的值JAAGAIN;/若输入数字的值比5大,返回程序AGAIN,由键盘重新输入。若输入数字的值比1大,比5小,接着执行

下一指令SHLAL,01;/将放在AL中的输入数字的二进制表示,逻辑左移1位。依据计算跳转转移指令地址的第3章汇编语言程序设计初步CBW;/将AL中的8位数扩展为16位数,放在寄存器AX中MOVBX,OFFSSETJADT2;/送转移指令跳转表的首地址送

寄存器BXADDBX,AX;/依据计算跳转转移指令地址的公式再作:编号×2+跳转指令表的首地址SUBBX,02;/继续计算,将上一步的结果减去2,完成计算JMPBX;/跳转到BX指示的跳转指令的地址JADT2JM

PSHORTDISPLAY:/跳转表JMPSHORTTRANJMPSHORTPROClJMPSHORTPRTNJMPSHORTEXITDISPLAY:……第3章汇编语言程序设计初步JMPAGATNTRA

N:……JMPAGAINPROCl:……JMPAGAINPRIN:……JMPAGAINEXlT:MOVAH,4CHINT2lHCODEENDSENDSTART第3章汇编语言程序设计初步3.4循环结构的汇编语言源程序的编写

3.4.1循环控制指令3.4.2程序的循环结构3.4.3控制程序循环的方法3.4.4多重循环返回本章首页第3章汇编语言程序设计初步(1)循环指令的作用:根据条件满足与否,完成一串重复的操作,形成循环程序。(2)循环指令有3条,且3条指令都是短转移(short-label表示短标号)指令。

循环转移指令LOOP格式:LOOP目标标号测试条件与功能:(CX)不等于0,则(CX)←(CX)–1;(IP)←(IP)+8位偏移量。3.4.1循环控制指令第3章汇编语言程序设计初步说明:LOOP指令相当于下面两条指令的组合:D

ECCXJNZshort-label;short-label表示短标号相等(为零)循环转移指令LOOPZ/LOOPE格式:LOOPZ(或LOOPE)目标标号测试条件与功能:(CX)等于0且ZF=1,则(CX)←(CX)–

1;(IP)←(IP)+8位偏移量。LOOPNZ/LOOPNE循环指令格式:LOOPNZ(或LOOPNE)目标标号测试条件与功能:(CX)不等于0且ZF=0;则(CX)←(CX)–1;(IP)←(IP)+8位偏移量。第3章汇编语言程序设计

初步【例3-11】将数据区的数据按正、负分开,分别送到两个缓冲区,程序如下:START:MOVSI,OFFSETBLOCK;/将数据区的偏移地址送SI,即将SI指向数据区MOVDI,OFFSETPLUS-DATA;/DI指向正数缓冲区MOVBX,O

FFSETMINUS-DATA;/BX指向负数缓冲区MOVCX,COUNT;/将数据字节送CXCLD;/将DF清0GOON:LODSB;/取串指令TESTAL,80H;/字节最高位为1(表示是负数)吗?JNZMINUS;/是,则转移到MINUS语句ST

OSB;/否则,执行存入串指令STOSBJMPAGAIN;/跳转到AGAIN语句MINUS:XCHGBX,DI;STOSB;XCHGBX,DIAGAIN:LOOPGOONHLT第3章汇编语言程序设计初步3.4.2程序的循环结构一个完整的循环结构程序由以下几部分组

成:1.循环初态设置部分:这是为了保证循环程序能正常运行而必须作的准备工作,在循环开始时往往要给循环过程置以初态,即赋一个初值。循环初态又可以分成两部分,一是循环工作部分初态,另一是循环结束条件的初态。例如,要设地址指针,要使某些寄存器清零,或设某些标志等等。循环结束条件的初态往往置以循环次

数.置初态也是循环程序的重要的一部分,不注意往往容易出错。2.循环体:就是要求重复执行的程序段部分。其中又分为:循环工作部分和循环调整部分。循环调整部分修改循环参数,以保证每次循环所完成的功能不是完全重复的。3.循环结束条件部分:也称循环出口判定部分。在循环程序中必须给出循环

结束条件,否则程序就会进入死循环。每循环一次检查循环结束的条件,当满足条件时就停止循环,往下执行其他程序。第3章汇编语言程序设计初步3.4.3控制程序循环的方法控制程序循环的方法就是选择循环控制条件,是循环程序设计的关键。常用的循环控

制方法有计数控制法、条件控制法和逻辑尺控制法等。1.计数控制法常见的循环是计数循环,当循环了一定次数后就结束循环。在微型机中,常用一个内部寄存器(一般用CX),或寄存器对作为计数器,对它的初值置循环次数,每循环一次减1,当计数器的值减为0时,就停止循环。也可以初值置为0,每循环一次加l,再与循环次

数相比较,若两者相等就停止循环。第3章汇编语言程序设计初步【例3-11】编写一个程序,计算SUM=A1×B1+A2×B2+…+An×Bn。设A1,A2,…,An和B1,B2,…,Bn为无符号数,假定SUM不会超过65535。●分析问题:由题意可知,

这是求n个数的累加和,而每个数都是两个数组对应项的乘积,存在n次重复操作。●确定算法:采用采用比较循环指令,循环次数是n次。故用循环次数作为循环的控制条件,再配合使用LOOP指令。循环控制采用计数控制。●画程序流程图:略。●确

定汇编语言程序的基本框架:可见,该汇编语言程序的基本框架至少要两个段:数据段和代码段。数据段中至少定义4个变量:两个数组变量A和B,由题设知为8位数,应选DB类型,使用寄存器SI定位。和数SUM变量,

由题设知为16位数,选DW类型,其中间结果放在寄存器BX。还有一个数N,为循环次数,计数器用CX。第3章汇编语言程序设计初步●编写程序,可以想得到,需要MOV、ADD、MUL、INC和LOOP等指令。最后要返回DOS。未想

到的,在编写过程中随时添加,如XOR指令等。具体程序如下:DATASEGMENTADBA1,A2,…,An;/定义变量ABDBB1,B2,…,Bn;/定义变量BSUMDW?;/定义变量SUM,其值待求NEQUB-A;/定

义变量N,为循环次数DATAENDSCODESEGMENTASSUMECS:CODE.DS:DATASTART:MOVAX,DATAMOVDS,AX第3章汇编语言程序设计初步XORBX,BX;/准备存放和的寄存器BX清零,设置工

作初值XORSI,SI;/变量A和B的地址定位寄存器SI清零,设置工作初值MOVCX,N:/为循环次数寄存器CX设置循环控制初值NLOPl:MOVAL,A[SI];/循环体命名为LOPl,循环体开始M

ULB[SI];/A×B,8位×8位,乘积暂放在AXADDBX,AX;/乘积相加的和,其中间结果放在BXINCSI;/SI←SI+1修改工作初值LOOPLOPl;/循环控制,CX←CX-1MOVSUM,BX;/

乘积相加的总和送内存的SUM字单元MOVAH,4CHINT21HCODEENDSENDSTART第3章汇编语言程序设计初步●分析问题:由题意可知,这是一个比较循环操作。可以任选一个数作为比较的标准。比

如,先把第一个数分别送入AX和BX,既看作是最大数比较的标准,又可看作是最小数比较的标准。然后将数组后面的每一个数与之比较:如果它比AX中的当前值还大,那么就将该数存入AX;如果它比BX中的当前值还小,

那么将该数存入BX。经N-1次循环比较之后,AX和BX里分别就是所要求的最大数和最小数。●确定算法:采用采用比较循环指令,循环次数是N-1次。故用循环次数作为循环的控制条件,再配合使用LOOP指令。循环控制采用计数控制。●画程序流程图:见图3-10。

●确定汇编语言程序的基本框架:共三个循环体。该汇编语言程序的基本框架至少要两个段:数据段和代码段。数据段中至少定【例3-12】以BUF为首地址的数据段里存放着10个互不相等的16位有符号数,求出其中的最大数和最小数,然后分别存放到MAX和MIN字单元中。第3章汇编语言程序设计

初步义3个变量:一个数组变量BUF,由题设知为16位数,应选DW类型,使用寄存器SI定位。还有最大数MAX和最小数MIN两个变量,由题设知为16位数,选DW类型,其中间结果分别放在寄存器AX和BX。还有一个数N

,为循环次数,计数器用CX。●编写程序。本程序想向读者说明,用LOOP指令,结合采用无条件转移指令和条件转移指令,也可以实现程序的循环。可以想得到,需要MOV、LEA、CMP、JMP、JG、JL等指令。最后要返回DOS。具体程序如下:DATASEGMENTBUFDW36,-56,87,1

00,9000HDW12H,8000H,7543,0,-567MAXDW?MINDW?NEQUMAX-BUFDATAENDS第3章汇编语言程序设计初步CODESEGMENTASSUMECS:CODE.DS:DATASTART:MO

VAX,DATAMOVDS,AXLEASI,BUF;/送BUF的偏移地址到寄存器SIMOVCX,N-l;/送循环次数到寄存器CXMOVAX,[SI];/取第一个数到AXMOVBX,AX;/取第一个数到BXLOPl:ADDSI,2;/循环体1。SI←SI+2,为取下一个数

作准备CMPAX,[SI];/AX与下一个数比较JGLOP2:/AX大则转移到循环体LOP2MOVAX,[SI];/比AX还大的数,送AXJMPLOP3第3章汇编语言程序设计初步LOP2:CMPBX,[SI];/循环体2。BX与下一

个数比较JLLOP3;/BX小则转移到LOP3MOVBX,[SI];/比BX还小的数,送BXLOP3:LOOPLOPl;/循环体3。比较次数减l,CX←CX-1MOVMAX,AX;/存入最大数MOVMIN,BX;/存入最小数MOVAH.4CHINT21HCOD

EENDSENDSTART图3-10例3-12程序的流程图第3章汇编语言程序设计初步2.条件控制法即根据某个条件的成立与否来控制循环的执行。【例3-13】将正数n插入到一个所有的数均为正数、而且已经按递增次序排好的数组里面去,结果要保证仍然有序。该数组的首地址为ARHD。●分

析问题:由题意可知,这是一个循环次数不能事先确定的问题,可以用找到插入数的位置作为结束循环的条件。●确定算法:由于数组已按增序排列好,因此既可以从首地址开始往后比较;也可以从末地址开始往后比较,不过编程者必须先定义

末地址相应的变量AEND。●画程序流程图:略。●确定汇编语言程序的基本框架:可见,该汇编语言程序的基本框架至少要两个段:数据段和代码段。程序中要考虑到边界问题,即所插入的数可能比数组中所有的数都大或都小,即插入的位置可能在一头一尾。所以在定义数据段时,至少定义3

第3章汇编语言程序设计初步个变量:数组变量AEND,数组变量AEND前要留一空单元X,以供插入数时使用。数组之后又要留一空单元,里面放待插入的数N。这样的安排,就保证最多比较到单元N时,循环就可以结束。3个变量均选DW类型,使用寄存器SI定位。其中间结果放在寄存器BX

。●编写程序,可以想得到,需要MOV、LEA、CMP、JLE、JMP和INC等指令,最后返回DOS。未想到的,在编写过程中随时添加,如ADD指令等。下面给出两种解法,设待插入的数是N=32。具体程序如下:方法1:在每次比较过程中,如果从首地址开始往后比

较,若数组中的数比N小,则把其位置让给N,该数向前移,直到不小于N时,便是插入的位置。因为是逐次比较的结果,所以不必担心位置的冲突。如果插入的数比递增数组中的第一个数小,则插入X单元;如果插入的数比递增数组中的数都大,则插入数组的末单元。第3章汇

编语言程序设计初步DATASEGMENT;/定义数据段XDW?;/定义数组变量AEND前留的空单元XARHDDW3,5,10,15,23,37,52,78,99,105;/定义数组NDW32;/定义待插入的数N所在单元DATAENDS;/数据段定义结束COD

ESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX;/数据段初始化MOVAX,N;/AX←插入的正数32LEASI,ARHD;/SI←数组首地址第3章汇编语言程序设计初步LOPB:CMPAX

,[SI];/比较开始,逐步寻找插入位置JLELOPC;/如果插入的正数N小于或等于数组中的某数,则转移到LOPCMOVBX,[SI];/否则,将数组中的某数送寄存器BX暂存MOV[SI-2],BX;/比N小的数往前移一个字的位置ADD

SI,2;/SI←SI+2,为比较下一个数作准备JMPLOPB;/循环到LOPBLOPC:MOV[SI-2],AX;/找到N的位置,比较结束,插入MOVAH,4CHINT21H;/返回DOSCODEENDSENDSTART第3章汇编语言程序设计初步方法2:用MOVSW指令将插入位置前的

数一起移动。因此用CX作计数器,记录需要移位的个数。如果N比所有数都小,根本不需要循环。此时CX←0,不执行MOVSW指令,直接将数插入到X单元。如果N比所有数都大,则CX等于数组的个数,数组元素要全部移动,数据将插入到末单元。说明:MO

VSW指令表示将字符串按字的大小移动DATASEGMENTXDW?ARHDDW3,5,10,15,23,37,52,78,99,105NDW32DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVES,AX;/ES

与DS指向同一个段第3章汇编语言程序设计初步XORCX,CX;/计数器CX(用于统计数组中比N小的数的个数)的清零MOVAX,N;/AX←插入的正数32LEASI,ARHD;/SI←数组首地址LOPB:CMPAX,[SI];/比较开始,逐步寻找插入

位置JLELOPH;/如果插入的正数N小于或等于数组中的某数,则转移到LOPHADDSI,2;/否则,SI←SI+2INCCX;/计数加1JMPLOPB;/循环到LOPBLOPH:LEASI,ARHD;

/SI←源串首地址LEADI,X;/DI←目的串首地址CLD;/方向标志清零,表示SI,DI将自动增量REPMOVSW;/如果CX≠0,则重复CX←CX-1,ES:[DI]←DS:[SI],将插入位置前的数一起向前移动一位,让出位置给N第3章汇编语言程序设

计初步MOV[DI],AX;/插入MOVAH,4CHINT2lHCODEENDSENDSTART在具体的程序设计中,可以依据问题的需要,单独使用某一种方法来控制循环,比如计数控制法和条件控制法;也可以将计数控制法和条件控制法联合起来使用,而且控制条件可以是1个或者多个。总之,这些都要由实际

问题的需要来决定。第3章汇编语言程序设计初步3.逻辑尺控制法计数控制法和条件控制法是用来控制单一程序段重复执行的次数的。但有些问题则需要根据条件,分别控制两种不同的操作(或程序段)重复执行的次数。为了区别两种不同的操作,我们用二进制位的1表示执行第一种操作,用0表示执行第二种操

作,并且在内存中设置一个字或字节单元,让它的各位分别记录各次操作的种类:是1类操作,还是0类操作。这个子或字节单元,称为“逻辑尺”。其中l和0的位数分别代表要重复执行的两种操作的次数。进入循环后,通过对这个单元的顺序移

位查找,识别标志位就可以确定应该执行哪种操作。利用逻辑尺来进行循环控制的方法,称为逻辑尺控制法。第3章汇编语言程序设计初步【例3-16】设有数组X和Y。X数组中有X1,X2,…,X10;Y数组中有Yl,Y2,…

,Y10。试编制程序计算:Z1=X1+Y1Z2=X2+Y2Z3=X3一Y3Z4=X4一Y4Z5=X5–Y5Z6=X6+Y6Z7=X7一Y7Z8=X8一Y8Z9=X9+Y9Z10=X10+Y10结果存入Z数组。●分析问题:对于这种

问题,我们也可用循环程序结构来完成。由题意可知,这里有两种操作:加法和减法。为了区别每次应该做哪一种操作,可以设立标志位,如标志位为0做加法,为l做减法,这样进入循环后只要判别标志位就可确定应该做的操作了。●确定算法:采用循环指令,循环次数是n=10次。故用循

环次数作为循环的控制条件,再配合使用LOOP指令。循环控制采用计数控制。显然,这里要做10次操作就应该设立10个标志位,我们把它放在一个存储单元LOGIC.RULE中,这种存储单元一般称为逻辑尺,本例设定的逻辑尺为:第3章汇编语言程序设计初步0000000011011100从低位开始所设的标志位

反映了每次要做的操作顺序,最高的6位没有意义把它们设为0。●画程序流程图:见图3-11。●确定汇编语言程序的基本框架:可见,该汇编语言程序的基本框架至少要两个段:数据段和代码段。数据段中至少定义4个变量:两个数组变量X

和Y,设为16位数,应选DW类型,使用寄存器BX定位。和(差)数Z变量,为10个字的数据缓冲区,选DW类型,其中间结果放在寄存器AX。计数器用CX,逻辑尺放在寄存器DX。●编写程序,可以想得到,需要MOV、ADD、SUB、SHR

、JC、JMP和LOOP等指令。最后要返回DOS。具体程序如下:第3章汇编语言程序设计初步DATASEGMENTXDWl,2,9,8,7,3,6,5,4,1YDW2,l,2,3,4,2,3,2,l,5ZDW10DU

P(?)LOGIC_RULEDW00DCH;/定义逻辑尺DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX;/数据段初始化MOVCX,10;/设置循环次数MOVBX,0;/寄存器BX清零MOVDX,LOGIC-RUL

E;/送逻辑尺首地址到DX图3-11例3-16程序流程图第3章汇编语言程序设计初步L:MOVAX,X[BX];/依次送变量X的值到寄存器AXSHRDX,l;/逻辑尺右移1位,最高位进入标志寄存器的CF位JCSUBB;/当CF=1,进行“1”类操作(减法),转SUBBADDA

X,Y[BX];/当CF=0,进行“0”类操作(加法)JMPRESULTSUBB:SUBAX,Y[BX];/作X–Y运算RESULT:MOVZ[BX],AX;/结果存入Z;ADDBX,2;/BX←BX+2,进入下一次运算LOOPL;/循环到L语句MOVAH,4CHINT21HCODEENDSEN

DSTART第3章汇编语言程序设计初步如果在一个循环体内又出现一个循环结构的程序段,那么这种程序设计结构被称为是多重循环或嵌套循环。在多重循环结构的设计中,主要应该掌握以下几点:(1)内循环应该完全包含在外循环的里面

,成为外循环体的一个组成部分。不允许循环结构交叉。(2)每次通过外层循环再次进入内层循环时,内层循环的初始条件必须重新设置。(3)外循环的初值应该安排在进入外循环体之前;内循环的初值应该安排在进入内循环之前,但必须在外

循环体之内。3.4.4多重循环第3章汇编语言程序设计初步(4)如果在各循环中都使用寄存器CX作计数控制,那么由于只有一个计数寄存器CX,因此在内循环设置CX初值前,必须先保存外循环中CX的值,出内循环时,必须恢复外循环使用的CX值。(5)转移指令只能从循

环结构内转出或可在同层循环内转移.而不能从另一个循环结构外转入该循环结构内。第3章汇编语言程序设计初步常见的双重循环的程序结构如下:外层循环初始化MOVCX,外层循环次数MLOOPl:……;外层循环体的指令MOVDI,CX;保存外层循环次数内层

循环初始化MOVCX,内层循环次数N;设置内层循环次数LOOP2:………;内层循环的循环体LOOPLOOP2;继续内层循环MOVCX,DI;恢复外层循环的次数……;外层循环体的指令序列LOOPLOOPl;继续外层循环第

3章汇编语言程序设计初步下面将用例子来说明多重循环的使用方法。【例3-13】试编写一个程序:设在以SCORE为首址的内存区中依次存放着某考区100个理科生的七门成绩.现要统计每个考生的总成绩,并将其存放在该考生单科成绩之后的两个单元。●分析问题:这个问题可用双

重循环程序结构来完成。累加每个学生的7门成绩,使用一个内循环,对不同的学生重复同样的操作,使用外循环,次数100。●确定算法:这个问题直观的考虑:从第一个学生开始累加他的7门成绩,设CX←7,使用一个内循环,每累加一次CX减1,当CX=0时控制内循环结束,并把总成绩存入到后续的两个单元中。

然后,需要累加第二个学生的成绩,累加的过程同上,依此类推,可以累加每个学生的成绩。但是此时重要的是判断循环什么时候累加所有的学生成绩完毕,为此需要一层外循环,设置BL←学生总人数,每累加完一个学生,BL的值减1

.直至BL=0,外循环结束。●画程序流程图:根据这个思路绘制程序框图,见图3-12。第3章汇编语言程序设计初步●确定汇编语言程序的基本框架:可见,该汇编语言程序的基本框架至少要两个段:数据段和代码段。

数据段中至少定义1个数组变量SCORE,因学生成绩不会超过100=64H,选DB类型,共100组,每组10个数据,第一个数是学号,接着是7门成绩,最后是该生的总成绩,显然是16位数,应该占据该考生单科成绩之后

的两个单元,初始化为00,00。使用寄存器SI定地址位。累计总成绩的中间结果放在寄存器AX。外循环次数计数器用用寄存器BL,内循环次数计数器用寄存器CX。●编写程序,可以想得到,需要MOV、LEA、ADD、

ADC、XOR、INC、JNZ、DEC和LOOP等指令。最后要返回DOS。具体程序如下:图3-12例3-13程序执行流程图第3章汇编语言程序设计初步DATASEGMENTSCOREDB01,70,85,84,92,70,49,85,00,00DB02,65,80,90,85,69,42,89,

00,00…………………………………………………………DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATAMOVAX,DATAMOVDS,AX;/给数据段赋值BEGIN:LEASI,

SCORE;/将数据缓冲区SCORE首地址送SIMOVBL,100;/将外循环次数送寄存器BLLOP2:MOVCX,7;/内循环次数送寄存器CXXORAX,AX;/将寄存器AX清0第3章汇编语言程序设计初步INCSI;/SI←SI+1,除开学号,从学生成绩开始进行累加LOPl:ADDA

L,[SI];/从第一个学生第一门成绩开始累加他的7门成绩ADCAH,0;/AH←(CF)+0,统计进位的数值INCSI;/SI←SI+1,进入第二门成绩存放地址LOOPLOPl;(/CX)←(CX)–1,若(CX)≠0,继续循环LOPl,判断内循环是否结束MOVW

ORDPTR[SI],AX;/一个学生7门成绩累加完毕后,其总成绩存放在各门成绩后续的两个内存单元中INCSI;/移动指针SI一次INCSI;/再移动指针SI一次DECBL;/一个学生7门成绩累加完毕,外循环次数减1J

NZLOOP2;/若(BL)≠0,继续外循环MOVAH,4CH;/返回DOSINT21H第3章汇编语言程序设计初步CODEENDS;/代码段结束ENDBEGIN第3章汇编语言程序设计初步本章小结本章主要介绍了汇编程序设计的结构和基本方法。重点是掌握三种程序设计结构,即顺序结构、分支结构和循环结构

。分支结构有两种形式:双路分支和多路分支结构。分支程序通常采用如下两种方法来实现程序的转移:(1)通过比较、测试指令形成条件,或通过指令运算,然后判断某些标志位的条件来进行转移。(2)通过地址表来进行转移。循环程序结构有两种形式:先执行后判断的DO—uNTII。结构和先判断后执行的D

0一WHILE结构。D0-UNTIL结构循环至少会执行一次,而D0-WHILE结构的循环可能会执行零次。第3章汇编语言程序设计初步Thankyouverymuch!本章到此结束,谢谢您的光临!返回本章首页结束

小橙橙
小橙橙
文档分享,欢迎浏览!
  • 文档 25747
  • 被下载 7
  • 被收藏 0
相关资源
广告代码123
若发现您的权益受到侵害,请立即联系客服,我们会尽快为您处理。侵权客服QQ:395972555 (支持时间:9:00-21:00) 公众号
Powered by 太赞文库
×
确认删除?