汇编--学习笔记(十)-分支程序

来源:互联网 发布:江苏运时数据招聘 编辑:程序博客网 时间:2024/05/20 05:54

 分支程序无论是在高级语言中还是在汇编语言中都是应用最广泛的,也是最基本的程序结构。在汇编语言里进行分支程序设计中,测试某些条件时经常用到的是比较指令(CMP)、条件转移指令和无条件转移指令(JMP)。

一、标号

1、概念:标号用来说明可执行指令在汇编语言中的位置。另外,在汇编语言中,过程名亦可以视为标号。
2、作用:标号可以作为转移指令(或调用指令CALL)的操作数。
3、属性:和变量类似,标号有三种属性:

  • :(SEGMENT)在哪个段定义标号;
  • 位移量:(OFFSET)在什么位置上定义的标号; 标号只要有了定义,前两个属性就自然产生。
  • 距离:(DISTANCE)分为NEAR(近)和FAR(远) 2种。标号的距离属性需要在定义标号时指出。

4、NEAR
 如果以标号只能在本段中(即标号所定义的段中)用JMP或条件转移指令(或CALL)进行访问,那么必须将这个标号的距离属性定义为NEAR。

5、FAR
 如果一个标号能为其它段中的JMP(或CALL)的指令来访问,那么必须将这个标号属性定义为FAR。

NEAR标号的定义
1、隐含说明:距离属性为NEAR的标号可以用隐含的说明,即:在标号后面加上冒号,放在指令前面
例如:

L1: MOV AX,BXLOOP:   ADD AX,100@:  SUB AX,BX

 L1、LOOP和@都是标号名(标识符),标号L1、LOOP和@的距离属性均为NEAR。
FAR标号的定义
 距离属性为FAR的标号没有隐式的说明,只能用显式说明,即只能用LABEL伪指令明显地说明,或在EQU伪指令中用THIS操作符明显地指明。
1、用LABEL
例如:

L4  LABEL FAR    MOV AX,DX

2、在EQU伪指令中用THIS操作符明显地指明
例如:

L5  EQU THIS FAR    OR AL,30H

 标号L4和L5的距离属性均为FAR。

标号操作符
1、SEG –取段地址

  • 格式:SEG 标号名
  • 功能:返回标号所在段的基址
  • 举例:MOV AX,SEG L2 ;将标号L2所在段的基址送至AX

2、OFFSET –取位移量

  • 格式:OFFSET 标号名
  • 功能:返回标号所在段的位移量
  • 举例:MOV BX,OFFSET L2 ;将标号L2所在段的位移量送至BX

3、TYPE –取距离属性

  • 格式:TYPE 标号名
  • 功能:返回的是标号的距离属性NEAR或FAR。

二、无条件转移指令

1、指令的执行顺序:指令的执行顺序有代码段寄存器(CS)和指令指针寄存器(IP)的内容决定。
2、CS:CS寄存器中存放有当前代码段的基地址。当前代码段就是正在从中取出指令(代码)的存储器部分,其容量可达64K字节。
3、IP:IP中内容为要执行的下一条指令距当前代码段基地址的位移量(偏移地址)。
4、下一条指令地址:CS和IP结合((CS)*16+(IP)),指向将从中取出下一条指令的存储单元。
5、指令执行的过程:在大多数工作状态下,要执行的下一条指令已从存储器中取出,并放在CPU的指令队列中等待执行。
6、转移指令的作用:转移指令对指令指针寄存器IP或代码段寄存器CS起作用改变这些寄存器的内容一般就会改变正常的执行顺序。当程序发生转移时,指令队列中就不再有接下来要执行的指令。总线接口单元将利用新的IP和CS值从存储器中取得下一条指令,直接把该指令传送给执行单元;然后开始从新的指令存储单元中取指令,重新补充指令队列。
7、转移指令分类,分4组:

  • (1)无条件转移指令
  • (2)条件转移指令
  • (3)迭代(循环)控制指令
  • (4)中断指令
     这些指令中,只有中断指令会影响CPU的标志,其他的都不会影响状态标志,而很多转移指令的执行过程都会受标志状态的影响。

一、JMP—无条件转移指令(C语言goto)
1、格式:JMP 目的操作数
2、功能:无条件地控制转移至目标单元(目的操作数)。
3、说明:

  • (1)JMP指令只有一个操作数,用来指定程序应当在哪里继续下去(这个值也称为转移目标)。在JMP指令里,定义操作数的各种寻址方式比通常的指令还复杂。
  • (2)JMP指令可以进行段内转移。也可以进行段间转移,即从一个代码段转移到另一个代码段的某一个位置继续运行。
  • (3)JMP指令有直接和间接两个基本类型的寻址方式。

二、JMP指令的具体格式
1、段内(或组内)直接转移
(1)格式:JMP 标号名 ;标号为NEAR属性
(2)说明:

  • 1)目的操作数是一个标号,这个标号时在本段内(或本组内)某一个指令的前面,后面缀以冒号来定义器位置的(位移量)。
  • 2)汇编程序计算出JMP指令的下一条指令和转移目标的地址(标号的位移量)之间的相对位移量。因为JMP指令可以向前转移也可以向后转移,所以这个相对位移量有正有负,故总是解释为有符号的二进制补码数(带符号二进制数)。
  • 3)汇编程序将这个相对位移量加到指令指针寄存器IP中去,从而改变IP的内容,实现程序的转移。

(3)举例:

JMP  L1  ;向前转移到L1(相对位移量为正)......L2: AND DL,0FH  ;L2在此定义L1: MOV AL,100  ;L1在此定义     JMP L2      ;向后转移到L2(相对位移量为负)

 其中相对位移量的范围在-32K~+32K。如果相对位移量为一个字节所能表示的范围-128~+127,那么可以用短(SHORT)转移

2、段内直接短转移
3、段内间接转移
4、段间直接转移
(1)格式:JMP 标号 ;标号为FAR属性
(2)说明:
 在这个格式下,汇编程序生成2个字的操作数(双字指示器)。JMP指令执行的操作是用第一个字,即目标标号在其所在的段中的位移量去替换IP的内容,用第二个字,即目标标号所在的代码段的段基址代替源CS的内容,以实现其转移。例如:

CODE1 SEGMENT    JMP FARL   ;FARL标号在CODE2段的位移量=>IP,CODE2段基址=>CS ......CODE1 ENDSCODE2 SEGMENT      FARL LABEL FAR......CODE2 ENDS

5、段间间接转移


三、条件转移指令

一、CMP指令(比较指令)
1、格式:CMP 目的操作数,源操作数
2、功能:
 CMP


四、分支程序举例

原创粉丝点击