《工学第3章汇编语言程序设计初步》由会员分享,可在线阅读,更多相关《工学第3章汇编语言程序设计初步(99页珍藏版)》请在金锄头文库上搜索。
1、第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步工学第3章汇编语言程序设计初步Stillwatersrundeep.流静水深流静水深,人静心深人静心深Wherethereislife,thereishope。有生命必有希望。有生命必有希望第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步3.1 系统功能调用系统功能调用3.1.1 系统功能调用概述系统功能调用概述3.1.2 基本基本I/O调用调用返回本章首页返回本章首页第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步3.1.1 3.1.1 系统功能调用概述系统功能调用概述 我我们们在在编编制制汇汇编编源源程程序序时时,常常
2、常常要要与与外外部部设设备备发发生生关关系系,如如希希望望能能从从键键盘盘输输入入字字符符或或在在显显示示器器上上显显示示出出程程序序运运行行的的结结果果,但但由由于于计计算算机机机机种种的的不不同同、外外部部设设备备型型号号的的差差异异,控控制制它它们们工工作作的的程程序序也也会会有有差差异异。如如果果每每次次都都需需要要根根据据自自己己的的工工作作环环境境来来设设计计“控控制制这这些些外外设设工工作作 的的程程序序”,则则必必须须要要先先弄弄清清楚楚与与之之有有关关的的设设备备、电电路路、接接口口等等各各方方面面的的情情况况,是是一一件件既既复复杂杂,效效率率又又低低的的事事情情,并且没有
3、通用性。并且没有通用性。 如果把这些控制过程预先编写成一个一个子如果把这些控制过程预先编写成一个一个子第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步程序,作为操作系统的一部分事先放在系统盘上,程序,作为操作系统的一部分事先放在系统盘上,用户在需要时只要按规定的格式设置好参数,直接用户在需要时只要按规定的格式设置好参数,直接调用这些子程序即可。美国调用这些子程序即可。美国MICROSOFT公司为公司为我们提供的磁盘操作系统(我们提供的磁盘操作系统(DOS)就具有这种功能)就具有这种功能,称为,称为“利用操作系统的标准功能调用(简称系统利用操作系统的标准功能调用(简称系统功能调用)功能调
4、用)”,编号从,编号从062H(3.0版),版),主要分主要分为设备管理(如键盘、显示器、打印机、磁盘等的为设备管理(如键盘、显示器、打印机、磁盘等的管理)、文件管理、目录管理及其他功能调用管理)、文件管理、目录管理及其他功能调用4大大类。类。第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步系统功能调用的基本方法系统功能调用的基本方法 采用一条软中断指令采用一条软中断指令INT n 。所谓中断,是。所谓中断,是指当计算机正在执行正常的程序时,计算机系统指当计算机正在执行正常的程序时,计算机系统中的某个部分突然出现某些异常情况或特殊请求,中的某个部分突然出现某些异常情况或特殊请求,CPU
5、这时就中止(暂停)它正在执行的程序,而这时就中止(暂停)它正在执行的程序,而转去执行申请中断的那个设备或事件的中断服务转去执行申请中断的那个设备或事件的中断服务程序,执行完这个服务程序后,再自动返回到程程序,执行完这个服务程序后,再自动返回到程序断点执行原来中断了的正常程序。这个过程或序断点执行原来中断了的正常程序。这个过程或这种功能就叫做中断。这种功能就叫做中断。 软中断是以指令方式产生的中断,软中断是以指令方式产生的中断,n是中断是中断类型号,不同的类型号,不同的n将转入不同的中断处理程序。将转入不同的中断处理程序。系统功能调用是系统功能调用是21号软中断。号软中断。第第3 3章章 汇编语
6、言程序设计初步汇编语言程序设计初步常用的系统功能调用表常用的系统功能调用表:表表3-1 最常用的系统功能调用表最常用的系统功能调用表第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步系统功能调用的步骤系统功能调用的步骤:1)将调用参数装入指定的寄存器。)将调用参数装入指定的寄存器。2)如需要功能调用号(即欲调用的子程序编号)如需要功能调用号(即欲调用的子程序编号),把它装入寄存器,把它装入寄存器AH。3)如需要子功能调用号,把它装入)如需要子功能调用号,把它装入AL。4)按中断号调用)按中断号调用DOS(发出中断指令:(发出中断指令:INT 21H)。)。5)检查返回参数是否正确。)检查
7、返回参数是否正确。第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步3.1.2 3.1.2 基本基本I/OI/O调用调用101H号调用号调用 功能:从标准输入设备上(通常为键盘)读取功能:从标准输入设备上(通常为键盘)读取字符,并在标准输出设备上(通常为显示器)回显。字符,并在标准输出设备上(通常为显示器)回显。 格式:格式:MOV AH 01H INT 21H 说明:输入字符的说明:输入字符的ASCII码送入码送入AL中,如果读中,如果读到的字符是到的字符是Ctrl+C或或Ctrl+Break,则结束程序。,则结束程序。202H号调用号调用 功能:通过标准输出设备(多为显示器)输出功能
8、:通过标准输出设备(多为显示器)输出字符。字符。第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步 格式:格式:MOV DL, X;(X为要输出显示的为要输出显示的ASCII字符代码字符代码) MOV AH,02H INT 21H 说明:说明:DL寄存器中的内容等于要输出字符的寄存器中的内容等于要输出字符的ASCII码,在码,在显示输出时检查到的字符是显示输出时检查到的字符是Ctrl+C或或Ctrl+Break键的,则结束键的,则结束程序。程序。309H号调用号调用 功能:在标准输出上(通常为显示器)显示一个字符串。功能:在标准输出上(通常为显示器)显示一个字符串。字符串要以字符字符串要
9、以字符“$”为结束标志。为结束标志。 格式:格式:MOV AH 09H INT 21H 说明:要输出显示的字符串的首地址送到说明:要输出显示的字符串的首地址送到DS、DX两个寄存器中,其中段地址送两个寄存器中,其中段地址送DS寄存器,寄存器,第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步偏移地址送偏移地址送DX寄存器。寄存器。40AH号调用号调用 功能:从标准输入设备上(通常为键盘)读功能:从标准输入设备上(通常为键盘)读一个字符串,存入内存,直到按回车键为止。一个字符串,存入内存,直到按回车键为止。 格式:格式:MOV AH,0AH INT 21H 说明:此项操作,要求事先定义一个
10、输入缓说明:此项操作,要求事先定义一个输入缓冲区,它的缓冲区首地址送到冲区,它的缓冲区首地址送到DS、DX两个寄存两个寄存器中,其中段地址送器中,其中段地址送DS寄存器,偏移地址送寄存器,偏移地址送DX寄存器。寄存器。第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步【例例3-1】在显示器上显示字符串在显示器上显示字符串Welcome to TianHe college!DATAS SEGMENT ;/数据段定义开始数据段定义开始 STRING DB Welcome to TianHe college!,0AH,0DH,$;/定义字符串,定义字符串,0AH,0DH表示显示字符串后,光标可
11、自动表示显示字符串后,光标可自动 回车换行,字符串必须以回车换行,字符串必须以$结束。结束。 DATAS ENDS ;/数据段定义结束数据段定义结束CODES SEGMENT ;/代码段定义开始代码段定义开始ASSUME CS:CODES,DS:DATAS,SS:STACKS ; /说明段和段寄存器之间的关系说明段和段寄存器之间的关系START: MOV AX,DATAS ;/将数据段的段地址送寄存器将数据段的段地址送寄存器AX MOV DS,AX ;/将将AX内容送内容送DS寄存器,即初始化寄存器,即初始化DS LEA DX,STRING ;/将将STRING的偏移地址送的偏移地址送DX寄存
12、器寄存器 第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步 MOV AH,9 ;/字符串显示子功能,字符串显示子功能,9号系统功能调用号系统功能调用 INT 21H ;/系统调用系统调用 MOV AH,4CH ;/返回返回DOS INT 21H ;/系统调用系统调用CODES ENDS ;/代码段定义结束代码段定义结束END START【例例3-2】从键盘输入字符串,把它放到缓冲区中存储起来。从键盘输入字符串,把它放到缓冲区中存储起来。DATA SEGMENT MAXLEN DB 100 ;/定义缓冲区的最大容量定义缓冲区的最大容量 ACLEN DB ? ;/定义实际读入的字符数定义实
13、际读入的字符数 STRING DB 100 DUP(?););/定义接收字符串空间定义接收字符串空间DATA ENDS第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步CODE SEGMENT MOV AX,DATA MOV DS,AX ;/数据段初始化数据段初始化 LEA DX,MAXLEN ;/送送 MAXLEN的偏移地址到寄存器的偏移地址到寄存器DX MOV AH,10 ;/10号系统功能调用号系统功能调用 INT 21H ;/系统调用系统调用CODE ENDS运行程序时,若从键盘输入运行程序时,若从键盘输入“Thank you!”(共计(共计10个字符),则输入缓个字符),则输入
14、缓冲区冲区MAXLEN各单元的内容如图各单元的内容如图3-1所示。所示。图图3-1 存储空间分配示意存储空间分配示意第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步3.2 汇编语言源程序的设计的基本步骤汇编语言源程序的设计的基本步骤3.2.1 源程序的基本框架源程序的基本框架3.2.2 汇编语言源程序设计的基本步骤汇编语言源程序设计的基本步骤3.2.3 顺序结构的汇编语言源程序的编写顺序结构的汇编语言源程序的编写返回本章首页返回本章首页第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步3.2.1 3.2.1 源程序的基本框架源程序的基本框架 一个汇编语言源程序由两大部分组成的。其
15、中主一个汇编语言源程序由两大部分组成的。其中主要部分就是指令,位于代码段内,代码段可以有好几要部分就是指令,位于代码段内,代码段可以有好几个。其他部分是为指令服务的,包括数据的准备,存个。其他部分是为指令服务的,包括数据的准备,存储区域的划分和地址的标注。其他部分由数据段、堆储区域的划分和地址的标注。其他部分由数据段、堆栈段和扩展段组成。也各可以有好几个。段之间的顺栈段和扩展段组成。也各可以有好几个。段之间的顺序可以随意安排。但通常是其他部分(数据段、堆栈序可以随意安排。但通常是其他部分(数据段、堆栈段和扩展段等)在前,代码段在后。虽然可以定义多段和扩展段等)在前,代码段在后。虽然可以定义多个
16、段,但由于段首址存放在个段,但由于段首址存放在CPU的寄存器中,所以可的寄存器中,所以可以同时使用以同时使用6个段:代码段(个段:代码段(CS)、数据段()、数据段(DS)、)、堆栈段(堆栈段(SS)和)和3个扩展段(个扩展段(ES、FS和和GS)。扩展)。扩展段其实也是数据段,只是段地址在寄存器段其实也是数据段,只是段地址在寄存器ES、FS和和GS中。程序通过修改段寄存器的值实现段的切换。中。程序通过修改段寄存器的值实现段的切换。第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步一个程序至少包含一个代码段和一个程序至少包含一个代码段和END指令。其他段的指令。其他段的设置由程序的具体功
17、能需要而定。程序较小时,可以设置由程序的具体功能需要而定。程序较小时,可以不设置堆栈段。操作系统在装载不含堆栈段的程序时,不设置堆栈段。操作系统在装载不含堆栈段的程序时,会指定一个段作为堆栈段使用。这样,程序连接时,会指定一个段作为堆栈段使用。这样,程序连接时,LINK会产生一条警告信息:会产生一条警告信息:WARNING:NO STACK SEGMENT 但不会影响程序的运行,可以忽略它。但不会影响程序的运行,可以忽略它。 程序中的段名可以是唯一的,也可以与其它段同程序中的段名可以是唯一的,也可以与其它段同名。在同一模块中,如果有两个段同名,则后者被认名。在同一模块中,如果有两个段同名,则后
18、者被认为是前段的后续,这样,它们就属同一段。当同一模为是前段的后续,这样,它们就属同一段。当同一模块出现两个同名段时,则后者的可选项属性要么与前块出现两个同名段时,则后者的可选项属性要么与前者相同,要么不写其属性而选用前者的段属性。者相同,要么不写其属性而选用前者的段属性。第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步【例例3-4】段寄存器与段的对应段寄存器与段的对应方法方法1:用一个段寄存器对应两个数据段用一个段寄存器对应两个数据段DATA1 SEGMENT ;/定义第一个数据段定义第一个数据段 b1 DB10h ;/定义变量定义变量DATA1,字节变量,字节变量DATA1 END
19、S ;/第一个数据段结束第一个数据段结束DATA2 SEGMENT ;/定义第二个数据段定义第二个数据段 b1 DB23h ;/定义变量定义变量DATA2,字节变量,字节变量DATA2 ENDS ;/第二个数据段结束第二个数据段结束CODE1 SEGMENT ;/定义第一个代码段定义第一个代码段ASSUMECS:CODE1, DS:DATA1 ;/指定段寄存器指定段寄存器START: MOV AX, DATA1 ;/指令开始,指令开始, MOV DS, AX ;/把数据段把数据段DATA1的段首址赋给段寄存器的段首址赋给段寄存器DS第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步 MO
20、V BL, b1 ;/引用引用DS来访问来访问DATA1中的变量中的变量b1ASSUMEDS:DATA2 ;/说明说明DS与与DATA2建立联系建立联系MOV AX, DATA2;MOV DS, AX ;/把数据段把数据段DATA2的段值赋给段寄存器的段值赋给段寄存器DS /实现段的切换实现段的切换MOV AL, b2 ;/引用引用DS来访问来访问DATA2中的变量中的变量b2 CODE1 ENDS ;/代码段代码段CODE1结束结束END START ;/程序结束程序结束 在方法在方法1中,因为只使用一个段寄存器中,因为只使用一个段寄存器DS来对应两个数来对应两个数据段,所以,需要切换据段,
21、所以,需要切换DS的对应关系。但我们也可以用段的对应关系。但我们也可以用段寄存器寄存器DS和和ES来分别对应段来分别对应段DATA1和和DATA2,这样,方法,这样,方法1就可变成方法就可变成方法2。第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步方法方法2:用两个段寄存器对应两个数据段用两个段寄存器对应两个数据段DATA1 SEGMENT ;/定义第一个数据段定义第一个数据段 b1 DB10h ;/定义变量定义变量DATA1,字节变量,字节变量DATA1 ENDS ;/第一个数据段结束第一个数据段结束DATA2 SEGMENT ;/定义第二个数据段定义第二个数据段 b2 DB23h
22、;/定义变量定义变量DATA2,字节变量,字节变量DATA2 ENDS ;/第二个数据段结束第二个数据段结束CODE1 SEGMENT ;/定义第一个代码段定义第一个代码段ASSUMECS:CODE1, DS:DATA1, ES:DATA2 ;/指定段寄存器指定段寄存器START: MOV AX, DATA1 ;/指令开始,指令开始, MOV DS, AX ;/把数据段把数据段DATA1的段首址赋给段寄存器的段首址赋给段寄存器DS MOV AX, DATA2 MOV ES, AX ;/把数据段把数据段DATA2的段首址赋给段寄存器的段首址赋给段寄存器ES 第第3 3章章 汇编语言程序设计初步汇
23、编语言程序设计初步 MOV BL, b1 ;/引用引用DS来访问来访问DATA1中的变量中的变量b1 MOV AL, b2 ;/引用引用ES来访问来访问DATA2中的变量中的变量b2 CODE1 ENDS ;/代码段代码段CODE1结束结束END START ;/程序结束程序结束 我们还可以用我们还可以用“段组段组”来简化段寄存器的使用,把段来简化段寄存器的使用,把段DATA1和和DATA2组成一个数据段。所以,把方法组成一个数据段。所以,把方法2再改写成再改写成方法方法3的形式。的形式。方法方法3:用一个段组组成两个数据段用一个段组组成两个数据段GSEG GROUP DATA1, DATA2
24、 ;/定义段组定义段组DATA1 SEGMENT ;/定义第一个数据段定义第一个数据段第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步 b1 DB10h ;/定义变量定义变量DATA1,字节变量,字节变量DATA1 ENDS ;/第一个数据段结束第一个数据段结束DATA2 SEGMENT ;/定义第二个数据段定义第二个数据段 b2 DB23h ;/定义变量定义变量DATA2,字节变量,字节变量DATA2 ENDS ;/第二个数据段结束第二个数据段结束CODE1 SEGMENT ;/定义第一个代码段定义第一个代码段 ASSUMECS:CODE1, DS: GSEG START: MOV
25、AX, GSEG ;/指令开始,指令开始, MOV DS, AX ;/把段组把段组GSEG的段值赋给段寄存器的段值赋给段寄存器DS MOV BL, b1 ;/引用引用DS来访问来访问DATA1中的变量中的变量b1 MOV AL, b2 ;/引用引用DS来访问来访问DATA2中的变量中的变量b2第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步 CODE1 ENDS ;/代码段代码段CODE1结束结束END START ;/程序结束程序结束 定义段组后,段组内各段所定义的标号和变量,除了定义段组后,段组内各段所定义的标号和变量,除了与定义它们的段起始点相关外,还与段组的起始点相关。与定义它
26、们的段起始点相关外,还与段组的起始点相关。规定如下:规定如下: 如果在如果在ASSUME伪指令中说明段组与段寄存器相对应,伪指令中说明段组与段寄存器相对应,那么,有关标号或变量的偏移量就相对于段组起点计算;那么,有关标号或变量的偏移量就相对于段组起点计算; 如果在如果在ASSUME伪指令中说明段组内的某段与段寄存伪指令中说明段组内的某段与段寄存器相对应,那么,有关标号或变量的偏移量就相对于该段器相对应,那么,有关标号或变量的偏移量就相对于该段的起点。的起点。 所以,在使用段组后,程序员要谨慎使用所以,在使用段组后,程序员要谨慎使用ASSUME伪伪指令,并保证段寄存器的值与段组或段相一致。指令,
27、并保证段寄存器的值与段组或段相一致。第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步3.2.2 3.2.2 汇编语言源程序设计的基本步骤汇编语言源程序设计的基本步骤1.汇编语言源程序汇编语言源程序的的主要主要基本结构基本结构: 顺序结构顺序结构 分支结构分支结构 循环结构循环结构2.好程序的好程序的要求要求一个好的程序,首先应该能正常运行,实现预定的功一个好的程序,首先应该能正常运行,实现预定的功能。还应该满足:能。还应该满足:结构简明,明白易懂,调试方便,修改容易。结构简明,明白易懂,调试方便,修改容易。执行速度快(程序执行时间短,程序语句行数尽量执行速度快(程序执行时间短,程序语句
28、行数尽量少)。少)。占用内存空间少。占用内存空间少。第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步3.基本步骤基本步骤分析问题,从中抽象出恰当的数学模型。分析问题,从中抽象出恰当的数学模型。确定解决问题的合理算法。确定解决问题的合理算法。画出程序流程图,根据算法,细化并找出解决问画出程序流程图,根据算法,细化并找出解决问题的思路和具体方法。题的思路和具体方法。确定汇编语言程序的基本框架:各个存储段的定确定汇编语言程序的基本框架:各个存储段的定义,存储空间的分配,寄存器的配置,指针和计数义,存储空间的分配,寄存器的配置,指针和计数器的选择。器的选择。根据程序流程图确定程序的基本结构,并
29、编写程根据程序流程图确定程序的基本结构,并编写程序。序。第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步3.2.3 3.2.3 顺序结构的汇编语言源程序的编写顺序结构的汇编语言源程序的编写 顺顺序序结结构构是是最最简简单单的的程程序序结结构构,没没有有分分支支,没没有有循循环环,程程序序的的执执行行顺顺序序就就是是指指令令的的编编写写顺顺序序,所所以以,又又称称直直线线程程序序。因因此此,安安排排指指令令的的先先后后次次序序就就显显得得至至关关重重要要。另另外外,在在编编程程序序时时,还还要要妥妥善善保保存存已已得得到到的的处处理理结结果果,为为后后面面的的进进一一步步处处理理直直接接
30、提提供供前前面面的的处处理理结结果果,从从而而避避免免不不必必要要的的重重复操作。复操作。第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步【例例3-5】两个两个64位无符号数相加位无符号数相加分析问题:分析问题:在在8086/8088CPU中,只有中,只有8位或位或16位运算指位运算指令,没有令,没有32位和位和64位以上的运算指令。位以上的运算指令。确定算法:确定算法:要进行要进行64位的加法运算,可以确定算法:位的加法运算,可以确定算法:利用利用16位加法指令分别相加位加法指令分别相加4次来实现。次来实现。画程序流程图:画程序流程图:本问题简单,无需画程序流程图。本问题简单,无需画
31、程序流程图。确定汇编语言程序的基本框架:确定汇编语言程序的基本框架:可见,汇编语言程序可见,汇编语言程序的基本框架至少要两个段:数据段和代码段。数据段中的基本框架至少要两个段:数据段和代码段。数据段中至少定义至少定义3个变量:两个加数个变量:两个加数N1、N2,还有一个和数,还有一个和数SUM,都是,都是DW类型。和数类型。和数SUM尚属未知,故应定义一尚属未知,故应定义一个个5个字长(比个字长(比64位字长富余一点)的缓冲区。因为要加位字长富余一点)的缓冲区。因为要加4次,需要一个计数器或指针,可选寄存器次,需要一个计数器或指针,可选寄存器BX充当。充当。编写程序,可以想得到,需要编写程序,
32、可以想得到,需要MOV、ADD、ADC和和INC等指令。等指令。具体程序如下:具体程序如下:第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步DATA SEGMENT ;/定义数据段定义数据段 N1 DW1234H,5678H,9ABCH,0DEF0H;/定义字变定义字变量量N1 N2 DW1971H,0313H,1968H,1123H;/定义字变量定义字变量N2 SUM DW5DUP(?);(?);/定义缓冲区定义缓冲区SUMDATA1 END ;/数据段结束数据段结束CODE SEGMENT ;/定义第一个代码段定义第一个代码段ASSUMECS:CODE,DS: DATA ;/指定段
33、寄存器指定段寄存器MAIN PROC NEARSTART: MOV AX, DATA ;/指令开始,指令开始, MOV DS, AX ;/把数据段的段首址赋给段寄存器把数据段的段首址赋给段寄存器DS LEA BX,N1 ;/将将N1的偏移地址送的偏移地址送BX MOV AX,BX ;/引用引用DS来访问来访问DATA中的变量中的变量N1的最低位的最低位第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步 ADD AX,BX8 ;/最低位字相加,因两个数偏移地址相差最低位字相加,因两个数偏移地址相差8个字节个字节 MOV BX16, AX ;/存最低位和。存最低位和。BX16指示指示SUM的
34、偏移地址的偏移地址 此句也可以写为:此句也可以写为:MOV SUM, AX INC BX INC BX ;/指针指向下一个字指针指向下一个字 MOV AX,BX ;/引用引用DS来访问来访问DATA中的变量中的变量N1的次低位的次低位 ADC AX,BX8 ;/次低位字相加,因两个数偏移地址相差次低位字相加,因两个数偏移地址相差8个字节个字节 MOV BX16, AX ;/存次低位和。存次低位和。BX16指示指示SUM1的偏移的偏移 地址,此句也可以写为:地址,此句也可以写为:MOV SUM1, AX INC BX INC BX ;/指针指向下一个字指针指向下一个字 MOV AX,BX ;/引
35、用引用DS来访问来访问DATA中的变量中的变量N1的次高位的次高位 ADC AX,BX8 ;/次高位字相加,因两个数偏移地址相差次高位字相加,因两个数偏移地址相差8个字节个字节第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步MOV BX16, AX ;/存次高位和。存次高位和。BX16指示指示SUM2的偏移的偏移 地址,此句也可以写为:地址,此句也可以写为:MOV SUM2, AXINC BXINC BX ;/指针指向下一个字指针指向下一个字MOV AX,BX ;/引用引用DS来访问来访问DATA中的变量中的变量N1的最高位的最高位ADC AX,BX8 ;/最高位字相加,因两个数偏移地
36、址相差最高位字相加,因两个数偏移地址相差8个字节个字节MOV BX16, AX ;/存最高位和。存最高位和。BX16指示指示SUM3的偏移的偏移 地址,此句也可以写为:地址,此句也可以写为:MOV SUM3, AXMOV AX,0 ;/对对AX清零清零ADC AX,0 ;/计算进位计算进位MOV BX18, AX ;/存进位位存进位位MOV AH,4CH ;/此句也可写成:此句也可写成:MOV AX,4C00HINT 21HMAIN ENDPCODE ENDS ;/代码段代码段CODE1结束结束 END START ;/程序结束程序结束 第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步
37、【例例3-6】两个两个32位无符号数乘法程序位无符号数乘法程序分析问题:分析问题:在在8086/8088CPU中,只有中,只有8位或位或16位运算指令,没位运算指令,没有有32位以上的乘法运算指令。位以上的乘法运算指令。确定算法:确定算法:要进行要进行32位的乘法运算,可以确定算法:利用位的乘法运算,可以确定算法:利用16位乘法指令做位乘法指令做4次乘法,然后把部分积相加来实现。每次的积的次乘法,然后把部分积相加来实现。每次的积的低位送低位送AX,高位送,高位送DX。如图。如图3-2所示。所示。画程序流程图:画程序流程图:程序流程图如图程序流程图如图3-3所示。所示。确定汇编语言程序的基本框架
38、:确定汇编语言程序的基本框架:可见,汇编语言程序的基本可见,汇编语言程序的基本框架至少要两个段:数据段和代码段。数据段中至少定义框架至少要两个段:数据段和代码段。数据段中至少定义3个变个变量:两个乘数,还有一个积数,都是量:两个乘数,还有一个积数,都是DW类型。积数尚属未知,类型。积数尚属未知,故应定义一个故应定义一个4个字长(积的字长应该是乘数字长的两倍)的缓个字长(积的字长应该是乘数字长的两倍)的缓冲区。因为要乘冲区。因为要乘4次,需要一个计数器或指针,可选寄存器次,需要一个计数器或指针,可选寄存器BX充当。另外,本程序为了教学的需要,不采用充当。另外,本程序为了教学的需要,不采用MOV
39、AH,4CH INT 21H第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步来返回来返回DOS。而改用。而改用“先将程序先将程序段前缀的起始地址及数据段段前缀的起始地址及数据段DS段首址和偏移地址段首址和偏移地址AX存入堆栈,存入堆栈,再用指令再用指令RET返回返回DOS的方法。的方法。所以,又定义了所以,又定义了100个字节的堆个字节的堆栈段。同时堆栈段又为保存最栈段。同时堆栈段又为保存最后的进位位提供了条件。后的进位位提供了条件。 编写程序,可以想得到,编写程序,可以想得到,需要需要MOV、MUL、ADD、ADC、PUSH、PUSHF和和RET等指令。等指令。具体程序如下:具体程序
40、如下:第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步 NUME 32bit MULTIPLY;程序名程序名“32位乘法位乘法”DATA SEGMENT ;数据段定义开始数据段定义开始MULNUM DW 0000H,0FFFFH,0000H,0FFFFH,4DUP(?);DATA ENDS ;数据段定义结束数据段定义结束STACK SEGMENT PARA STACK STACK;堆栈段定义开始堆栈段定义开始 DB 100DUP (?) ;堆栈段长度为堆栈段长度为100字节字节STACK ENDS ;堆栈段定义结束堆栈段定义结束CODE SEGMENT ;代码段开始代码段开始 ASSU
41、ME CS:CODE,DS:DATA,SS:STACK;指定段寄存器指定段寄存器START PROC FAR;图3-3 程序流程图第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步BEGIN:PUSH DS ;将将DS中包含的程序段前缀压栈保存中包含的程序段前缀压栈保存 MOV AX,0 ;将将0送送AX,即设置,即设置AX的初值为的初值为0 PUSH AX ;将将DS中中AX的偏移地址压栈,这三句即保存返回至的偏移地址压栈,这三句即保存返回至DOS的段值和的段值和IP值。值。 MOV AX,DATA ; MOV DS,AX ;将数据段首地址送将数据段首地址送DS LEA BX,MULN
42、UM ;将将MULNUM的偏移地址送的偏移地址送BX,定义,定义了地址指针了地址指针MULNUM32:MOV AX,BX ;被乘数的低被乘数的低16位位BAX MOV SI,BX4 ;乘数的低乘数的低16位位DSI MUL SI ;BD,部分积,部分积1的低位送的低位送AX,部分积,部分积1的的 高位送高位送DX, MOV BX8,AX ;保存部分积保存部分积1的低位的低位 MOV BX0AH,DX ;保存部分积保存部分积1的高位的高位 MOV AX,BX2 ;被乘数的高被乘数的高16位位AAX第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步 MUL SI ;AD,部分积部分积2的低位
43、送的低位送AX,部分积,部分积2的高的高 位送位送DX ADD AX,BX0AH ;部分积部分积1的高位部分积的高位部分积2的低位的低位 ADC DX,0 ;加入部分积加入部分积1的低位的进位的低位的进位 MOV BX0AH,AX ;保存部分积保存部分积1的高位部分积的高位部分积2的低位的低位 MOV BX0CH,DX ;保存部分积保存部分积2的高位的高位 MOV AX,BX ;被乘数的低被乘数的低16位位BAX MOV DI,BX6 ;乘数的高乘数的高16位位CDI MUL DI ;BC,部分积,部分积3的低位送的低位送AX,部分积,部分积3的高位送的高位送DX ADD AX,BX0AH ;
44、部分积部分积1的高位部分积的高位部分积2的低位部分的低位部分 积积3的低位的低位 ADC DX,BX0CH ;部分积部分积2的高位部分积的高位部分积3的高位进位的高位进位 MOV BX0AH,AX ;保存部分积保存部分积1的高位部分积的高位部分积2的低位的低位 部分积部分积3的低位的低位 第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步 MOV BX0CH,DX ;保存部分积保存部分积2的高位部分积的高位部分积3的高位进位的高位进位 PUSHF ;将标志寄存器压栈,保存将标志寄存器压栈,保存“部分积部分积2的高位部分积的高位部分积3的的 高位进位高位进位”的进位位的进位位 MOV AX
45、,BX+2 ;被乘数的高被乘数的高16位位AAX MUL DI ;AC,部分积,部分积4的低位送的低位送AX,部分积,部分积4的高位送的高位送DX POPF ;弹出堆栈保存的弹出堆栈保存的“部分积部分积2的高位部分积的高位部分积3的高位进位的高位进位” ADC AX,BX+0CH ;部分积部分积4的低位部分积的低位部分积2的高位部的高位部 分积分积3的高位进位的高位进位 ADC DX,0 ;部分积部分积4的高位进位的高位进位 MOV BX+0CH,AX ;保存保存“部分积部分积4的低位部分积的低位部分积2的高位的高位 部分积部分积3的高位进位的高位进位”进位进位 MOV BX+0EH,DX ;
46、保存部分积保存部分积4的高位进位的高位进位 RET START ENDP CODE ENDS END BEGIN第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步 3.3 分支结构的汇编语言源程序的编写分支结构的汇编语言源程序的编写3.3.1 条件转移指令条件转移指令3.3.2 汇编语言分支结构程序的编写汇编语言分支结构程序的编写返回本章首页返回本章首页第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步在在汇汇编编语语言言程程序序设设计计中中,常常利利用用条条件件转转移移指指令令实实现现程程序序的的分分支支。指指令令助助记记符符是是随随条条件件变变化化而而变变化化的的,其其构构成成
47、方方法法是是:第第一一个个字字母母是是J,紧紧接接着着的的字字母母是是标标志志寄寄存存器器的的代代号号P、S、Z、,表表示示“条条件件”,条条件件满满足足,则则转转移移。例例如如JZ,表表示示结结果果为为0,则则转转移移;如如果果“条条件件”是是否否定定的的,就就在在已已构构成成的的两两个个字字母母间间加加字母字母N,例如,例如JNZ,表示结果不为,表示结果不为0,则转移。,则转移。条条件件转转移移指指令令只只有有一一个个操操作作数数,指指出出转转移移的的目目标标地地址址,并且只能是一个短标号,即转移的偏移地址是并且只能是一个短标号,即转移的偏移地址是8位的。位的。有有一一个个条条件件转转移移
48、指指令令JCXZ,构构成成方方法法较较特特殊殊,它它的的转转移移条条件件是是寄寄存存器器CX的的内内容容为为0,而而不不是是标标志志寄寄存器的某位的标志。存器的某位的标志。所有的条件转移指令都不影响标志位。所有的条件转移指令都不影响标志位。3.3.1 条件转移指令条件转移指令第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步(1)根据单个标志的设置情况的转移指令。)根据单个标志的设置情况的转移指令。共五种共五种10条:条:1)JZ(或(或JE););上一步的结果为零(或相等)则转移。上一步的结果为零(或相等)则转移。格式:格式:JE(或(或JZ) 标号标号测试条件:测试条件:ZF = 1
49、2)JNZ(或(或JNE););上一步的结果不为零(或不相等)则转移。上一步的结果不为零(或不相等)则转移。格式:格式:JNZ(或(或JNE) 标号标号测试条件:测试条件:ZF = 03)JS;上一步的结果为负,则转移。上一步的结果为负,则转移。格式:格式:JS 标号标号测试条件:测试条件:SF = 1 4)JNS;上一步的结果为正,则转移。;上一步的结果为正,则转移。现将所有的条件转移指令列举如下现将所有的条件转移指令列举如下:第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步格式:格式:JNS 标号标号测试条件:测试条件:SF = 05)JO;上一步的结果为溢出,则转移。上一步的结果
50、为溢出,则转移。格式:格式:JO 标号标号测试条件:测试条件:OF = 16)JNO;上一步的结果不为溢出,则转移。上一步的结果不为溢出,则转移。格式:格式:JNO 标号标号测试条件:测试条件:OF = 07)JP(或(或JPE););上一步的结果的奇偶标志位为上一步的结果的奇偶标志位为1,则转移。,则转移。格式:格式:JP 标号标号测试条件:测试条件:PF = 18)JNP(或(或JPO););上一步的结果的奇偶标志位为上一步的结果的奇偶标志位为0,则转移。则转移。格式:格式:JNP(或(或JPO) 标号标号测试条件:测试条件:PF = 09)JC;上一步有进位或借位,则转移。上一步有进位或
51、借位,则转移。第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步格式:格式:JC 标号标号测试条件:测试条件:CF = 110)JNC;上一步无进位或无借位,则转移。上一步无进位或无借位,则转移。格式:格式:JNC 标号标号测试条件:测试条件:CF = 0(2 2)比较两个无符号数,并根据比较结果的高低转移。)比较两个无符号数,并根据比较结果的高低转移。1 1)JA JNBEJA JNBE(或(或JNBEJNBE)高于,即不低于或等于,则转移。高于,即不低于或等于,则转移。格式:格式:JAJA(或(或JNBEJNBE) 标号标号测试条件:测试条件:CFCF0 0且且ZF = 0ZF =
52、02 2)JNAJNA(或(或JBEJBE)不高于,即低于或等于,即则转移。不高于,即低于或等于,即则转移。格式:格式:JBEJBE(或(或JNAJNA) 标号标号测试条件:测试条件:CF=0CF=0或或ZF = 1ZF = 13 3)JBJB(或(或JNAEJNAE,JCJC)低于,即不高于或等于,或进位为低于,即不高于或等于,或进位为1 1则转移则转移格式:格式:JBJB(或(或JNAEJNAE,JCJC) 标号标号第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步测试条件:测试条件:CF=14)JNB(或(或JAE,JNC)不低于,或高于或等于,或进位为不低于,或高于或等于,或进位
53、为0则转移则转移格式:同上格式:同上测试条件:测试条件:CF= 0(3 3)比较两个带符号数,并根据比较的结果的大小转移。)比较两个带符号数,并根据比较的结果的大小转移。1 1)JLJL(或(或LNGELNGE)小于,或者不大于且等于,则转移。小于,或者不大于且等于,则转移。格式:格式:JLJL(或(或JNGEJNGE) 标号标号测试条件:测试条件:SFSF异或异或OF = 1OF = 12 2)JNLJNL(或(或JGEJGE)不小于,即或者大于或者等于则转移。不小于,即或者大于或者等于则转移。格式:格式:JNLJNL(或(或JGEJGE) 标号标号测试条件:测试条件:SFSF异或异或OF
54、= 0OF = 03 3)JLEJLE(或(或JNGJNG)小于或等于,即不大于则转移。小于或等于,即不大于则转移。格式:格式:JLEJLE(或(或JNGJNG) 标号标号测试条件:(测试条件:(SFSF异或异或OFOF)或)或ZF = 1ZF = 1第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步4)JNLE(或(或JG)不小于或等于,即大于则转移。不小于或等于,即大于则转移。格式:格式:JNLE(或(或JG) 标号标号测试条件:(测试条件:(SF异或异或OF)或)或ZF = 0(4 4)测试)测试CXCX的值为的值为0 0则转移指令则转移指令格式:格式:JCXZ JCXZ 标号标号
55、测试条件:(测试条件:(CXCX)= 0= 0第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步3.3.2 汇编语言分支结构程序的编写汇编语言分支结构程序的编写在设计分支程序时必须注意以下几点:在设计分支程序时必须注意以下几点: ( (1) )正确选择分支形成的判定条件和相应的条正确选择分支形成的判定条件和相应的条件转移指令。件转移指令。 (2)对每个分支程序的)对每个分支程序的 入口,一定要给出标入口,一定要给出标号,标明不同分支的转向地址。必须保证每条分支号,标明不同分支的转向地址。必须保证每条分支都有完整的结果。都有完整的结果。 (3)在检查和调试时必须对所有的分支进行,)在检查和
56、调试时必须对所有的分支进行,因为某几条分支正确,不足以说明整因为某几条分支正确,不足以说明整个程序是正确的。个程序是正确的。第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步 分支结构程序的分类:分支结构程序的分类: 简单的二分支结构简单的二分支结构程序程序 多分支结构程序多分支结构程序第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步1. 简单的二分支结构设计举例简单的二分支结构设计举例【例【例3-7】 把把a,b两个两个8位数中较大位数中较大的数赋值给的数赋值给max。分析问题:这是典型的二分支结分析问题:这是典型的二分支结构。确定分支构。确定分支的条件是的条件是ab吗?吗?确
57、定算法:采用比较转移指令,确定算法:采用比较转移指令,在汇编语言中在汇编语言中用用AL来保存中间结果。因为读取来保存中间结果。因为读取寄存器比读取存储器要快,并且,寄存器比读取存储器要快,并且,汇编语言指令不允许两个操作数都汇编语言指令不允许两个操作数都为存储单元。为存储单元。画程序流程图:画程序流程图,画程序流程图:画程序流程图,见图见图3-5。图图3-5 例例3-7程序流程图程序流程图第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步确定汇编语言程序的基本框架:可见,该汇编语言程序的基确定汇编语言程序的基本框架:可见,该汇编语言程序的基本框架至少要两个段:数据段和代码段。数据段中至少
58、定义本框架至少要两个段:数据段和代码段。数据段中至少定义3个变量:两个数个变量:两个数a、b,还有一个最大数,还有一个最大数max,都是,都是8位数,应位数,应选选DB 类型,但考虑到执行类型,但考虑到执行CMP指令实际上是作减法,可能指令实际上是作减法,可能有借位的情况,故选有借位的情况,故选DW类型。类型。max尚属未知,故应定义一个尚属未知,故应定义一个字长的缓冲区。还要用到寄存器字长的缓冲区。还要用到寄存器AL。编写程序,可以想得到,需要编写程序,可以想得到,需要MOV、CMP等指令。最后要等指令。最后要返回返回DOS。具体程序如下:。具体程序如下:DATA SEGMENT ;/定义数
59、据段定义数据段 a DW ? ;/定义字变量定义字变量a b DW ? ;/定义字变量定义字变量b max DW ? ;/定义字变量定义字变量maxDATA EDNS ;/数据段定义结束数据段定义结束CODE SEGMENTASSUME CS:CODE,DS:DATA 第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步START: MOV AX,DATA MOV DS,AX MOV AL,a CMP AL,b ;/比较比较a和和b,产生分支,产生分支 JA EXIT ;/如果如果a b,则跳转到,则跳转到EXIT语句,否则,执行下列语句语句,否则,执行下列语句 MOV AL,b ;/送送
60、b到寄存器到寄存器EXIT: MOV max,AL ;/送(送(AL)到存储单元)到存储单元max MOV AH,4CH ; INT 21H ;/返回返回DOSCODE ENDS ;/代码段结束代码段结束 END START ;/程序结束程序结束第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步 2.多分支结构程序设计多分支结构程序设计多分支结构程序设计比较复杂多分支结构程序设计比较复杂一些。关键是怎样根据条件对一些。关键是怎样根据条件对多分支进行判断,确定不同分多分支进行判断,确定不同分支程序转移的入口地址。方法支程序转移的入口地址。方法有:有:(1)逻辑分解流程图法)逻辑分解流程图法
61、 根据逻辑分解流程图,按根据逻辑分解流程图,按照判别条件的先后,逐个进行照判别条件的先后,逐个进行判断和转移。设分支条件为判断和转移。设分支条件为X1,X2,XN,则逻辑分,则逻辑分解流程图为解流程图为3-6所示。所示。图图3-6 逻辑分解流程图逻辑分解流程图第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步【例【例3-8 】试编写执行符号函数】试编写执行符号函数 的程序。的程序。分析问题:由题意可知,这是多分支结构。本题有三个分支:分析问题:由题意可知,这是多分支结构。本题有三个分支:X0X0、X= 0X= 0和和X0X0。按照逻辑分解的方法,可以先将其归并为两。按照逻辑分解的方法,可
62、以先将其归并为两个条件:个条件:X0X0和和X0X0X0和和X= 0 X= 0 ,各分支均用条件转移指令来实现。,各分支均用条件转移指令来实现。确定算法:采用比较转移指令。确定算法:采用比较转移指令。画程序流程图:画程序流程图,见图画程序流程图:画程序流程图,见图3-73-7。确定汇编语言程序的基本框架:可见,该汇编语言程序的基确定汇编语言程序的基本框架:可见,该汇编语言程序的基本框架至少要两个段:数据段和代码段。数据段中至少定义本框架至少要两个段:数据段和代码段。数据段中至少定义2 2个变量:两个数个变量:两个数X X和和Y Y,由题设为,由题设为8 8位数,应选位数,应选DBDB类型,但考
63、虑类型,但考虑到执行到执行CMPCMP指令实际上是作减法,可能有借位的情况,故选指令实际上是作减法,可能有借位的情况,故选DWDW类型。假设任意给定的类型。假设任意给定的X X值存放在值存放在XXXX单元,函数单元,函数Y Y的值存放在的值存放在YYYY单元。单元。编写程序,可以想得到,需要编写程序,可以想得到,需要MOVMOV、CMPCMP和程序转移等指令。和程序转移等指令。第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步最后要返回最后要返回DOS。具体程序如下:具体程序如下:DATA SEGMENT;/定义数据段定义数据段 XX DW ;/定义字变量定义字变量X YY DW ? ;
64、/定义字变量定义字变量Y DATA EDNS ;/数据段定义结数据段定义结束束CODE SEGMENTASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX ;/给给DS赋值赋值MOV AL,XX ; CMP AL,0 ;/XX与零比较与零比较 开始(AL)XX(AL) 0(AL) 0(AL) 1结束YN图3-7 例3-8程序流程图(AL)1(AL)0YN第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步JGE BIGR ;/X(AL)0,则转移到,则转移到BIGR语句语句 MOV AL,0FFH ;/否则,否则,X0时,将时,将1送入送入A
65、L EQUL:MOV YY,AL ;/无论结果如何,都将(无论结果如何,都将(AL)送入)送入YY单元单元 HLT;/暂停暂停(2)跳转地址表法)跳转地址表法 如果各分支的判定结果可以用一个寄存器的不同如果各分支的判定结果可以用一个寄存器的不同的有序的值来表示,则可将各分支程序的入口地址与的有序的值来表示,则可将各分支程序的入口地址与寄存器的不同的有序的值一一对应,列入一张表中,寄存器的不同的有序的值一一对应,列入一张表中,此表称为跳转地址表此表称为跳转地址表。第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步如图如图3-8所示。各分支程序的入口地址的计算公式是:所示。各分支程序的入口地
66、址的计算公式是: 各分支程序的入口各分支程序的入口地址寄存器的值地址寄存器的值2跳转地址表首地址跳转地址表首地址 这种利用跳转地址这种利用跳转地址表实现多分支程序的转表实现多分支程序的转移的方法,称为跳转地移的方法,称为跳转地址表法址表法。图图3-8 分支程序入口地址表分支程序入口地址表第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步【例例3-9】根据根据AL中的被置位的情况来控制转移到中的被置位的情况来控制转移到8个分支程个分支程序序R1R8中的一个中的一个(在中断响应时,通过软件查询,从而转到在中断响应时,通过软件查询,从而转到相应的中断服务程序入口就类似于这种情况相应的中断服务程
67、序入口就类似于这种情况)。如果如果ALAL中为中为00000001 00000001 则转至则转至R1R1如果如果ALAL中为中为00000010 00000010 则转至则转至R2R2如果如果ALAL中为中为00000100 00000100 则转至则转至R3R3如果如果ALAL中为中为00001000 00001000 则转至则转至R4R4如果如果ALAL中为中为00010000 00010000 则转至则转至R5R5如果如果ALAL中为中为00100000 00100000 则转至则转至R6R6如果如果ALAL中为中为01000000 01000000 则转至则转至R7R7如果如果ALA
68、L中为中为10000000 10000000 则转至则转至R8R8实现上述要求的程序框图如图实现上述要求的程序框图如图3-93-9所示。我们可以把所示。我们可以把8 8个子程序的入口地址编成如图个子程序的入口地址编成如图3-83-8所示的分支程序入口地址所示的分支程序入口地址表。根据流程图可以写出如下程序:表。根据流程图可以写出如下程序:第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步分析问题:由题意可知,要求根据某种条件实现分析问题:由题意可知,要求根据某种条件实现8个分支程序个分支程序确定算法:采用跳转地址表法(见图确定算法:采用跳转地址表法(见图3-8 分支程序入口地址表)分支程
69、序入口地址表),结合条件转移指令来实现。,结合条件转移指令来实现。画程序流程图:见图画程序流程图:见图3-9。确定汇编语言程序的基本框架:可见,该汇编语言程序的基确定汇编语言程序的基本框架:可见,该汇编语言程序的基本框架要三个段:数据段、堆栈段和代码段。数据段中创建分本框架要三个段:数据段、堆栈段和代码段。数据段中创建分支程序入口地址表,应选支程序入口地址表,应选DW 类型,使用寄存器类型,使用寄存器BX定位。定位。编写程序,可以想得到,需要编写程序,可以想得到,需要MOV、JMP、JC 、INC、LEA和和PUSH等指令。最后要返回等指令。最后要返回DOS。未想到的,在编写过。未想到的,在编
70、写过程中根据需要随时添加,如程中根据需要随时添加,如RCR指令等。指令等。 具体程序如下:具体程序如下: NAME BRANCH_PROGDATA SEGMENT第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步BRTAB DW R11 ;/开始创建分支程序入口地址表。第一步创建分开始创建分支程序入口地址表。第一步创建分支程序支程序R1入口地址的入口地址的IP值值 DW R12 ;/创建分支程序创建分支程序R1入口地址的码段值入口地址的码段值 DW R21 ;/仿仿DW R11,下同,下同 DW R22 ;/仿仿DW R12,下同,下同 DW R31 DW R32 DW R41 DW R
71、42 DW R51 DW R52 DW R61 DW R62 DW R71 DW R72 DW R81 DW R82图图3-9 分支程序转移流程图分支程序转移流程图第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步DATA ENDSSTACK SEGMENT PARA STACK STACK DB 100 DUP(?);/定义一个定义一个100个字节的堆栈空间个字节的堆栈空间TOP EQU $-STACK ;/栈顶的地址为程序的当前地址与堆栈首地址的差。栈顶的地址为程序的当前地址与堆栈首地址的差。STACK ENDSCODE SEGHENTSTART PROC FAR ASSUME CS
72、:CODE,DS:DATA,SS:STACKBEGIN:PUSH DS ;/将数据段首址压栈将数据段首址压栈 MOV AX,0 ;/将寄存器将寄存器AX清零清零 PUSH AX ;/使程序能返回使程序能返回DOS MOV AX,DATA MOV DS,AX ;/将将DATA段首址(即分支程序入口地址表)送段首址(即分支程序入口地址表)送寄存器寄存器DS第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步 MOV AX,STACK; MOV SS,AX ;/将堆栈段首址送寄存器将堆栈段首址送寄存器SS MOV AX,TOP MOV SP, AX ;/将堆栈段栈顶地址送堆栈指针寄存器将堆栈段栈
73、顶地址送堆栈指针寄存器SP LEA BX,BRTAB ;/设跳转表的地址指针设跳转表的地址指针GTBIT: RCR AL,l ;/通过进位循环右移通过进位循环右移 JC GETAD ;/在循环右移过程中顺序检查在循环右移过程中顺序检查AL中各位的状态中各位的状态 INC BX ;/BX自动加自动加1 INC BX ;/BX自动加自动加1,移到下一分支,移到下一分支 INC BX ;/BX自动加自动加1 INC BX ;/BX自动加自动加1,完成寄存器的值,完成寄存器的值2 JMP GTBITGETAD:JMP DWORD PTRBX ;/段间间接转移段间间接转移START ENDPCODE E
74、NDS END BEGIN第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步(3)跳转指令表法)跳转指令表法 跳转指令表法的思路与跳转地址表法基本相同,跳转指令表法的思路与跳转地址表法基本相同,不同的只是它是在代码段中把转移到各个分支程序不同的只是它是在代码段中把转移到各个分支程序段的跳转指令放在一个表中,该表就称为段的跳转指令放在一个表中,该表就称为“跳转指跳转指令表令表”。表内跳转转移指令的地址表内跳转转移指令的地址的计算公式:的计算公式: 表内跳转指令表的地址表内跳转指令表的地址 (编号(编号-1)2 + 跳转跳转指令表的首地址指令表的首地址 编号编号2 - 2 + 跳转指跳转指令
75、表的首地址令表的首地址第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步当当 N=1时,显示信息时,显示信息(DSPLAY);N=2时。传送信息时。传送信息(TRAN);N=3时。处理信息时。处理信息(PROCl);N=4时,打印信息时,打印信息(PRTN);N=5时。结束程序时。结束程序(EXIT) 相应的处理为一独立的程序段,它们的入口地址分别为相应的处理为一独立的程序段,它们的入口地址分别为DSPLAY,TRAN,PROC l,PRIN,EXIT。当这些程序处理。当这些程序处理结束时仍返回读入结束时仍返回读入N。只有当。只有当N5时程序才结束。时程序才结束。 试利用跳转指令表的分支
76、程序实现这些要求。试利用跳转指令表的分支程序实现这些要求。【例例3-10】由键盘输入一个数由键盘输入一个数N,当,当N为不同值时应作不同处理为不同值时应作不同处理第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步分析问题:由题意可知,这是一个五分支程序。它们的入口分析问题:由题意可知,这是一个五分支程序。它们的入口地址分别为地址分别为DISPLAYDISPLAY,TRANTRAN,PROClPROCl,PRINPRIN,EXITEXIT。当这些程序。当这些程序处理结束时仍返回读入处理结束时仍返回读入N N。只有当。只有当N N5 5时程序才结束时程序才结束确定算法:构建跳转指令表,采用通
77、过执行跳转指令表中相确定算法:构建跳转指令表,采用通过执行跳转指令表中相应的跳转指令,就可以转移到不同的分支。应的跳转指令,就可以转移到不同的分支。画程序流程图:略。画程序流程图:略。确定汇编语言程序的基本框架:可见,该汇编语言程序的基确定汇编语言程序的基本框架:可见,该汇编语言程序的基本框架至少要两个段本框架至少要两个段:堆栈段和代码段。堆栈段中定义一个堆栈段和代码段。堆栈段中定义一个256256个字的缓冲区,当然是个字的缓冲区,当然是DW DW 类型,再定义一个字类型的栈顶,用类型,再定义一个字类型的栈顶,用栈顶指针栈顶指针SPSP定位。采用寄存器定位。采用寄存器ALAL,AXAX存数字,
78、寄存器存数字,寄存器BXBX存跳转存跳转指令的地址。指令的地址。编写程序,可以想得到,需要编写程序,可以想得到,需要MOVMOV、JMP JMP 、LEA LEA 、SUB SUB 、ADDADD、CMPCMP和和JBJB、JAJA、CBWCBW等指令。最后要返回等指令。最后要返回DOSDOS。未想到的,在编写。未想到的,在编写过程中根据需要随时添加,如过程中根据需要随时添加,如SHLSHL指令等。为了简化程序,每段指令等。为了简化程序,每段处理程序除了处理程序除了EXITEXIT以外仅给出了一条转移指令表示当某项处理以外仅给出了一条转移指令表示当某项处理完成后返回完成后返回AGAINAGAI
79、N继续从键盘读入一个字符直到输入字符为继续从键盘读入一个字符直到输入字符为55第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步为止。例中存放转移指令的表为止。例中存放转移指令的表JADT2在代码段中。在代码段中。具体程序如下:具体程序如下:STACK SBGMENT STACKDW 256 DUP(?) ;/在堆栈中,定义一个在堆栈中,定义一个256个字的数据缓冲个字的数据缓冲区区TOP LABEL WORD ;/定义栈顶变量定义栈顶变量TOP,字类型,字类型STACK ENDSCODE SEGMENTASSUME CS:CODE,SS:STACKSTART: MOV AX,STACK
80、 ; MOV SS,AX ;/堆栈段寄存器堆栈段寄存器SS初始化初始化 MOV SP,OFFSSET TOP ;/送栈顶的偏移地址到寄存器送栈顶的偏移地址到寄存器SPAGAIN: MOV AH,01 ;/(AH)01 ,1号功能(键盘输入)调用号功能(键盘输入)调用第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步 INT 2lH ;/DOS功能调用功能调用 SUB AL,30H ;/将键盘输入的数字字符的将键盘输入的数字字符的ASCII码减去码减去 数字字符数字字符“0”的的ASCII码码“30H”,求出输入,求出输入 数字的二进制表示的值,放在数字的二进制表示的值,放在AL中中 CM
81、P AL,01 ;/与与“1”比较输入数字的值比较输入数字的值 JB,AGAIN ;/ 若输入数字的值比若输入数字的值比1小,返回程序小,返回程序AGAIN, 由键盘重新输入。若输入数字的值比由键盘重新输入。若输入数字的值比1大,接大,接 着执行下一指令着执行下一指令 CMP AL,05 ;/与与“5”比较输入数字的值比较输入数字的值 JA AGAIN ;/若输入数字的值比若输入数字的值比5大,返回程序大,返回程序AGAIN, 由键盘重新输入。若输入数字的值比由键盘重新输入。若输入数字的值比1大,比大,比 5小,接着执行下一指令小,接着执行下一指令 SHL AL,01 ;/将放在将放在AL中的
82、输入数字的二进制表示,逻中的输入数字的二进制表示,逻 辑左移辑左移1位。依据计算跳转转移指令地址的位。依据计算跳转转移指令地址的 公式:先作编号公式:先作编号2第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步CBW ;/将将AL中的中的8位数扩展为位数扩展为16位数,放在寄存器位数,放在寄存器AX中中MOV BX,OFFSSET JADT2 ;/送转移指令跳转表的首地址送转移指令跳转表的首地址 送寄存器送寄存器BXADD BX,AX ;/依据计算跳转转移指令地址的公式再作:编依据计算跳转转移指令地址的公式再作:编 号号2 + 跳转指令表的首地址跳转指令表的首地址SUB BX,02 ;/
83、继续计算,将上一步的结果减去继续计算,将上一步的结果减去2,完成计算,完成计算 JMP BX ;/跳转到跳转到BX指示的跳转指令的地址指示的跳转指令的地址JADT2 JMP SHORT DISPLAY :/跳转表跳转表 JMP SHORT TRAN JMP SHORT PROCl JMP SHORT PRTN JMP SHORT EXITDISPLAY: 第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步JMP AGATNTRAN: JMP AGAINPROCl: JMP AGAINPRIN: JMP AGAINEXlT: MOV AH,4CHINT 2lHCODE ENDSEND ST
84、ART第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步3.4 循环结构的汇编语言源程序的编写循环结构的汇编语言源程序的编写3.4.1 循环控制指令循环控制指令3.4.2 程序的循环结构程序的循环结构3.4.3 控制程序循环的方法控制程序循环的方法3.4.4 多重循环多重循环返回本章首页返回本章首页第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步(1) 循环指令循环指令的的作用作用: 根根据据条条件件满满足足与与否否,完完成成一一串串重重复复的的操操作作,形形成循环程序。成循环程序。(2) 循循环环指指令令有有3条条,且且3条条指指令令都都是是短短转转移移(short-label
85、表示短标号)指令。表示短标号)指令。 循环转移指令循环转移指令LOOP 格式:格式:LOOP 目标标号目标标号测测 试试 条条 件件 与与 功功 能能 : ( CX) 不不 等等 于于 0, 则则(CX)(CX)1;(;(IP)(IP)8位偏移量。位偏移量。3.4.1 循环控制指令循环控制指令第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步说明:说明:LOOP指令相当于下面两条指令的组合:指令相当于下面两条指令的组合:DEC CXJNZ short-label; short-label表示短标号表示短标号 相等(为零)循环转移指令相等(为零)循环转移指令LOOPZ/LOOPE格式:格式
86、: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章章 汇编语言程序设计初步汇编语言程序设计初步【例例3-11】将数据区的数据按正、负分开,分别送到两个缓冲将数据区的数据按正、负分开,分别送到两个缓
87、冲区,程序如下:区,程序如下:START:MOV SI,OFFSET BLOCK;/将数据区的偏移地址送将数据区的偏移地址送 SI,即将,即将 SI指向数据区指向数据区 MOV DI,OFFSET PLUS-DATA;/DI指向正数缓冲区指向正数缓冲区 MOV BX,OFFSET MINUS-DATA;/BX指向负数缓冲区指向负数缓冲区 MOV CX,COUNT;/将数据字节送将数据字节送CX CLD;/将将DF清清0GOON:LODSB;/取串指令取串指令 TEST AL,80H;/字节最高位为字节最高位为1(表示是负数)吗?(表示是负数)吗? JNZ MINUS;/是,则转移到是,则转移到
88、MINUS语句语句 STOSB;/否则,执行存入串指令否则,执行存入串指令STOSB JMP AGAIN;/跳转到跳转到AGAIN语句语句MINUS:XCHG BX,DI; STOSB; XCHG BX,DIAGAIN:LOOP GOON HLT第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步3.4.2 程序的循环结构程序的循环结构一个完整的循环结构程序由以下几部分组成:一个完整的循环结构程序由以下几部分组成: 1循循环环初初态态设设置置部部分分:这这是是为为了了保保证证循循环环程程序序能能正正常常运运行行而而必必须须作作的的准准备备工工作作,在在循循环环开开始始时时往往往往要要给给循
89、循环环过过程程置置以以初初态态,即即赋赋一一个个初初值值。循循环环初初态态又又可可以以分分成成两两部部分分,一一是是循循环环工工作作部部分分初初态态,另另一一是是循循环环结结束束条条件件的的初初态态。例例如如,要要设设地地址址指指针针,要要使使某某些些寄寄存存器器清清零零,或或设设某某些些标标志志等等等等。循循环环结结束束条条件件的的初初态态往往往往置置以以循循环环次次数数置置初初态态也也是是循循环环程程序序的重要的一部分,不注意往往容易出错。的重要的一部分,不注意往往容易出错。 2循循环环体体:就就是是要要求求重重复复执执行行的的程程序序段段部部分分。其其中中又又分分为为:循循环环工工作作部
90、部分分和和循循环环调调整整部部分分。循循环环调调整整部部分分修修改改循循环环参数,以保证每次循环所完成的功能不是完全重复的。参数,以保证每次循环所完成的功能不是完全重复的。 3循循环环结结束束条条件件部部分分:也也称称循循环环出出口口判判定定部部分分。在在循循环环程程序序中中必必须须给给出出循循环环结结束束条条件件,否否则则程程序序就就会会进进入入死死循循环环。每每循循环环一一次次检检查查循循环环结结束束的的条条件件,当当满满足足条条件件时时就就停停止止循循环环,往下执行其他程序。往下执行其他程序。第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步3.4.3 控制程序循环的方法控制程序循
91、环的方法 控制程序循环的方法就是选择循环控制条件,是循控制程序循环的方法就是选择循环控制条件,是循环程序设计的关键。环程序设计的关键。 常用的循环控制方法有常用的循环控制方法有计数控制法、条件控制法和计数控制法、条件控制法和逻辑尺控制法逻辑尺控制法等等。1计数控制法计数控制法 常见的循环是计数循环,当循环了一定次数后就结常见的循环是计数循环,当循环了一定次数后就结束循环。在微型机中,常用一个内部寄存器束循环。在微型机中,常用一个内部寄存器(一般用一般用CX),或寄存器对作为计数器,对它的初值置循环次数,每,或寄存器对作为计数器,对它的初值置循环次数,每循环一次减循环一次减1,当计数器的值减为,
92、当计数器的值减为0时,就停止循环。也时,就停止循环。也可以初值置为可以初值置为0,每循环一次加,每循环一次加l,再与循环次数相比较,再与循环次数相比较,若两者相等就停止循环。若两者相等就停止循环。第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步【例【例3-11】编写一个程序,计算】编写一个程序,计算SUM =A1B1+A2B2 +AnBn 。设。设A1,A2,,An和和B1,B2,Bn为无符号数,假定为无符号数,假定SUM不会超过不会超过65535。分析问题:由题意可知,这是求分析问题:由题意可知,这是求n个数的累加和,而每个数都个数的累加和,而每个数都是两个数组对应项的乘积,存在是两
93、个数组对应项的乘积,存在n次重复操作。次重复操作。 确定算法:采用采用比较循环指令,循环次数是确定算法:采用采用比较循环指令,循环次数是n次。故用循次。故用循环次数作为循环的控制条件,再配合使用环次数作为循环的控制条件,再配合使用LOOP指令。循环控指令。循环控制采用计数控制。制采用计数控制。画程序流程图:略。画程序流程图:略。确定汇编语言程序的基本框架:可见,该汇编语言程序的基确定汇编语言程序的基本框架:可见,该汇编语言程序的基本框架至少要两个段:数据段和代码段。数据段中至少定义本框架至少要两个段:数据段和代码段。数据段中至少定义4个变量:两个数组变量个变量:两个数组变量A和和B,由题设知为
94、,由题设知为8位数,应选位数,应选DB 类类型,使用寄存器型,使用寄存器SI定位。和数定位。和数SUM变量,由题设知为变量,由题设知为16位数,位数,选选DW类型,其中间结果放在寄存器类型,其中间结果放在寄存器BX。还有一个数。还有一个数N,为循,为循环次数,计数器用环次数,计数器用CX。第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步编编写写程程序序,可可以以想想得得到到,需需要要MOV、ADD 、MUL 、INC和和LOOP等等指指令令。最最后后要要返返回回DOS。未未想想到到的的,在在编编写写过过程程中随时添加,如中随时添加,如XOR指令等。指令等。具体程序如下:具体程序如下:D
95、ATA SEGMENT A DB A1,A2,An ;/定义变量定义变量A B DB B1,B2,Bn ;/定义变量定义变量B SUM DW ? ;/定义变量定义变量SUM,其值待求,其值待求 N EQU B-A ;/定义变量定义变量N,为循环次数,为循环次数DATA ENDS CODE SEGMENTASSUME CS:CODEDS:DATASTART:MOV AX,DATAMOV DS,AX 第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步XOR BX,BX ;/准备存放和的寄存器准备存放和的寄存器BX清零,设置工作初值清零,设置工作初值XOR SI,SI ;/变量变量A和和B的地
96、址定位寄存器的地址定位寄存器SI清零,设置工作初值清零,设置工作初值MOV CX,N :/为循环次数寄存器为循环次数寄存器CX设置循环控制初值设置循环控制初值NLOP l : MOV AL,ASI ;/循环体命名为循环体命名为LOP l,循环体开始,循环体开始MUL BSI ;/AB,8位位8位,乘积暂放在位,乘积暂放在AXADD BX,AX ;/乘积相加的和,其中间结果放在乘积相加的和,其中间结果放在BXINC SI ;/SISI1修改工作初值修改工作初值LOOP LOP l ;/循环控制,循环控制,CXCX -1MOV SUM,BX;/乘积相加的总和送内存的乘积相加的总和送内存的SUM字单
97、元字单元MOV AH,4CH INT 21HCODE ENDSEND START第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步分分析析问问题题:由由题题意意可可知知,这这是是一一个个比比较较循循环环操操作作。可可以以任任选选一一个个数数作作为为比比较较的的标标准准。比比如如,先先把把第第一一个个数数分分别别送送入入AX和和BX,既既看看作作是是最最大大数数比比较较的的标标准准,又又可可看看作作是是最最小小数数比比较较的的标标准准。然然后后将将数数组组后后面面的的每每一一个个数数与与之之比比较较:如如果果它它比比AX中中的的当当前前值值还还大大,那那么么就就将将该该数数存存入入AX;
98、如如果果它它比比BX中中的的当当前前值值还还小小,那那么么将将该该数数存存入入BX。经经N-1次次循循环环比比较之后,较之后,AX和和BX里分别就是所要求的最大数和最小数。里分别就是所要求的最大数和最小数。 确确定定算算法法:采采用用采采用用比比较较循循环环指指令令,循循环环次次数数是是N-1次次。故故用用循循环环次次数数作作为为循循环环的的控控制制条条件件,再再配配合合使使用用LOOP指指令令。循环控制采用计数控制。循环控制采用计数控制。画程序流程图:见图画程序流程图:见图3-10。确确定定汇汇编编语语言言程程序序的的基基本本框框架架:共共三三个个循循环环体体。该该汇汇编编语语言言程程序序的
99、的基基本本框框架架至至少少要要两两个个段段:数数据据段段和和代代码码段段。数数据据段段中至少定中至少定【例例3-12】以以BUF为首地址的数据段里存放着为首地址的数据段里存放着10个互不相等的个互不相等的16位有符号数,求出其中的最大数和最小数,然后分别存放到位有符号数,求出其中的最大数和最小数,然后分别存放到MAX和和MIN字单元中。字单元中。第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步义义3个变量:一个数组变量个变量:一个数组变量BUF,由题设知为,由题设知为16位数,应选位数,应选DW 类型,使用寄存器类型,使用寄存器SI定位。还有最大数定位。还有最大数MAX和最小数和最小数
100、MIN两个变量,由题设知为两个变量,由题设知为16位数,选位数,选DW类型,其中间结类型,其中间结果分别放在寄存器果分别放在寄存器AX和和BX。还有一个数。还有一个数N,为循环次数,为循环次数,计数器用计数器用CX。编写程序。本程序想向读者说明,用编写程序。本程序想向读者说明,用LOOP指令,结合采指令,结合采用无条件转移指令和条件转移指令,也可以实现程序的循环。用无条件转移指令和条件转移指令,也可以实现程序的循环。可以想得到,需要可以想得到,需要MOV、LEA 、CMP 、JMP 、JG 、JL等等指令。最后要返回指令。最后要返回DOS。具体程序如下:具体程序如下:DATA SEGMENTB
101、UF DW 36,-56,87,100,9000H DW 12H,8000H,7543,0, -567MAX DW ?MIN DW ?N EQU MAX-BUFDATA ENDS第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步CODE SEGMENT ASSUME CS:CODEDS:DATASTART: MOV AX,DATA MOV DS,AX LEA SI,BUF ;/送送BUF的偏移地址到寄存器的偏移地址到寄存器SI MOV CX,N-l ;/送循环次数到寄存器送循环次数到寄存器CX MOV AX,SI ;/取第一个数到取第一个数到AX MOV BX,AX ;/取第一个数到取第
102、一个数到BXLOPl: ADD SI,2 ;/循环体循环体1。SISI2,为取下一个数作准备,为取下一个数作准备CMP AX,SI ;/AX与下一个数比较与下一个数比较JG LOP2 :/AX大则转移到循环体大则转移到循环体LOP2MOV AX,SI ;/比比AX还大的数,送还大的数,送AX JMP LOP3第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步LOP2:CMP BX,SI ;/循循环环体体2。BX与下一个数比较与下一个数比较 JL LOP3 ;/BX小小则则转转移到移到LOP3 MOV BX,SI;/比比BX还小的数,送还小的数,送BX LOP3: LOOP LOPl ;/
103、循循环环体体3。比较次数减比较次数减l,CXCX-1 MOV MAX,AX ;/存入最大数存入最大数 MOV MIN,BX ;/存入最小数存入最小数 MOV AH4CH INT 21HCODE ENDS END START图图3-10 例例3-12 程序的流程图程序的流程图第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步2.条件控制法条件控制法即根据某个条件的成立与否来控制循环的执行。即根据某个条件的成立与否来控制循环的执行。【例【例3-13】将正数】将正数n插入到一个所有的数均为正数、而且已经插入到一个所有的数均为正数、而且已经按递增次序排好的数组里面去,结果要保证仍然有序。该数组按
104、递增次序排好的数组里面去,结果要保证仍然有序。该数组的首地址为的首地址为ARHD。分析问题:由题意可知,这是一个循环次数不能事先确定的分析问题:由题意可知,这是一个循环次数不能事先确定的问题,可以用找到插入数的位置作为结束循环的条件。问题,可以用找到插入数的位置作为结束循环的条件。 确定算法:由于数组已按增序排列好,因此既可以从首地址确定算法:由于数组已按增序排列好,因此既可以从首地址开始往后比较;也可以从末地址开始往后比较,不过编程者必开始往后比较;也可以从末地址开始往后比较,不过编程者必须先定义末地址相应的变量须先定义末地址相应的变量AEND。画程序流程图:略。画程序流程图:略。确定汇编语
105、言程序的基本框架:可见,该汇编语言程序的基确定汇编语言程序的基本框架:可见,该汇编语言程序的基本框架至少要两个段:数据段和代码段。程序中要考虑到边界本框架至少要两个段:数据段和代码段。程序中要考虑到边界问题,即所插入的数可能比数组中所有的数都大或都小,即插问题,即所插入的数可能比数组中所有的数都大或都小,即插入的位置可能在一头一尾。所以在定义数据段时,至少定义入的位置可能在一头一尾。所以在定义数据段时,至少定义3第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步个变量:数组变量量:数组变量AEND,数组变量,数组变量AEND前要留一空单元前要留一空单元X,以供插入数时使用。数组之后又要留
106、一空单元,里面放待插,以供插入数时使用。数组之后又要留一空单元,里面放待插入的数入的数N。这样的安排,就保证最多比较到单元。这样的安排,就保证最多比较到单元N时,循环就时,循环就可以结束。可以结束。3个变量均选个变量均选DW 类型,使用寄存器类型,使用寄存器SI定位。其中定位。其中间结果放在寄存器间结果放在寄存器BX。编写程序,可以想得到,需要编写程序,可以想得到,需要MOV、LEA 、CMP 、JLE、JMP和和INC等指令,最后返回等指令,最后返回DOS。未想到的,在编写过程中。未想到的,在编写过程中随时添加,如随时添加,如ADD指令等。指令等。下面给出两种解法,设待插入的数是下面给出两种
107、解法,设待插入的数是N32。具体程序如下:。具体程序如下:方法方法1:在每次比较过程中,如果从首地址开始往后比:在每次比较过程中,如果从首地址开始往后比较,若数组中的数比较,若数组中的数比N小,则把其位置让给小,则把其位置让给N,该数向前移,该数向前移,直到不小于直到不小于N时,便是插入的位置。因为是逐次比较的结果,时,便是插入的位置。因为是逐次比较的结果,所以不必担心位置的冲突。如果插入的数比递增数组中的第一所以不必担心位置的冲突。如果插入的数比递增数组中的第一个数小,则插入个数小,则插入X单元;如果插入的数比递增数组中的数都大,单元;如果插入的数比递增数组中的数都大,则插入数组的末单元。则
108、插入数组的末单元。第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步DATA SEGMENT ;/定义数据段定义数据段X DW ? ;/定义数组变量定义数组变量AEND前留的空单元前留的空单元XARHD DW 3,5,10,15,23,37,52,78,99,105;/定义数组定义数组N DW 32 ;/定义待插入的数定义待插入的数N所在单元所在单元DATA ENDS ;/数据段定义结束数据段定义结束CODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AX ;/数据段初始化数据段初始化MOV AX,N ;/AX插入的正数插入
109、的正数32LEA SI,ARHD ;/SI数组首地址数组首地址第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步LOPB: CMP AX,SI ;/比较开始,逐步寻找插入位置比较开始,逐步寻找插入位置 JLE LOPC ;/如果插入的正数如果插入的正数N小于或等于数组中的某数,小于或等于数组中的某数, 则转移到则转移到 LOPCMOV BX,SI ;/否则,将数组中的某数送寄存器否则,将数组中的某数送寄存器BX暂存暂存MOV SI-2,BX ;/比比N小的数往前移一个字的位置小的数往前移一个字的位置ADD SI,2 ;/SI SI2,为比较下一个数作准备,为比较下一个数作准备JMP LO
110、PB ;/循环到循环到LOPB LOPC: MOV SI-2,AX ;/找到找到N的位置,比较结束,插入的位置,比较结束,插入MOV AH,4CHINT 21H ;/返回返回DOSCODE ENDSEND START第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步 方方法法2:用用MOVSW指指令令将将插插入入位位置置前前的的数数一一起起移移动动。因因此此用用CX作作计计数数器器,记记录录需需要要移移位位的的个个数数。如如果果N比比所所有有数数都都小小,根根本本不不需需要要循循环环。此此时时CX0,不不执执行行MOVSW指指令令,直直接接将将数数插插入入到到X单单元元。如如果果N比比所
111、所有有数数都都大大,则则CX等等于于数数组组的的个个数数,数数组元素要全部移动,数据将插入到末单元。组元素要全部移动,数据将插入到末单元。 说明:说明:MOVSW指令表示将字符串按字的大小移动指令表示将字符串按字的大小移动DATA SEGMENT X DW ? ARHD DW 3,5,10,15,23,37,52,78,99,105 N DW 32DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV ES,AX ;/ES与与DS指向同一个段指向同一个段第第3 3章章 汇编语言程序设计初步汇编语言程序
112、设计初步XOR CX,CX ;/计数器计数器CX(用于统计数组中比(用于统计数组中比N小的数的个数)的清零小的数的个数)的清零MOV AX,N ;/AX插入的正数插入的正数32LEA SI,ARHD ;/SI数组首地址数组首地址LOPB: CMP AX,SI ;/比较开始,逐步寻找插入位置比较开始,逐步寻找插入位置 JLE LOPH ;/如果插入的正数如果插入的正数N小于或等于数组中的某数,小于或等于数组中的某数, 则转移到则转移到 LOPHADD SI,2 ;/否则,否则,SISI2INC CX ;/计数加计数加1JMP LOPB ;/循环到循环到LOPB LOPH: LEA SI,ARHD
113、 ;/SI源串首地址源串首地址LEA DI,X ;/DI目的串首地址目的串首地址CLD ;/方向标志清零,表示方向标志清零,表示SI,DI将自动增量将自动增量REP MOVSW ;/如果如果CX0,则重复,则重复CXCX-1,ES:DIDS:SI, 将插入位置前的数一起向前移动一位,让出位置给将插入位置前的数一起向前移动一位,让出位置给N第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步MOV DI,AX ;/插入插入MOV AH,4CHINT 2lHCODE ENDSEND START 在在具具体体的的程程序序设设计计中中,可可以以依依据据问问题题的的需需要要,单单独独使使用用某某一一
114、种种方方法法来来控控制制循循环环,比比如如计计数数控控制制法法和和条条件件控控制制法法;也也可可以以将将计计数数控控制制法法和和条条件件控控制制法法联联合合起起来来使使用用,而而且且控控制制条条件件可可以以是是1个个或或者者多多个个。总总之之,这这些些都都要要由由实实际际问问题题的的需要来决定。需要来决定。第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步 3. 逻辑尺控制法逻辑尺控制法 计数控制法和条件控制法是用来控制单一程序计数控制法和条件控制法是用来控制单一程序段重复执行的次数的。但有些问题则需要根据条件,段重复执行的次数的。但有些问题则需要根据条件,分别控制两种不同的操作分别控制
115、两种不同的操作(或程序段或程序段)重复执行的次重复执行的次数。为了区别两种不同的操作,我们用二进制位的数。为了区别两种不同的操作,我们用二进制位的1表示执行第一种操作,用表示执行第一种操作,用0表示执行第二种操作,表示执行第二种操作,并且在内存中设置一个字或字节单元,让它的各位并且在内存中设置一个字或字节单元,让它的各位分别记录各次操作的种类:是分别记录各次操作的种类:是1类操作,还是类操作,还是0类操类操作。这个子或字节单元,称为作。这个子或字节单元,称为“逻辑尺逻辑尺”。其中。其中l和和0的位数分别代表要重复执行的两种操作的次数。的位数分别代表要重复执行的两种操作的次数。 进入循环后,通过
116、对这个单元的顺序移位查找,进入循环后,通过对这个单元的顺序移位查找,识别标志位就可以确定应该执行哪种操作。利用逻识别标志位就可以确定应该执行哪种操作。利用逻辑尺来进行循环控制的方法,称为逻辑尺控制法。辑尺来进行循环控制的方法,称为逻辑尺控制法。第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步【例例3-16】 设有数组设有数组X和和Y。X数组中有数组中有X1,X2,X10;Y数数组中有组中有Yl,Y2,Y10。试编制程序计算:试编制程序计算:Z1 = X1 + Y1 Z2 = X2 + Y2 Z3 = X3一一Y3 Z4 = X4一一Y4Z5 = X5Y5 Z6 = X6 + Y6 Z7
117、 = X7一一Y7 Z8 = X8一一Y8Z9 = X9 + Y9 Z10 = X10 +Y10结果存入结果存入Z数组。数组。分析问题:对于这种问题,我们也可用循环程序结构来完成。由题意分析问题:对于这种问题,我们也可用循环程序结构来完成。由题意可知,这里有两种操作:加法和减法。为了区别每次应该做哪一种操作可知,这里有两种操作:加法和减法。为了区别每次应该做哪一种操作,可以设立标志位,如标志位为,可以设立标志位,如标志位为0 0做加法,为做加法,为l l做减法,这样进入循环后做减法,这样进入循环后只要判别标志位就可确定应该做的操作了。只要判别标志位就可确定应该做的操作了。确定算法:采用循环指令
118、,循环次数是确定算法:采用循环指令,循环次数是n n1010次。故用循环次数作为次。故用循环次数作为循环的控制条件,再配合使用循环的控制条件,再配合使用LOOPLOOP指令。循环控制采用计数控制。显然指令。循环控制采用计数控制。显然,这里要做,这里要做1010次操作就应该设立次操作就应该设立1010个标志位,我们把它放在一个存储单个标志位,我们把它放在一个存储单元元LOGICLOGICRULERULE中,这种存储单元一般称为逻辑尺,本例设定的逻辑尺中,这种存储单元一般称为逻辑尺,本例设定的逻辑尺为:为:第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步 000000001 1011 10
119、0 从低位开始所设的标志位反映了每次要做的操作顺序,最从低位开始所设的标志位反映了每次要做的操作顺序,最高的高的6位没有意义把它们设为位没有意义把它们设为0。画程序流程图:见图画程序流程图:见图3-11。确定汇编语言程序的基本框架:可见,该汇编语言程序的基本确定汇编语言程序的基本框架:可见,该汇编语言程序的基本框架至少要两个段:数据段和代码段。数据段中至少定义框架至少要两个段:数据段和代码段。数据段中至少定义4个变个变量:两个数组变量量:两个数组变量X和和Y,设为,设为16位数,应选位数,应选DW 类型,使用寄类型,使用寄存器存器BX定位。和(差)数定位。和(差)数Z变量,为变量,为10个字的
120、数据缓冲区,选个字的数据缓冲区,选DW类型,其中间结果放在寄存器类型,其中间结果放在寄存器AX。计数器用。计数器用CX,逻辑尺放,逻辑尺放在寄存器在寄存器DX。编写程序,可以想得到,需要编写程序,可以想得到,需要MOV、ADD 、SUB 、SHR 、JC 、JMP和和LOOP等指令。最后要返回等指令。最后要返回DOS。具体程序如下:具体程序如下:第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步DATA SEGMENT X DW l,2,9,8,7,3,6,5,4,1 Y DW 2,l,2,3,4,2,3,2,l,5 Z DW 10 DUP(?)LOGIC_RULE DW 00DCH ;
121、/定定义义逻逻辑辑尺尺DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX ;/数据段初始化数据段初始化 MOV CX,10 ;/设置循环次数设置循环次数 MOV BX,0 ;/寄存器寄存器BX清零清零 MOV DX,LOGIC-RULE ;/送送逻逻辑尺首地址到辑尺首地址到DX图图3-11 例例3-16程序流程图程序流程图第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步L: MOV AX,XBX ;/依次送变量依次送变量X的值到寄存器的值到寄存器AX SHR DX,l ;/逻辑尺右移逻辑尺右移
122、1位,最高位进入位,最高位进入 标志寄存器的标志寄存器的CF位位JC SUBB ;/当当CF=1,进行,进行“1”类操作(减法),转类操作(减法),转SUBBADD AX,YBX ;/当当CF = 0,进行,进行“0”类操作(加法)类操作(加法)JMP RESULTSUBB: SUB AX,YBX ;/作作XY运算运算RESULT:MOV ZBX,AX ;/结果存入结果存入Z;ADD BX,2 ;/BX BX2,进入下一次运算,进入下一次运算LOOP L ;/循环到循环到L语句语句MOV AH,4CHINT 21HCODE ENDSEND START第第3 3章章 汇编语言程序设计初步汇编语言
123、程序设计初步 如如果果在在一一个个循循环环体体内内又又出出现现一一个个循循环环结结构构的的程程序序段段,那那么么这这种种程程序序设设计计结结构构被被称称为为是是多多重重循循环环或或嵌套循环嵌套循环。 在多重循环结构的设计中,主要应该掌握以下在多重循环结构的设计中,主要应该掌握以下几点:几点: (1) 内循环应该完全包含在外循环的里面,成为内循环应该完全包含在外循环的里面,成为外循环体的一个组成部分。不允许循环结构交叉。外循环体的一个组成部分。不允许循环结构交叉。 (2) 每次通过外层循环再次进入内层循环时,内每次通过外层循环再次进入内层循环时,内层循环的初始条件必须重新设置。层循环的初始条件必
124、须重新设置。 (3) 外循环的初值应该安排在进入外循环体之前;外循环的初值应该安排在进入外循环体之前;内循环的初值应该安排在进入内循环之前,但必须内循环的初值应该安排在进入内循环之前,但必须在外循环体之内。在外循环体之内。3.4.4 多重循环多重循环第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步 (4) 如如果果在在各各循循环环中中都都使使用用寄寄存存器器CX作作计计数数控控制制,那那么么由由于于只只有有一一个个计计数数寄寄存存器器CX,因因此此在在内内循循环环设设置置CX初初值值前前,必必须须先先保保存存外外循循环环中中CX的的值值,出出内内循循环环时时,必必须须恢恢复复外外循循环
125、环使使用用的的CX值。值。 (5) 转转移移指指令令只只能能从从循循环环结结构构内内转转出出或或可可在在同同层层循循环环内内转转移移而而不不能能从从另另一一个个循循环环结结构构外外转入该循环结构内。转入该循环结构内。第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步常见的双重循环的程序结构如下常见的双重循环的程序结构如下: 外层循环初始化 MOV CX,外层循环次数MLOOPl: ;外层循环体的指令 MOV DI,CX ;保存外层循环次数 内层循环初始化 MOV CX,内层循环次数N ;设置内层循环次数LOOP2: ;内层循环的循环体 LOOP LOOP 2 ;继续内层循环 MOV CX
126、,DI ;恢复外层循环的次数 ;外层循环体的指令序列 LOOP LOOP l ;继续外层循环第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步下面将用例子来说明多重循环的使用方法。下面将用例子来说明多重循环的使用方法。【例【例3-13】 试编写一个程序:设在以试编写一个程序:设在以SCORE为首址的内存区为首址的内存区中依次存放着某考区中依次存放着某考区100个理科生的七门成绩现要统计每个个理科生的七门成绩现要统计每个考生的总成绩,并将其存放在该考生单科成绩之后的两个单元。考生的总成绩,并将其存放在该考生单科成绩之后的两个单元。分析问题:这个问题可用双重循环程序结构来完成。累加每个学生分
127、析问题:这个问题可用双重循环程序结构来完成。累加每个学生的的7门成绩,使用一个内循环,对不同的学生重复同样的操作,使用门成绩,使用一个内循环,对不同的学生重复同样的操作,使用外循环,次数外循环,次数100。确定算法:这个问题直观的考虑:从第一个学生开始累加他的确定算法:这个问题直观的考虑:从第一个学生开始累加他的7门门成绩,设成绩,设CX7,使用一个内循环,每累加一次,使用一个内循环,每累加一次CX减减1,当,当CX= 0时时控制内循环结束,并把总成绩存入到后续的两个单元中。然后,需控制内循环结束,并把总成绩存入到后续的两个单元中。然后,需要累加第二个学生的成绩,累加的过程同上,依此类推,可以
128、累加要累加第二个学生的成绩,累加的过程同上,依此类推,可以累加每个学生的成绩。但是此时重要的是判断循环什么时候累加所有的每个学生的成绩。但是此时重要的是判断循环什么时候累加所有的学生成绩完毕,为此需要一层外循环,设置学生成绩完毕,为此需要一层外循环,设置BL学生总人数,每累学生总人数,每累加完一个学生,加完一个学生,BL的值减的值减1直至直至BL0,外循环结束。,外循环结束。画程序流程图:根据这个思路绘制程序框图,见图画程序流程图:根据这个思路绘制程序框图,见图3-12。第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步确确定定汇汇编编语语言言程程序序的的基基本本框框架架:可可见见,该该
129、汇汇编编语语言言程程序序的的基基本本框框架架至至少少要要两两个个段段:数数据据段段和和代代码码段段。数数据据段段中中至至少少定定义义1个个数数组组变变量量SCORE,因因学学生生成成绩绩不不会会超超过过10064H,选选DB类类型型,共共100组组,每每组组10个个数数据据,第第一一个个数数是是学学号号,接接着着是是7门门成成绩绩,最最后后是是该该生生的的总总成成绩绩,显显然然是是16位位数数,应应该该占占据据该该考考生生单单科科成成绩绩之之后后的的两两个个单单元元,初初始始化化为为00,00。使使用用寄寄存存器器SI定定地地址址位位。累累计计总总成成绩绩的的中中间间结结果果放放在在寄寄存存器
130、器AX。外外循循环环次次数数计计数数器器用用用用寄寄存存器器BL,内内循循环环次次数数计计数数器用寄存器器用寄存器CX。 编编写写程程序序,可可以以想想得得到到,需需要要MOV、LEA 、ADD 、ADC 、XOR 、INC 、JNZ 、DEC和和LOOP等等指指令令。最最后后要要返返回回DOS。具体程序如下:具体程序如下:图图3-12例例3-13程序执行流程图程序执行流程图第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步DATA SEGMENTSCORE DB 01,70,85,84,92,70,49,85,00,00DB 02,65,80,90,85,69,42,89,00,00
131、DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATAMOV AX,DATA MOV DS,AX ;/给数据段赋值给数据段赋值BEGIN:LEA SI,SCORE ;/将数据缓冲区将数据缓冲区SCORE首地址送首地址送SIMOV BL,100 ;/将外循环次数送寄存器将外循环次数送寄存器BLLOP2:MOV CX,7 ;/内循环次数送寄存器内循环次数送寄存器CXXOR AX,AX ;/将寄存器将寄存器AX清清0第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步INC SI ;/SI SI1,除开学号,从学生成绩开始进行累加,除开学号,从学生成绩开始进行累加
132、LOPl:ADD AL,SI ;/从第一个学生第一门成绩开始累加他的从第一个学生第一门成绩开始累加他的7门成绩门成绩ADC AH,0 ;/AH(CF)0,统计进位的数值,统计进位的数值INC SI ;/SI SI1,进入第二门成绩存放地址,进入第二门成绩存放地址LOOP LOPl ;(/CX)(CX)1,若(,若(CX)0,继续循环,继续循环LOPl , 判断内循环是否结束判断内循环是否结束MOV WORD PTRSI,AX;/一个学生一个学生7门成绩累加完毕后,其总门成绩累加完毕后,其总 成绩存放在各门成绩后续的两个内存单元中成绩存放在各门成绩后续的两个内存单元中 INC SI ;/移动指针
133、移动指针SI一次一次INC SI ;/再移动指针再移动指针SI一次一次 DEC BL ;/一个学生一个学生7门成绩累加完毕,外循环次数减门成绩累加完毕,外循环次数减1JNZ LOOP2 ;/若(若(BL)0,继续外循环,继续外循环MOV AH,4CH ;/返回返回DOSINT 21H第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步CODE ENDS;/代码段结束代码段结束END BEGIN第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步本章小结本章小结 本章主要介绍了汇编程序设计的结构和基本方法。重点本章主要介绍了汇编程序设计的结构和基本方法。重点是掌握三种程序设计结构,即顺序
134、结构、分支结构和循环结是掌握三种程序设计结构,即顺序结构、分支结构和循环结构。构。分支结构有两种形式:双路分支和多路分支结构。分支程序分支结构有两种形式:双路分支和多路分支结构。分支程序通常采用如下两种方法来实现程序的转移:通常采用如下两种方法来实现程序的转移: (1)通过比较、测试指令形成条件,或通过指令运算,然通过比较、测试指令形成条件,或通过指令运算,然后判断某些标志位的条件来进行转移。后判断某些标志位的条件来进行转移。 (2)通过地址表来进行转移。通过地址表来进行转移。 循环程序结构有两种形式:先执行后判断的循环程序结构有两种形式:先执行后判断的DOuNTII。结构和先判断后执行的结构和先判断后执行的D0一一WHILE结构。结构。D0-UNTIL结构循结构循环至少会执行一次,而环至少会执行一次,而D0-WHILE结构的循环可能会执行零结构的循环可能会执行零次。次。第第3 3章章 汇编语言程序设计初步汇编语言程序设计初步Thank you very much !本章到此结束,谢谢您的光临!本章到此结束,谢谢您的光临!返回本章首页返回本章首页结结 束束