资源预览内容
第1页 / 共76页
第2页 / 共76页
第3页 / 共76页
第4页 / 共76页
第5页 / 共76页
第6页 / 共76页
第7页 / 共76页
第8页 / 共76页
第9页 / 共76页
第10页 / 共76页
亲,该文档总共76页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
汇编语言程序设计-朱耀庭,第9章 分支程序与循环程序设计,直接程序、分支程序、循环程序、过程和中断处理程序是汇编语言的基本程序结构。 本章将重点学习分支程序和循环程序。 希望同学们通过本章的学习,掌握汇编语言的这两种程序设计方法,并且能够深入了解它们与相应高级语言程序设计方法的区别,南开大学 朱耀庭,第9章 分支程序与循环程序设计,9.3 循环程序设计,9.2 程序设计流程图,9.1 分支,南开大学 朱耀庭,9.1 分支,本节将介绍 (1)标号的定义 (2)无条件转移指令(JMP)的各种寻址方式的使用 (3)各种条件转移指令如何根据标志寄存器的状态判断是否转移 (4)并结合程序实例说明如何编写分支程序。,南开大学 朱耀庭,9.1 分支,标号,无条件转移指令,9.1.1,9.1.2,9.1.3,条件转移,南开大学 朱耀庭,9.1.1 标号,标号用来说明可执行指令在汇编语言程序中的位置。标号可以作为转移指令的操作数,转移指令包括条件转移、无条件转移(JMP)以及过程调用指令(CALL)。 与变量类似,标号有段(SEGMENT)、位移量(OFFSET)和距离(DISTANCE)三种属性。段和位移量属性指明标号位于哪个段和其在段中的偏移位置。标号一旦定义,这两个属性就自然产生。如果访问标号的转移指令和定义的标号同属程序的一个段,这时实现转移不需要修改代码段寄存器CS,仅仅需要修改IP。这种情况下就将这个标号的距离属性定义为NEAR。NEAR属性意味着段内转移。如果一个标号被其他段中的转移指令JMP或CALL指令访问,那么实现转移就不仅仅是修改IP的问题,还必须同时修改CS使其指向标号所在的段。这种情况下,标号的距离属性应该定义为FAR,而不是NEAR。NEAR属性的标号,当其与转移指令的地址距离能够用一个字节表示时(即范围在-128到127之间),称这种转移为短(SHORT)转移。标号的属性需要在定义标号时指出。,南开大学 朱耀庭,9.1.1 标号,南开大学 朱耀庭,1. 标号的定义,1) 标号的隐含说明 定义距离属性为NEAR的标号,可以使用隐含的说明。隐含说明也称缺省定义,即在需要定义标号的指令前写一个标识符,再在标识符后面加上冒号,这个标识符就是操作标号。 例如: L1:MOV AX, BX :ADD AX,100其中L1和都是标号标识符,简称标号,标号L1和的距离属性均为NEAR。 注意:标号和变量命名规则一样不允许使用汇编语言的保留字作为标号的标识符。,南开大学 朱耀庭,1. 标号的定义,2) 用EQU伪指令定义标号 标号的另外一种定义方法是使用EQU伪指令显式地定义。 例如: L2 EQU THIS NEAR AND AX,0FFH L3 EQU THIS FAR OR AL,30H 其中标号L2为NEAR标号,标号L3为FAR标号,可见使用EQU伪指令既可以定义NEAR标号,也可以定义FAR标号。但对于NEAR属性的标号一般不使用这样的显式地说明,而是使用前面的隐式说明更为方便。,南开大学 朱耀庭,1. 标号的定义,3)用LABEL伪指令定义标号 标号的第三种定义方法是使用LABEL伪指令显式地定义。 例如: L4 LABEL NEAR MOV AX,DX L5 LABEL FAR AND AL,30H 其中标号L4为NEAR标号,标号L5为FAR标号,可见使用LABEL伪指令与EQU一样,既可以定义NEAR标号,也可以定义FAR标号。但对于NEAR属性的标号一般也不使用这样的显式地说明,而是使用前面的隐式说明更为方便。 注意:使用EQU伪指令和LABEL伪指令所不同的是,前者在EQU与属性NEAR或FAR之间必须加THIS操作符定义,而后者则不需要。无论EQU还是LABEL它们都既可以定义FAR标号也可以定义NEAR标号。,南开大学 朱耀庭,1. 标号的定义,4)同一位置定义两个距离属性不同的标号 程序中的同一位置定义两个距离属性不同的标号,可以提高访问标号的灵活性。 例如: L6 LABEL FAR L7: XOR AX,0F0FH 其中,标号L6和标号L7的段属性和位移量属性是一样的;而距离属性不同,L6为FAR,L7为NEAR。其他段的JMP指令转移到此处时,用L6作为JMP指令的远转移操作数(目标地址);而本段的JMP指令或条件转移指令转移到此处时,用L7作为转移指令的操作数。在EQU伪指令中用THIS操作符同样可以给L7处定义另一标号名称,此标号距离属性被指明为FAR,用以提高访问标号的灵活性。,南开大学 朱耀庭,1. 标号的定义,4)同一位置定义两个距离属性不同的标号 例如: 上面的伪指令和指令等价于: L6 EQU THIS FAR L7: XOR AX,0F0FH,南开大学 朱耀庭,2. 取标号属性操作符,与取变量的属性操作一样,必要时允许对标号进行取属性操作,返回该标号的相应属性。 1)取标号段属性 格式:SEG 标号名 功能:返回标号所在段的基址。 例如: MOV AX,SEG L2;将标号L2所在段的基址送至AX,南开大学 朱耀庭,2. 取标号属性操作符,2)取标号位移属性 格式:OFFSET 标号名 功能:返回标号所在段的位移量。 例如: MOV BX,OFFSET L2;将标号L2相对于 所在段段首的位移量送至BX 3)取标号类型属性 格式:TYPE 标号名 功能:返回的是标号的属性NEAR或FAR。,南开大学 朱耀庭,9.1.2 无条件转移指令,80X86汇编语言程序中指令的执行顺序由代码段寄存器CS和指令指针寄存器IP的内容决定。CS寄存器中存放有当前代码段的基地址,当前代码段就是正在从中取出代码指令的存储器部分,段内容量可达64K字节。IP的内容为要执行的下一条指令距当前代码段段首的位移量,即偏移地址。CS和IP相结合(CS)*16(IP),指向从中取出下一条指令的存储单元地址。在大多数工作状态下,要执行的下一条指令已从存储器中取出,并放在CPU中总线接口单元BIU的指令队列中等待执行。转移指令对指令指针寄存器IP及代码段寄存器CS起作用,改变这些寄存器的内容就会改变正常的执行顺序。当程序发生转移时,指令队列中就不再有接下来要执行的指令。,南开大学 朱耀庭,9.1.2 无条件转移指令,总线接口单元将利用新的IP和CS值从存储器中取得下一条指令,直接把该指令传送给执行单元;然后开始从新的指令存储单元中取指令,重新补充指令队列。 80X86有四组控制程序转移的指令: (1)即无条件转移指令 (2)条件转移指令 (3)循环控制指令 (4)中断指令。,南开大学 朱耀庭,9.1.2 无条件转移指令,无条件转移指令的格式和功能如下: 格式:JMP 目标操作数 其中目标操作数可以是标号,可以是寄存器,可以是内存操作数。当目标操作数为标号时,显然是转移到标号所在位置执行。当目标操作数为16位通用寄存器时,则用该通用寄存器内容修改IP,CS不变,实现段内转移。当目标操作数为内存操作数时,如果该内存操作数为字变量,则由该变量的值修改IP后实现段内转移;如果该内存操作数为双字变量,则由该变量的值同时修改CS和IP的值,实现段间转移。,南开大学 朱耀庭,9.1.2 无条件转移指令,无条件转移指令的格式和功能如下: 功能:JMP指令无条件地将控制转移至由目标操作数所指定的位置执行。 一般情况下,汇编系统会将段内的转移视为近转移,偏移量会用一个字来表示,即生成三个字节的指令代码。当程序员知道其转移为短转移时,可以采用JMP SHORT标号的方式告诉汇编系统只生成两个字节的短转移代码指令即可。,南开大学 朱耀庭,9.1.2 无条件转移指令,JMP有多种转移方式 :,南开大学 朱耀庭,1段内直接短转移,格式:JMP SHORT 标号名 功能:如果转移发生在同一段中-128+127字节的范围内,无论目标标号在本转移指令之前还是之后定义,此时可以在JMP指令中的目标标号前面加一个SHORT操作符,以实现短转移,短转移指令的直接位移量仅占一个字节,这种情况下汇编程序会将其汇编为一个双字节的短转移指令。,南开大学 朱耀庭,2段内直接近转移或隐含的段内短转移,格式:JMP 标号名 其中,标号为NEAR属性 功能:在标号为NEAR属性时,如果标号定义出现在该JMP指令之前,则与前面的JMP SHORT格式一样,隐含地将其汇编为一个双字节的短转移指令;反之如果该JMP指令在前,而所定义的标号在JMP指令之后,则汇编程序将本转移指令汇编为3字节的段内近转移指令。 详见例9-1、例9-2,例9-1 段内直接短转移,例9-1 清单文件,注意:清单中用黑体字标出了双字节短转移指令,南开大学 朱耀庭,2段内直接近转移或隐含的段内短转移,注意:清单中用黑体字标出了三字节近转移指令和双字节短转移指令。近转移可以在段内也可以在逻辑段的组内实现。,例9-2 NEAR转移或隐含的SHORT转移,例9-2 清单文件,南开大学 朱耀庭,3段间直接转移,格式:JMP 标号 其中,标号为FAR属性 功能:汇编程序根据远标号生成一个双字指针,指向标号所在的段和位移,并且将标号所在的段地址和位移分别送CS和IP以实现跨代码段的转移。,例9-3 段间直接转移,程序说明:本程序含有两个代码段,代码段code1中定义了远标号l1,程序由代码段code2的begin标号开始执行,输出字母o之后,无条件转移到代码段code1中的远标号l1执行,输出字符K后程序结束。,南开大学 朱耀庭,4寄存器段内间接转移,格式:JMP 16位通用寄存器 功能:CS不变,通用寄存器的内容送IP,实现段内转移。 一个通用寄存器(16位),它的内容是JMP的转移目标在当前CS寻址的段中的位移量。 例如: JMP BX ;把控制转向CS:BX JMP SI ;把控制转向CS:SI JMP BP ;把控制转向CS:BP,例9-4寄存器段内间接转移,南开大学 朱耀庭,4寄存器段内间接转移,程序说明:本程序从第一个可执行语句开始执行,首先从键盘读入一个字符,如果是小写字母y,输出字母o;否则程序结束。 其中预先将标号l1的位移送入bp,然后判断输入的是字母y吗?若是则转l3将BP送IP转l1,输出o结束;若不是则将l2标号位移送bp,然后遇jmp bp,将bp送IP,转l2结束程序。,南开大学 朱耀庭,5存储器段内间接转移,格式:JMP 存储器字变量 功能:CS不变,存储器字变量内容送IP,实现段内转移。 例如,在数据段中定义: NEAR_LABEL_ARRAY DW L1 DW L2 DW L3,南开大学 朱耀庭,5存储器段内间接转移,在代码段中定义: MOV D1,0 JMP NEAR_LABEL_ARRAYDI ;转移到L1处 MOV DI,4 JMP NEAR_LABEL_ARRAYDI ;转移到L3处 ,南开大学 朱耀庭,5存储器段内间接转移,用字存储器作为段内间接转移的目标地址时,可以有类似存储器数据的各种寻址方式。 例如: JMP VAR-WORD ;直接寻址方式 JMP WORD PTRBX ;间接寻址方式 JMP WORD PTRBX2 ;基址位移 JMP WORD PTRBXSI4 ;基址变址位移,南开大学 朱耀庭,5存储器段内间接转移,例9-5 存储器间接转移示例。 题目:编写程序,从键盘输入0到7的数字符号,分别对应输出A到H。要求用寄存器间接转移实现 设计思路:输入的数字符号0到7对应一个字节的8位,输入几,该字节中的第几位置1,然后根据哪一位为1再转到8个不同的标号处,实现输出。,例9-5 存储器间接转移示例,南开大学 朱耀庭,5存储器段内
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号