《汇编语言程序设计》第九章分支程序与循环程序设计_第1页
《汇编语言程序设计》第九章分支程序与循环程序设计_第2页
《汇编语言程序设计》第九章分支程序与循环程序设计_第3页
《汇编语言程序设计》第九章分支程序与循环程序设计_第4页
《汇编语言程序设计》第九章分支程序与循环程序设计_第5页
已阅读5页,还剩71页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、-朱耀庭南开大学南开大学 朱耀庭朱耀庭第第9章章 分支程序与循环程序设计分支程序与循环程序设计v 直接程序、分支程序、循环程序、过程和中断处理程序是直接程序、分支程序、循环程序、过程和中断处理程序是汇编语言的基本程序结构。汇编语言的基本程序结构。v 本章将重点学习分支程序和循环程序。本章将重点学习分支程序和循环程序。v 希望同学们通过本章的学习,掌握汇编语言的这两种程序希望同学们通过本章的学习,掌握汇编语言的这两种程序设计方法,并且能够深入了解它们与相应高级语言程序设设计方法,并且能够深入了解它们与相应高级语言程序设计方法的区别计方法的区别 南开大学南开大学 朱耀庭朱耀庭第第9章章 分支程序与

2、循环程序设计分支程序与循环程序设计 9.3 循环程序设计循环程序设计9.2 程序设计流程图程序设计流程图 9.1 分支分支 南开大学南开大学 朱耀庭朱耀庭9.1 分支分支 v 本节将介绍本节将介绍 (1)标号的定义标号的定义 (2)无条件转移指令(无条件转移指令(JMP)的各种寻址方式的使用)的各种寻址方式的使用 (3)各种条件转移指令如何根据标志寄存器的状态判断是否各种条件转移指令如何根据标志寄存器的状态判断是否转移转移 (4)并结合程序实例说明如何编写分支程序。并结合程序实例说明如何编写分支程序。南开大学南开大学 朱耀庭朱耀庭9.1 分支分支 标号标号 无条件转移指令无条件转移指令 9.1

3、.19.1.29.1.3 条件转移条件转移 南开大学南开大学 朱耀庭朱耀庭9.1.1 标号标号v 标号用来说明可执行指令在汇编语言程序中的位置。标号可以作为转标号用来说明可执行指令在汇编语言程序中的位置。标号可以作为转移指令的操作数,转移指令包括条件转移、无条件转移(移指令的操作数,转移指令包括条件转移、无条件转移(JMP)以及)以及过程调用指令(过程调用指令(CALL)。)。v 与变量类似,标号有段与变量类似,标号有段(SEGMENT)、位移量、位移量(OFFSET)和距离和距离(DISTANCE)三种属性。段和位移量属性指明标号位于哪个段和其在三种属性。段和位移量属性指明标号位于哪个段和其

4、在段中的偏移位置。标号一旦定义,这两个属性就自然产生。如果访问段中的偏移位置。标号一旦定义,这两个属性就自然产生。如果访问标号的转移指令和定义的标号同属程序的一个段,这时实现转移不需标号的转移指令和定义的标号同属程序的一个段,这时实现转移不需要修改代码段寄存器要修改代码段寄存器CS,仅仅需要修改,仅仅需要修改IP。这种情况下就将这个标号。这种情况下就将这个标号的距离属性定义为的距离属性定义为NEAR。NEAR属性意味着段内转移。如果一个标属性意味着段内转移。如果一个标号被其他段中的转移指令号被其他段中的转移指令JMP或或CALL指令访问,那么实现转移就不指令访问,那么实现转移就不仅仅是修改仅仅

5、是修改IP的问题,还必须同时修改的问题,还必须同时修改CS使其指向标号所在的段。这使其指向标号所在的段。这种情况下,标号的距离属性应该定义为种情况下,标号的距离属性应该定义为FAR,而不是,而不是NEAR。NEAR属性的标号,当其与转移指令的地址距离能够用一个字节表示时(即属性的标号,当其与转移指令的地址距离能够用一个字节表示时(即范围在范围在-128到到127之间),称这种转移为短(之间),称这种转移为短(SHORT)转移。标号的)转移。标号的属性需要在定义标号时指出。属性需要在定义标号时指出。南开大学南开大学 朱耀庭朱耀庭9.1.1 标号标号标号的定义标号的定义 1取标号属性操作符取标号属

6、性操作符 2南开大学南开大学 朱耀庭朱耀庭1. 标号的定义标号的定义 1) 标号的隐含说明标号的隐含说明v 定义距离属性为定义距离属性为NEAR的标号,可以使用隐含的说明。隐的标号,可以使用隐含的说明。隐含说明也称缺省定义,即在需要定义标号的指令前写一个含说明也称缺省定义,即在需要定义标号的指令前写一个标识符,再在标识符后面加上冒号,这个标识符就是操作标识符,再在标识符后面加上冒号,这个标识符就是操作标号。标号。v 例如:例如: L1:MOV AX, BX :ADD AX,100其中其中L1和和都是标号标识符,简称标号,标号都是标号标识符,简称标号,标号L1和和的距的距离属性均为离属性均为NE

7、AR。v 注意:标号和变量命名规则一样不允许使用汇编语言的保注意:标号和变量命名规则一样不允许使用汇编语言的保留字作为标号的标识符。留字作为标号的标识符。南开大学南开大学 朱耀庭朱耀庭1. 标号的定义标号的定义 2) 用用EQU伪指令定义标号伪指令定义标号v 标号的另外一种定义方法是使用标号的另外一种定义方法是使用EQU伪指令显式地定义。伪指令显式地定义。v 例如:例如: L2 EQU THIS NEAR AND AX,0FFH L3 EQU THIS FAR OR AL,30Hv 其中标号其中标号L2为为NEAR标号,标号标号,标号L3为为FAR标号,可见使用标号,可见使用EQU伪指令既可以

8、定义伪指令既可以定义NEAR标号,也可以定义标号,也可以定义FAR标号。标号。但对于但对于NEAR属性的标号一般不使用这样的显式地说明,属性的标号一般不使用这样的显式地说明,而是使用前面的隐式说明更为方便。而是使用前面的隐式说明更为方便。南开大学南开大学 朱耀庭朱耀庭1. 标号的定义标号的定义 3)用用LABEL伪指令定义标号伪指令定义标号v 标号的第三种定义方法是使用标号的第三种定义方法是使用LABEL伪指令显式地定义。伪指令显式地定义。v 例如:例如: L4 LABEL NEAR MOV AX,DX L5 LABEL FAR AND AL,30Hv 其中标号其中标号L4为为NEAR标号,标

9、号标号,标号L5为为FAR标号,可见使用标号,可见使用LABEL伪伪指令与指令与EQU一样,既可以定义一样,既可以定义NEAR标号,也可以定义标号,也可以定义FAR标号。但标号。但对于对于NEAR属性的标号一般也不使用这样的显式地说明,而是使用前属性的标号一般也不使用这样的显式地说明,而是使用前面的隐式说明更为方便。面的隐式说明更为方便。v 注意:使用注意:使用EQU伪指令和伪指令和LABEL伪指令所不同的是,前者在伪指令所不同的是,前者在EQU与与属性属性NEAR或或FAR之间必须加之间必须加THIS操作符定义,而后者则不需要。无操作符定义,而后者则不需要。无论论EQU还是还是LABEL它们

10、都既可以定义它们都既可以定义FAR标号也可以定义标号也可以定义NEAR标号。标号。南开大学南开大学 朱耀庭朱耀庭1. 标号的定义标号的定义 4)同一位置定义两个距离属性不同的标号)同一位置定义两个距离属性不同的标号v 程序中的同一位置定义两个距离属性不同的标号,可以提程序中的同一位置定义两个距离属性不同的标号,可以提高访问标号的灵活性。高访问标号的灵活性。v 例如:例如: L6 LABEL FAR L7: XOR AX,0F0FHv 其中,标号其中,标号L6和标号和标号L7的段属性和位移量属性是一样的;的段属性和位移量属性是一样的;而距离属性不同,而距离属性不同,L6为为FAR,L7为为NEA

11、R。其他段的。其他段的JMP指令转移到此处时,用指令转移到此处时,用L6作为作为JMP指令的远转移操作数指令的远转移操作数(目标地址目标地址);而本段的;而本段的JMP指令或条件转移指令转移到此指令或条件转移指令转移到此处时,用处时,用L7作为转移指令的操作数。在作为转移指令的操作数。在EQU伪指令中用伪指令中用THIS操作符同样可以给操作符同样可以给L7处定义另一标号名称,此标号处定义另一标号名称,此标号距离属性被指明为距离属性被指明为FAR,用以提高访问标号的灵活性。,用以提高访问标号的灵活性。南开大学南开大学 朱耀庭朱耀庭1. 标号的定义标号的定义 4)同一位置定义两个距离属性不同的标号

12、)同一位置定义两个距离属性不同的标号v 例如:例如: 上面的伪指令和指令等价于:上面的伪指令和指令等价于: L6 EQU THIS FAR L7: XOR AX,0F0FH南开大学南开大学 朱耀庭朱耀庭2. 取标号属性操作符取标号属性操作符 v 与取变量的属性操作一样,必要时允许对标号进行取属性与取变量的属性操作一样,必要时允许对标号进行取属性操作,返回该标号的相应属性。操作,返回该标号的相应属性。1)取标号段属性)取标号段属性 格式:格式:SEG 标号名标号名 功能:返回标号所在段的基址。功能:返回标号所在段的基址。 例如:例如: MOV AX,SEG L2;将标号将标号L2所在段所在段的基

13、址送至的基址送至AX南开大学南开大学 朱耀庭朱耀庭2. 取标号属性操作符取标号属性操作符 2)取标号位移属性)取标号位移属性v 格式:格式:OFFSET 标号名标号名v 功能:返回标号所在段的位移量。功能:返回标号所在段的位移量。v 例如:例如: MOV BX,OFFSET L2;将标号将标号L2相对于相对于 所在段段首的位移量送至所在段段首的位移量送至BX3)取标号类型属性)取标号类型属性v 格式:格式:TYPE 标号名标号名v 功能:返回的是标号的属性功能:返回的是标号的属性NEAR或或FAR。南开大学南开大学 朱耀庭朱耀庭9.1.2 无条件转移指令无条件转移指令v 80X86汇编语言程序

14、中指令的执行顺序由代码段寄存器汇编语言程序中指令的执行顺序由代码段寄存器CS和指令指针寄存器和指令指针寄存器IP的内容决定。的内容决定。CS寄存器中存放有当寄存器中存放有当前代码段的基地址,当前代码段就是正在从中取出代码指前代码段的基地址,当前代码段就是正在从中取出代码指令的存储器部分,段内容量可达令的存储器部分,段内容量可达64K字节。字节。IP的内容为要的内容为要执行的下一条指令距当前代码段段首的位移量,即偏移地执行的下一条指令距当前代码段段首的位移量,即偏移地址。址。CS和和IP相结合相结合(CS)*16(IP),指向从中取出下一条,指向从中取出下一条指令的存储单元地址。在大多数工作状态

15、下,要执行的下指令的存储单元地址。在大多数工作状态下,要执行的下一条指令已从存储器中取出,并放在一条指令已从存储器中取出,并放在CPU中总线接口单元中总线接口单元BIU的指令队列中等待执行。转移指令对指令指针寄存器的指令队列中等待执行。转移指令对指令指针寄存器IP及代码段寄存器及代码段寄存器CS起作用,改变这些寄存器的内容就起作用,改变这些寄存器的内容就会改变正常的执行顺序。当程序发生转移时,指令队列中会改变正常的执行顺序。当程序发生转移时,指令队列中就不再有接下来要执行的指令。就不再有接下来要执行的指令。南开大学南开大学 朱耀庭朱耀庭9.1.2 无条件转移指令无条件转移指令v 总线接口单元将

16、利用新的总线接口单元将利用新的IP和和CS值从存储器中取得下一值从存储器中取得下一条指令,直接把该指令传送给执行单元;然后开始从新的条指令,直接把该指令传送给执行单元;然后开始从新的指令存储单元中取指令,重新补充指令队列。指令存储单元中取指令,重新补充指令队列。v 80X86有四组控制程序转移的指令有四组控制程序转移的指令: (1)即无条件转移指令即无条件转移指令 (2)条件转移指令条件转移指令 (3)循环控制指令循环控制指令 (4)中断指令。中断指令。南开大学南开大学 朱耀庭朱耀庭9.1.2 无条件转移指令无条件转移指令v 无条件转移指令的格式和功能如下:无条件转移指令的格式和功能如下: 格

17、式:格式:JMP 目标操作数目标操作数 其中目标操作数可以是标号,可以是寄存器,可以是内存其中目标操作数可以是标号,可以是寄存器,可以是内存操作数。当目标操作数为标号时,显然是转移到标号所在操作数。当目标操作数为标号时,显然是转移到标号所在位置执行。当目标操作数为位置执行。当目标操作数为16位通用寄存器时,则用该通位通用寄存器时,则用该通用寄存器内容修改用寄存器内容修改IP,CS不变,实现段内转移。当目标不变,实现段内转移。当目标操作数为内存操作数时,如果该内存操作数为字变量,则操作数为内存操作数时,如果该内存操作数为字变量,则由该变量的值修改由该变量的值修改IP后实现段内转移;如果该内存操作

18、数后实现段内转移;如果该内存操作数为双字变量,则由该变量的值同时修改为双字变量,则由该变量的值同时修改CS和和IP的值,实的值,实现段间转移。现段间转移。 南开大学南开大学 朱耀庭朱耀庭9.1.2 无条件转移指令无条件转移指令v 无条件转移指令的格式和功能如下:无条件转移指令的格式和功能如下: 功能:功能:JMP指令无条件地将控制转移至由目标操作数所指指令无条件地将控制转移至由目标操作数所指定的位置执行。定的位置执行。 一般情况下,汇编系统会将段内的转移视为近转移,偏移一般情况下,汇编系统会将段内的转移视为近转移,偏移量会用一个字来表示,即生成三个字节的指令代码。当程量会用一个字来表示,即生成

19、三个字节的指令代码。当程序员知道其转移为短转移时,可以采用序员知道其转移为短转移时,可以采用JMP SHORT标号标号的方式告诉汇编系统只生成两个字节的短转移代码指令即的方式告诉汇编系统只生成两个字节的短转移代码指令即可。可。南开大学南开大学 朱耀庭朱耀庭9.1.2 无条件转移指令无条件转移指令段内直接短转移段内直接短转移 1段间直接转移段间直接转移 3存储器段内间接转移存储器段内间接转移 5段内直接近转移或隐含的段内短转移段内直接近转移或隐含的段内短转移 2寄存器段内间接转移寄存器段内间接转移 4存储器段间间接转移存储器段间间接转移 6JMP有多种转移方式有多种转移方式 :南开大学南开大学

20、朱耀庭朱耀庭1段内直接短转移段内直接短转移v 格式:格式:JMP SHORT 标号名标号名v 功能:如果转移发生在同一段中功能:如果转移发生在同一段中-128+127字节的范围内,字节的范围内,无论目标标号在本转移指令之前还是之后定义,此时可以无论目标标号在本转移指令之前还是之后定义,此时可以在在JMP指令中的目标标号前面加一个指令中的目标标号前面加一个SHORT操作符,以操作符,以实现短转移,短转移指令的直接位移量仅占一个字节,这实现短转移,短转移指令的直接位移量仅占一个字节,这种情况下汇编程序会将其汇编为一个双字节的短转移指令。种情况下汇编程序会将其汇编为一个双字节的短转移指令。南开大学南

21、开大学 朱耀庭朱耀庭2段内直接近转移或隐含的段内短转移段内直接近转移或隐含的段内短转移v 格式:格式:JMP 标号名标号名 其中,标号为其中,标号为NEAR属性属性v 功能:在标号为功能:在标号为NEAR属性时,如果标号定义出现在该属性时,如果标号定义出现在该JMP指令之前,则与前面的指令之前,则与前面的JMP SHORT格式一样,隐含格式一样,隐含地将其汇编为一个双字节的短转移指令;反之如果该地将其汇编为一个双字节的短转移指令;反之如果该JMP指令在前,而所定义的标号在指令在前,而所定义的标号在JMP指令之后,则汇编程序指令之后,则汇编程序将本转移指令汇编为将本转移指令汇编为3字节的段内近转

22、移指令。字节的段内近转移指令。v 详见例详见例9-1、例、例9-2例例9-1 段内直接短转移段内直接短转移 例例9-1 清单文件清单文件 注意:清单中用黑体字标出了双字节短转移指令注意:清单中用黑体字标出了双字节短转移指令南开大学南开大学 朱耀庭朱耀庭2段内直接近转移或隐含的段内短转移段内直接近转移或隐含的段内短转移v 注意:清单中用黑体字标出了三字节近转移指令和双字节注意:清单中用黑体字标出了三字节近转移指令和双字节短转移指令。近转移可以在段内也可以在逻辑段的组内实短转移指令。近转移可以在段内也可以在逻辑段的组内实现。现。例例9-2 NEAR转移或隐含的转移或隐含的SHORT转移转移 例例9

23、-2 清单文件清单文件 南开大学南开大学 朱耀庭朱耀庭3段间直接转移段间直接转移v 格式:格式:JMP 标号标号 其中,标号为其中,标号为FAR属性属性v 功能:汇编程序根据远标号生成一个双字指针,指向标功能:汇编程序根据远标号生成一个双字指针,指向标号所在的段和位移,并且将标号所在的段地址和位移分别号所在的段和位移,并且将标号所在的段地址和位移分别送送CS和和IP以实现跨代码段的转移。以实现跨代码段的转移。例例9-3 段间直接转移段间直接转移 v 程序说明:本程序含有两个代码段,代码段程序说明:本程序含有两个代码段,代码段code1中定义中定义了远标号了远标号l1,程序由代码段,程序由代码段

24、code2的的begin标号开始执行,标号开始执行,输出字母输出字母o之后,无条件转移到代码段之后,无条件转移到代码段code1中的远标号中的远标号l1执行,输出字符执行,输出字符K后程序结束。后程序结束。 南开大学南开大学 朱耀庭朱耀庭4寄存器段内间接转移寄存器段内间接转移 v 格式:格式:JMP 16位通用寄存器位通用寄存器v 功能:功能:CS不变,通用寄存器的内容送不变,通用寄存器的内容送IP,实现段内转移。,实现段内转移。v 一个通用寄存器一个通用寄存器(16位位),它的内容是,它的内容是JMP的转移目标在当的转移目标在当前前CS寻址的段中的位移量。寻址的段中的位移量。v 例如:例如:

25、 JMP BX ;把控制转向把控制转向CS:BX JMP SI ;把控制转向把控制转向CS:SI JMP BP ;把控制转向把控制转向CS:BP例例9-4寄存器段内间接转移寄存器段内间接转移 南开大学南开大学 朱耀庭朱耀庭4寄存器段内间接转移寄存器段内间接转移 v 程序说明:本程序从第一个可执行语句开始执行,首先从程序说明:本程序从第一个可执行语句开始执行,首先从键盘读入一个字符,如果是小写字母键盘读入一个字符,如果是小写字母y,输出字母,输出字母o;否则;否则程序结束。程序结束。v 其中预先将标号其中预先将标号l1的位移送入的位移送入bp,然后判断输入的是字母,然后判断输入的是字母y吗?若是

26、则转吗?若是则转l3将将BP送送IP转转l1,输出,输出o结束;若不是则将结束;若不是则将l2标号位移送标号位移送bp,然后遇,然后遇jmp bp,将,将bp送送IP,转,转l2结束程结束程序。序。南开大学南开大学 朱耀庭朱耀庭5存储器段内间接转移存储器段内间接转移v 格式:格式:JMP 存储器字变量存储器字变量v 功能:功能:CS不变,存储器字变量内容送不变,存储器字变量内容送IP,实现段内转移。,实现段内转移。v 例如,在数据段中定义:例如,在数据段中定义: NEAR_LABEL_ARRAY DW L1 DW L2 DW L3南开大学南开大学 朱耀庭朱耀庭5存储器段内间接转移存储器段内间接

27、转移v 在代码段中定义:在代码段中定义: MOV D1,0 JMP NEAR_LABEL_ARRAYDI ;转移到转移到L1处处 MOV DI,4 JMP NEAR_LABEL_ARRAYDI ;转移到转移到L3处处 南开大学南开大学 朱耀庭朱耀庭5存储器段内间接转移存储器段内间接转移v 用字存储器作为段内间接转移的目标地址时,可以有类似用字存储器作为段内间接转移的目标地址时,可以有类似存储器数据的各种寻址方式。存储器数据的各种寻址方式。v 例如:例如: JMP VAR-WORD ;直接寻址方式直接寻址方式 JMP WORD PTRBX ;间接寻址方式间接寻址方式 JMP WORD PTRBX

28、2 ;基址位移基址位移 JMP WORD PTRBXSI4 ;基址变址位移基址变址位移 南开大学南开大学 朱耀庭朱耀庭5存储器段内间接转移存储器段内间接转移v 例例9-5 存储器间接转移示例。存储器间接转移示例。v 题目:编写程序,从键盘输入题目:编写程序,从键盘输入0到到7的数字符号,分别对应的数字符号,分别对应输出输出A到到H。要求用寄存器间接转移实现。要求用寄存器间接转移实现v 设计思路:输入的数字符号设计思路:输入的数字符号0到到7对应一个字节的对应一个字节的8位,输位,输入几,该字节中的第几位置入几,该字节中的第几位置1,然后根据哪一位为,然后根据哪一位为1再转到再转到8个不同的标号

29、处,实现输出。个不同的标号处,实现输出。例例9-5 存储器间接转移示例存储器间接转移示例 南开大学南开大学 朱耀庭朱耀庭5存储器段内间接转移存储器段内间接转移v 例例9-5 存储器间接转移示例。存储器间接转移示例。v 程序说明:本程序首先从键盘读入一个合法的数字符号程序说明:本程序首先从键盘读入一个合法的数字符号07,然后转换成对应的二进制数(,然后转换成对应的二进制数(0B111B)之一,)之一,利用此二进制数查表利用此二进制数查表TABEL2得到对应表中(得到对应表中(01H,02H,04H,08H,10H,20H,40H,80H)的某一个值,其值)的某一个值,其值表示表示07位中哪一位为

30、位中哪一位为1,然后用移位指令判断,然后用移位指令判断07中哪中哪一位为一位为1,通过,通过TABEL1的存储器间接转移,输出对应的存储器间接转移,输出对应AH的一个字母。的一个字母。南开大学南开大学 朱耀庭朱耀庭6存储器段间间接转移存储器段间间接转移 v 格式:格式:JMP 双字变量。双字变量。v 功能:用双字变量的内容中的字分别修改功能:用双字变量的内容中的字分别修改CS和和IP,实现,实现段间转移。段间转移。v 例如:例如: JMP VAR_DWORD JMP DWORD PTRBXSI JMP ALPHABPDI南开大学南开大学 朱耀庭朱耀庭6存储器段间间接转移存储器段间间接转移 v

31、段间间接转移指令一般只能通过存储器来实现转移,用指段间间接转移指令一般只能通过存储器来实现转移,用指令所规定的双字指针的第一个字取代令所规定的双字指针的第一个字取代IP的内容,而用第二的内容,而用第二个字取代个字取代CS的内容。用的内容。用DWORD变量存放一个变量存放一个FAR属性的属性的标号的位移量和段基址,而将这个变量的位移量送至一个标号的位移量和段基址,而将这个变量的位移量送至一个变址寄存器或者基址寄存器,用这个变址寄存器或者基址变址寄存器或者基址寄存器,用这个变址寄存器或者基址寄存器作为寄存器作为JMP指令的间接寻址的转移目标地址,可以实指令的间接寻址的转移目标地址,可以实现段间的双

32、重间接转移。现段间的双重间接转移。 南开大学南开大学 朱耀庭朱耀庭6存储器段间间接转移存储器段间间接转移 v 例如,在数据段中有如下定义:例如,在数据段中有如下定义: ADTARG DD L ;L在其他模块定义在其他模块定义 在代码段中有如下指令:在代码段中有如下指令: MOV BX,OFFSET ADTARG JMP DWORD PTRBX;转到另一段转到另一段L处处 南开大学南开大学 朱耀庭朱耀庭9.1.3 条件转移条件转移v 实现转移有几个要素实现转移有几个要素:v 一个是转移的目标位置,这已经由标号所决定一个是转移的目标位置,这已经由标号所决定v 一个是何种情况下转移一个是何种情况下转

33、移v 作为无条件转移,这些问题已经解决作为无条件转移,这些问题已经解决v 但如果能实现满足某个条件时转移,就可以实现程序的条但如果能实现满足某个条件时转移,就可以实现程序的条件分支件分支v 这就需要用条件转移指令。这就需要用条件转移指令。南开大学南开大学 朱耀庭朱耀庭9.1.3 条件转移条件转移条件转移的依据是标志寄存器条件转移的依据是标志寄存器 1比较比较CMP与测试指令与测试指令TEST 3条件转移指令的限制条件转移指令的限制 5条件转移的三种判断出发点条件转移的三种判断出发点 2算术运算、逻辑运算、移位指令与条件转移算术运算、逻辑运算、移位指令与条件转移 4南开大学南开大学 朱耀庭朱耀庭

34、1. 条件转移的依据是标志寄存器条件转移的依据是标志寄存器 v 从程序设计者的角度出发,从程序设计者的角度出发,80X86提供了多种条件判断转提供了多种条件判断转移方式。无论哪种判断转移方式,均与标志寄存器的状态移方式。无论哪种判断转移方式,均与标志寄存器的状态有关。有关。v 标志寄存器的状态又直接受到刚执行过的算术运算、逻辑标志寄存器的状态又直接受到刚执行过的算术运算、逻辑运算等指令的影响,也就是说,标志寄存器的状态可以定运算等指令的影响,也就是说,标志寄存器的状态可以定性反映运算结果。性反映运算结果。v 条件转移指令就是根据标志寄存器的状态进行判断转移或条件转移指令就是根据标志寄存器的状态

35、进行判断转移或顺序执行的。顺序执行的。南开大学南开大学 朱耀庭朱耀庭2. 条件转移的三种判断出发点条件转移的三种判断出发点 v 从用户的角度出发从用户的角度出发80X86提供了以下提供了以下3种判断转移的方法:种判断转移的方法:(1)从标志寄存器的标志状态出发,进行判断转移。)从标志寄存器的标志状态出发,进行判断转移。v 例如,例如, JZ L1;如果如果ZF=1转移到转移到L1执行,否则执行,否则顺序执行。顺序执行。(2)从无符号数出发,进行判断转移。判断两个无符号数,)从无符号数出发,进行判断转移。判断两个无符号数,就有高于就有高于A(Above)、等于)、等于E(Equal)、低于)、低

36、于B(Below)之分,于是有:)之分,于是有: JA/JNBE高于高于/不低于等于转移不低于等于转移 JAE/JNB高于等于高于等于/不低于转移不低于转移 JB/JNAE 低于低于/不高于等于不高于等于 JBE/JNA 低于等于低于等于/不高于不高于 JE/JZ 等于等于/结果为结果为0 JNE/JNZ 不等于不等于/结果不为结果不为0南开大学南开大学 朱耀庭朱耀庭2. 条件转移的三种判断出发点条件转移的三种判断出发点 (3)从带符号数出发,进行判断转移。判断两个带符号数,)从带符号数出发,进行判断转移。判断两个带符号数,就有大于就有大于G(Greater)、等于)、等于E(Equal)、小

37、于()、小于(Less)之分,于是有:之分,于是有: JG/JNGE 大于大于/不小于等于转移不小于等于转移 JGE/JNL 大于等于大于等于/不小于转移不小于转移 JL/JNGE 小于小于/不大于等于不大于等于 JLE/JNG 小于等于小于等于/不大于不大于 JE/JZ 等于等于/结果为结果为0 JNE/JNZ 不等于不等于/结果不为结果不为0南开大学南开大学 朱耀庭朱耀庭3. 比较比较CMP与测试指令与测试指令TEST 1)CMP指令指令v 格式:格式:CMP 目标操作数,源操作数目标操作数,源操作数v 功能:模拟目标减源的减法操作,并且影响标志寄存器,功能:模拟目标减源的减法操作,并且影

38、响标志寄存器,而不改变目标操作数。而不改变目标操作数。2)TEST指令指令v 格式:格式:TEST 目标操作数,源操作数目标操作数,源操作数v 功能:模拟目标与源的与操作,并且影响标志寄存器,而功能:模拟目标与源的与操作,并且影响标志寄存器,而不改变目标操作数。不改变目标操作数。南开大学南开大学 朱耀庭朱耀庭3. 比较比较CMP与测试指令与测试指令TEST 2)TEST指令指令v 例如:例如:(1)MOV AL,-1 MOV BL,3 SUB AL,BL;-4送送AL JL L1;由于;由于-1小于小于3,即,即AL小于小于BL所以转移所以转移 到到L1执行执行 (2)MOV AL,-1 MO

39、V BL,3 CMP AL,BL;AL不变,仅仅影响标志位不变,仅仅影响标志位 JBE L1;由于;由于-1作为无符号数是作为无符号数是0FFH高于高于3,即,即AL高高 于于BL所以顺序执行,不转移所以顺序执行,不转移南开大学南开大学 朱耀庭朱耀庭3. 比较比较CMP与测试指令与测试指令TEST 2)TEST指令指令(3)MOV AL,80H MOV BL,41H AND BL,AL;0送送BL JNZ L1 ;因为结果为;因为结果为0所以顺序执行,不转移所以顺序执行,不转移(4)MOV AL,80H MOV BL,41H TEST BL,AL ;不改变不改变BL,但模拟运算结果为,但模拟运

40、算结果为0,置,置ZF 为为1 JNZ L1 ;因为结果为;因为结果为0所以顺序执行,不转移所以顺序执行,不转移南开大学南开大学 朱耀庭朱耀庭3. 比较比较CMP与测试指令与测试指令TEST 2)TEST指令指令v 结论之一,使用结论之一,使用CMP与与SUB,TEST与与AND能够进行相同能够进行相同的判断转移,但的判断转移,但CMP和和TEST均不改变被判断的操作数,均不改变被判断的操作数,而而SUB与与AND则会改变目标操作数。则会改变目标操作数。v 结论之二,负数以补码形式存放,当做为无符号数进行比结论之二,负数以补码形式存放,当做为无符号数进行比较时是以其对应的补码形式做为无符号数进

41、行的,因此较时是以其对应的补码形式做为无符号数进行的,因此-1高于高于3。南开大学南开大学 朱耀庭朱耀庭4算术运算、逻辑运算、移位指令与条件算术运算、逻辑运算、移位指令与条件转移转移v 由于所有算术运算、逻辑运算、移位指令均影响标志寄存由于所有算术运算、逻辑运算、移位指令均影响标志寄存器状态,因此所有这些指令都可以与条件转移指令配合并器状态,因此所有这些指令都可以与条件转移指令配合并且实现条件转移。且实现条件转移。v 例如:例如:(1) MOV AL,-1 ADD AL,1;结果为结果为0,置,置ZF为为1 JZ L1 ;转移到转移到L1执行执行(2) MOV AL,3 MOV BL,4 MU

42、L BL;结果最高位为结果最高位为0,整数,整数 JS L1 ;为正不转移;为正不转移南开大学南开大学 朱耀庭朱耀庭4算术运算、逻辑运算、移位指令与条件算术运算、逻辑运算、移位指令与条件转移转移v 例如:例如:(3) MOV AL,80H SHL AL,1;80H左移左移1位进入进位位,位进入进位位,CF置置1 JNC L1 ;进位位为;进位位为0时转移,这里为时转移,这里为1不转移,顺序不转移,顺序 执行执行 南开大学南开大学 朱耀庭朱耀庭5条件转移指令的限制条件转移指令的限制v 由于在条件转移指令中其字段构成仅仅用一个字节描述转由于在条件转移指令中其字段构成仅仅用一个字节描述转移指令与转移

43、目标间的位移,因此这种转移只能是短转移,移指令与转移目标间的位移,因此这种转移只能是短转移,即转移指令与目标标号之间的位移必须在即转移指令与目标标号之间的位移必须在-128+127之间。之间。 南开大学南开大学 朱耀庭朱耀庭9.2 程序设计流程图程序设计流程图v 程序设计流程图也称作程序设计框图。当要编写一个解决程序设计流程图也称作程序设计框图。当要编写一个解决实际问题的程序时,首先要找到这个问题的数学模型,其实际问题的程序时,首先要找到这个问题的数学模型,其次是这个模型的算法,一旦算法给定,就可以根据所选择次是这个模型的算法,一旦算法给定,就可以根据所选择计算机语言的特点,将算法用程序的流程

44、图来表示。计算机语言的特点,将算法用程序的流程图来表示。v 在流程图中,用椭圆框表示开始或结束,用方框表示具体在流程图中,用椭圆框表示开始或结束,用方框表示具体操作或计算,用菱形框表示判断,用带指向的箭头表示下操作或计算,用菱形框表示判断,用带指向的箭头表示下一步的去向。由于用这样的流程图来表示程序从起始到结一步的去向。由于用这样的流程图来表示程序从起始到结束的步骤表示形象直观,因此程序流图成了程序设计者必束的步骤表示形象直观,因此程序流图成了程序设计者必须掌握的一种工具。须掌握的一种工具。南开大学南开大学 朱耀庭朱耀庭9.2 程序设计流程图程序设计流程图v 流程图可粗可细,粗框图便于了解总体

45、思路,细框图便于流程图可粗可细,粗框图便于了解总体思路,细框图便于程序书写。程序书写。v 一旦一个程序的流程图已经画出,就可以根据流程图,从一旦一个程序的流程图已经画出,就可以根据流程图,从开始框入手,顺着箭头逐个框地用语句实现,而不必反复开始框入手,顺着箭头逐个框地用语句实现,而不必反复考虑其与全局的关系。这就如同盖大楼一样,一旦设计图考虑其与全局的关系。这就如同盖大楼一样,一旦设计图纸确定,无论是砌墙的还是制作预制件的各个工种,每个纸确定,无论是砌墙的还是制作预制件的各个工种,每个工种只需要照图索骥就可以了。工种只需要照图索骥就可以了。v 下面通过一个例题来看流程图在分支程序设计中的应用。

46、下面通过一个例题来看流程图在分支程序设计中的应用。南开大学南开大学 朱耀庭朱耀庭9.2 程序设计流程图程序设计流程图v 例例9-6 流程图与分支程序设计示例。流程图与分支程序设计示例。v 题目:编写程序实现三个数比较大小,从高到低输出结果。题目:编写程序实现三个数比较大小,从高到低输出结果。v 设计思路:从键盘读入设计思路:从键盘读入3个字符分别到个字符分别到BH,BL,CL寄存寄存器,然后按图器,然后按图9-1所示的流程图实现比较,最后从高到低所示的流程图实现比较,最后从高到低输出。输出。例例9-6 流程图与分支程序设计示例流程图与分支程序设计示例 南开大学南开大学 朱耀庭朱耀庭9.2 程序

47、设计流程图程序设计流程图图9-1 从左到右从大到小输出3个ASCII流程图开始输入字符到BH,BL,CH?BH=BL?BL=CH?BH=CH?BH=CH?BL=CH输出BH,BL,CH输出BL,CH,BH输出CH,BL,BH结束输出BH, CH, BL输出BL,BH,CHY L1:N BLBHY L2:NCHBLY L4:Y L5:N CHBHY L3:输出CH,BH,BLNCHBH演示动画演示动画 南开大学南开大学 朱耀庭朱耀庭9.3 循环程序设计循环程序设计v 循环程序就是程序中某段指令序列在执行时多次反复执行循环程序就是程序中某段指令序列在执行时多次反复执行的程序。的程序。v 有了条件转

48、移指令就可以构造循环程序。有了条件转移指令就可以构造循环程序。v 本节重点介绍汇编语言循环程序的结构,分类以及程序设本节重点介绍汇编语言循环程序的结构,分类以及程序设计方法和技巧。计方法和技巧。v 尤其是多重循环程序的编制方法,并结合程序实例来介绍尤其是多重循环程序的编制方法,并结合程序实例来介绍变址寻址方式在多重循环程序设计中的应用。变址寻址方式在多重循环程序设计中的应用。南开大学南开大学 朱耀庭朱耀庭9.3 循环程序设计循环程序设计 循环控制指令循环控制指令 单重循环单重循环 9.3.19.3.29.3.3 多重循环多重循环 南开大学南开大学 朱耀庭朱耀庭9.3.1 循环控制指令循环控制指

49、令v 循环指令一般使用循环指令一般使用CX寄存器作为计数器,来控制循环次寄存器作为计数器,来控制循环次数。数。v 它主要包括:它主要包括: (1) 当当CX为为0时跳转的条件转移指令时跳转的条件转移指令JCXZ (2) 每次使每次使CX的值递减,并且判断的值递减,并且判断CX为为0跳转的循环指令跳转的循环指令LOOP (3)CX递减,并且判断递减,并且判断CX为为0与与ZF标志的组合是否满足条标志的组合是否满足条件的双重条件循环控制指令:件的双重条件循环控制指令: 1) LOOPE/LOOPZ 2) LOOPNE/LOOPNZ 南开大学南开大学 朱耀庭朱耀庭9.3.1 循环控制指令循环控制指令

50、v 与条件转移指令一样,循环控制指令的目标地址都是相对与条件转移指令一样,循环控制指令的目标地址都是相对于该指令本身而言的于该指令本身而言的v 而且这些指令的目标地址与该指令下一条指令的距离只能而且这些指令的目标地址与该指令下一条指令的距离只能在在-128+127字节的范围之内字节的范围之内v 它们都是短距离转移指令。它们都是短距离转移指令。 南开大学南开大学 朱耀庭朱耀庭9.3.1 循环控制指令循环控制指令1. LOOP(Loop Until Complete)v 格式:格式:LOOP label;循环计数器:循环计数器:CXv 功能:遇功能:遇LOOP指令首先使寄存器指令首先使寄存器CX减

51、减1,然后判断,然后判断CX是否为是否为0。如果。如果CX不为不为0,则转移到由标号指定处执行;,则转移到由标号指定处执行;否则,如果否则,如果CX为为0,则顺序执行,则顺序执行LOOP指令之后的指令。指令之后的指令。南开大学南开大学 朱耀庭朱耀庭9.3.1 循环控制指令循环控制指令v例例9-7 LOOP循环例。循环例。v题目:编写程序输出题目:编写程序输出26个大写英文字符。个大写英文字符。v设计思路:使用循环指令(设计思路:使用循环指令(LOOP),从),从A开始,每次开始,每次ASCII码加码加1,输出。,输出。v源程序(源程序(Ex9-7.asm)如下:)如下: .model smal

52、l .code mov cx,26 mov dl,A l1:mov ah,2 int 21h inc dl;DL加加1送送DL,产生下一个字母,产生下一个字母ASCII吗吗 loop l1;CX减减1送送CX,CX不为不为0转转L1,为,为0顺序执行顺序执行 mov ah,4ch int 21h endv程序说明:用程序说明:用LOOP实现循环前必须将循环次数送实现循环前必须将循环次数送CX。南开大学南开大学 朱耀庭朱耀庭9.3.1 循环控制指令循环控制指令2.LOOPE(Loop While Equal)/LOOPZ(Loop While Zero)v 格式:格式:LOOPE/LOOPZ l

53、abel;循环计数器:循环计数器:CXv 功能:功能:LOOPE与与LOOPZ是同一条指令的两个不同的助记是同一条指令的两个不同的助记符。遇该指令,首先使寄存器符。遇该指令,首先使寄存器CX减减1,然后判断。若,然后判断。若CX不为不为0而且而且ZF1,转移到由标号指定处执行;否则顺序,转移到由标号指定处执行;否则顺序执行执行LOOPE/LOOPZ指令之后的指令。指令之后的指令。南开大学南开大学 朱耀庭朱耀庭9.3.1 循环控制指令循环控制指令v 例例9-8 LOOPZ实例实例v 题目:已知题目:已知9个数字,找出第一个不能够被个数字,找出第一个不能够被3整除的数,并整除的数,并且显示其在数列

54、中的位置且显示其在数列中的位置v 设计思路:逐个判断每一个数是否能被设计思路:逐个判断每一个数是否能被3整除,如果不能整除,如果不能被被3整除,输出其所在位置,结束;否则继续判断下一个。整除,输出其所在位置,结束;否则继续判断下一个。例例9-8 LOOPZ实例实例 v 程序说明:程序说明:本程序中当一个数除以本程序中当一个数除以3余数不为余数不为0时时ZF=0,遇,遇LOOPZ指令跳出循环指令跳出循环 南开大学南开大学 朱耀庭朱耀庭9.3.1 循环控制指令循环控制指令3.LOOPNE(Loop While Not Equal)/LOOPNZ(Loop While Not Zero)v 格式:格

55、式:LOOPNE / LOOPNZ label;循环计数器:循环计数器:CXv 功能:功能:LOOPNE和和LOOPNZ是同一条指令的两个不同的是同一条指令的两个不同的助记符。遇该指令,首先使寄存器助记符。遇该指令,首先使寄存器CX减减1,然后判断。,然后判断。若若CX不为不为0而且而且ZF0,转移到由标号指定处执行;否则,转移到由标号指定处执行;否则,顺序执行下一条指令。顺序执行下一条指令。南开大学南开大学 朱耀庭朱耀庭9.3.1 循环控制指令循环控制指令v 例例9-9 LOOPNE / LOOPNZ实例实例 v 题目:已知题目:已知9个数字,找出第一个能够被个数字,找出第一个能够被3整除的

56、数,并且整除的数,并且显示其在数列中的位置显示其在数列中的位置v 设计思路:逐个判断每一个数是否能被设计思路:逐个判断每一个数是否能被3整除,如果能被整除,如果能被3整除,输出其所在的位置,结束;否则继续判断下一个整除,输出其所在的位置,结束;否则继续判断下一个 例例9-9 LOOPNE / LOOPNZ实例实例 v 程序说明:程序说明:本程序中一个数除以本程序中一个数除以3后,余数为后,余数为0时置时置ZF=1,遇,遇LOOPNE时跳出循环时跳出循环 南开大学南开大学 朱耀庭朱耀庭9.3.1 循环控制指令循环控制指令v 例例9-9 LOOPNE / LOOPNZ实例实例 v 注意:注意:LO

57、OPNZ是测试是测试ADD指令产生的指令产生的ZF的状态,的状态,ADD指令和指令和LOOPNZ之间的之间的MOV指令是不影响零状态标志位指令是不影响零状态标志位ZF的。而的。而INC指令执行后会影响指令执行后会影响ZF,因此不能将它放在,因此不能将它放在ADD指令和指令和LOOPNZ指令之间。指令之间。 南开大学南开大学 朱耀庭朱耀庭9.3.1 循环控制指令循环控制指令4.JCXZ(Jump if CX/ECX is Zero)v 格式:格式:JCXZlabel;CX为为0时程序转移时程序转移v 功能:功能:JCXZ指令在寄存器指令在寄存器CX等于等于0时,将控制转移到目时,将控制转移到目标

58、操作数标操作数(目标标号处目标标号处)。例如,。例如, (1)将此指令安排在循环的开端,若)将此指令安排在循环的开端,若CX的值为的值为0就越过就越过该循环该循环(即循环执行即循环执行“零遍零遍”)。 (2)将此指令安排在带条件重复前缀的串指令下面,判)将此指令安排在带条件重复前缀的串指令下面,判断是否到串末尾,使得在继续对串进行比较、搜寻时,断是否到串末尾,使得在继续对串进行比较、搜寻时,当串到末尾时能够结束循环。当串到末尾时能够结束循环。南开大学南开大学 朱耀庭朱耀庭9.3.1 循环控制指令循环控制指令v 例例9-10 JCXZ示例示例v 题目:已知题目:已知9个数字,找出所有不能够被个数

59、字,找出所有不能够被3整除的数,并且整除的数,并且显示其在数列中的位置。显示其在数列中的位置。v 设计思路:与例设计思路:与例9-8不同的是找到不能被不同的是找到不能被3整除的数后,继整除的数后,继续判断下一个,而不是终止判断。续判断下一个,而不是终止判断。例例9-10 JCXZ示例示例 v 程序说明:程序说明:循环次数仍在循环次数仍在CX中,但不是用中,但不是用LOOP循环,循环,而是每循环一次用而是每循环一次用DEC使使CX减减1,用,用JCXZ判断循环是判断循环是否结束否结束南开大学南开大学 朱耀庭朱耀庭9.3.2 单重循环单重循环循环控制循环控制 1单重循环示例单重循环示例 2南开大学

60、南开大学 朱耀庭朱耀庭1. 循环控制循环控制 v 循环的执行顺序可能是先执行程序后判断条件,或者先循环的执行顺序可能是先执行程序后判断条件,或者先判断条件后执行程序。下面首先介绍一下常见的循环设判断条件后执行程序。下面首先介绍一下常见的循环设计方法计方法: 1)C语言中的语言中的for循环循环 for(int i = 0;i 7;i+)a+;v 这个这个for语句共循环语句共循环7次,每次循环将变量次,每次循环将变量a加加1,使用汇,使用汇编语言来实现相同功能的循环如下:编语言来实现相同功能的循环如下: DATA SEGMENT a dw ? DATA ENDS CODE SEGMENT MO

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论