汇编语言程序设计-分支程序设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

5.1分支程序结构
分支结构有两路分支与多路分支结构形式.
• 两路分支(其中一种)
• 多路分支

条件 F

T
程序段
条件
程序段1 程序段2
程序段n
5.2 无条件转移指令
JMP指令对标志位无影响.
1.段内直接短转移指令:JMP SHORT PTR 标号(IP=IP+8位位 移量)
2.段内直接转移:JMP NEAR PTR 标号(IP=IP+16位位移量) 3.段内间接转移:JMP WORD PTR 寄存器或内存单元(IP为 其确定) 4.段间直接转移:JMP FAR PTR 标号.标号的偏移地址送IP,段 首址送CS 5.段间间接转移:JMP DWORD PTR 存储器.内存中高字送 CS,低字送IP
• Y MAX<AX
• CMP MAX,AX • JL L1
M• AX AX N
• L0:MOV AX,Z • CMP MAX,AX;

JL L2
AX Z

JMP LL
• L1:MOV MAX,AX

Y
MAX<AX

JMP L0

N
MAX AX
• L2:MOV MAX,AX • LL:MOV AH,4CH
第5章 分支程序设计
• 根据不同条件改变程序的执行流程.指令系统提 供了转移控制、循环控制、过程调用、中断处 理四组控制程序流程指令。
• 转移控制指令用于根据条件,选择执行下步的 操作,即将程序的执行流程转移到指定位置。
• 即通过标志位的不同状态反应位置通过标号描 述,转移通过将目的地址传送给IP和CS实现。
• 【例2.53】比较无符号数大小,将较大的数 存放AX寄存器。
• CMP AX, BX;(AX)-(BX) • JNB NEXT;若AX>=BX,转移到NEXT • XCHG AX,BX;若AX<BX,交换 • NEXT:…
• 3. 有符号数条件转移指令
表2.3 有符号数条件转移指令
• 【例2.54】比较有符号数大小,将较大的数 存放在AX寄存器。
转移. • JMP虽必不可少,但能不用就不用,或尽量少用.
5.5分支程序设计举例
• 主要解决三个问题: 一是转移指令选择,二是选择条件设计(关键),三是分支处理设 计.
• 例:将三个符号数的最大者送入MAX字单元.
开始
AX X

T
X>Y
• X>Z
F
•T
AX Z
F
F
AX Y Y>Z

T
MAX AX
结束
MOV AH,0
ADD AL,AL;
MOV BX,OFFSET JTAB;得到跳转表首地址.
ADD AX,.[BX];相应分支入口偏移地址送AX
JMP AX;转相应分支处理
MESS0:MOV DX,OFFSET MESSAGE0;显示MESSAGE0内容

MOV AH,9

INT 21H

JMP DONE

MOV AH,9

INT 21H

JMP DONE
• MESS2:MOV DX,OFFSET MESSAGE2

MOV AH,9

INT 21H
• DONE:MOV AH,4CH

INT 21H
• CODE ENDS

END START
• 若功能对应的参数值不是0~2,而是1~3,应该如何做?
对分支程序设计归纳如下:
JMP DONE ZERO:MOV AL,0 DONE:MOV Y,AL
RET MAIN ENDP CODE ENDS END MAIN
AL X
AL=0
Y
AL 0
N
AL<0
Y
AL -1
N
AL 1
Y AL
2.跳转表法
• 其核心思想:在内存中开辟一片连续存储单元为跳转表,表中顺序存放着进入各个分 支处理程序的转移地址或转移指令.需进入某分支处理程序,只需查找跳转表中对应 分支的地址或指令相应位置即可.分为以下两种:
• (1)地址跳转表法:跳转表存放各个分支的转移地址,可通过DW伪指令来定义.
• 举例:完成三种功能,每种功能对应一个参数值(0~2),输出一字符串.对给定参数,输出 相应信息.
• 元素地址=表首地址+给定参数*2
• JTAB

MESS0
• JTAB+2

MESS1
• JTAB+4
• ……
MESS2
DL AL
JZ DONE CMP AL,’A’
JB ERR
结束
CMP AL,’Z’ JA ERR
ADD AL,20H
MOV DL,AL

MOV AH,2

INT 21H

JMP LLL;继续输入
• ERR:MOV DX,OFFSET ERRMESS

MOV AH,9

INT 21H

JMP LLL;继续输入
• BEGIN:MOV AX,DATA

MOV DS,AX

MOV AX,X

CMP AX,Y;X>Y?

JG XGZ

MOV AX,Y

CMP AX,Z

JG NEXT
• ZTOAX:MOV AX,Z

JMP NEXT
• XGZ:CMP AX,Z

JNG ZTOAX
• NEXT:MOV MAX,AX
• N DB ?;
• DATA ENDS
• STACK SEGMENT STACK

DB 100 DUP(?)
• STACK ENDS
• CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK
• START:MOV AX,DATA

MOV DS,AX

MOV AL,N
• MESSAGE0 DB ‘DATA SEGMENT!’,’$’
• MESSAGE1 DB ‘STACK SEGMENT!’,’$’
• MESSAGE2 DB ‘CODE SEGMENT!’,’$’
• N DB ?;功能参数 (0~2中之一)
• DATA ENDS
• STACK SEGMENT STACK

DBiblioteka Baidu 100 DUP(?)
• STACK ENDS
• CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK
• START:MOV AX,DATA

MOV DS,AX

MOV AL,N

MOV AH,0

MOV BL,AL

ADD AL,AL;N*2

ADD AL,BL;N*3

MOV BX,OFFSET JTAB

ADD BX,AX

JMP BX
• JTAB:JMP MESS0

JMP MESS1

JMP MESS2
• MESS0:MOV DX,OFFSET MESSAGE0

MOV AH,9

INT 21H

JMP DONE
• MESS1:MOV DX,OFFSET MESSAGE1
• 程序如下:
• DATA SEGMENT
• X DW 1234H
• Y DW 4321H
• Z DW 3421H
• MAX DW ?
• DATA ENDS
• STACK SEGMENT STACK

DB 100 DUP(?)
• STACK ENDS
• CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK
•Y
AL=‘#’
STACK ENDS CODE SEGMENT

AL≥’A’ N
ASSUME CS:CODE,DS:DATA,SS:STACK
START:MOV AX,DATA
• •
N
AL≤’Z’
MOV DS,AX LLL:MOV AH,1
AL AL+20H ERR
INT 21H CMP AL,’#’
• MESS0 • MESS1 • MESS2 • 程序如下: • DATA SEGMENT • JTAB DW MESS0,MESS1,MESS2;建立地址跳表
• MESSAGE0 DB ‘DATA SEGMENT!’.’$’
• MESSAGE1 DB ‘STACK SEGMENT!’,’$’
• MESSAGE2 DB ‘CODE SEGMENT!’,’$’



JMP DONE;段内直接转标号DONE
• NEXT:….
• ….
• DONE:RET
•.
• 5.4.2多路分支程序设计方法 • (1)组合条件法

1 X>0
• Y= 0 X=0

-1 X<0
• DATA SEGMENT

X DB ?

Y DB ?
• DATA ENDS
• STACK SEGMENT STACK
• DONE:MOV AH,4CH

MOV AH,4CH

INT 21H
• CODE ENDS

END BEGIN
另一方法:先假定第1个数是最大值,将第2,3…个数依次与最大值进行 比较,如比当前最大值还大是新的最大值;所有数比较完,最大值求出.
开始 MAX X,AX Y
• 修改上题画划线部分其它地方不变. • MOV MAX,AX • MOV AX,Y

CMP AX,BX;(AX)-(BX)

JNL NEXT;若AX>=BX,转移到NEXT

XCHG AX,BX ;若AX<BX,交换
• NEXT:…
返回本节
4.CX条件转移指令
• CX为零转移指令JCXZ • JCXZ 标号 • 等价于: • CMP CX,0 • JZ 短标号
5.4分支程序设计方法
• 5.4.1两路分支:通过算术运算指令和移位指令的运算结果影响标志寄存器 的状态标志位,如ZF,CF,OF,SF等(测试),再用逻辑运算指令(AND,TEST)测 试,然后由结果确定转移方向(标号).举例:

MOV AX,X;

OR AX,AX;AX置0,影响标志位,准备转移条件.

JZ NEXT;ZF=1转移到标号NEXT处执行

MESS1:MOV DX,OFFSET MESSAGE1;显示MESSAGE1内容

MOV AH,9

INT 21H

JMP DONE

MESS2:MOV DX,OFFSET MESSAGE2;

MOV AH,9

INT 21H

DONE: MOV AH,4CH;返回DOS

INT 21H

CODE ENDS

ENDS START
• 若功能对应的参数值不是0~2,而是1~3,则程序在计算跳转表中位置时,应将参数先 减1,然后再乘2.元素地址=表首地址+(给定参数-1)*2;在MOV AH,0与ADD AL,AL之 间插入DEC AL(减1).其它不变.
• (2)指令跳转表法
• 跳转表直接存放各个分支处理的转移指令,跳转表在代码段中定义.而JMP指令占用 3个字节,则在计算跳转表中位置时对应参数需乘以3才能得到转移指令.
• 举例:跳转表存放的是转移指令,求出跳转表中位置后直接转去执行跳转表地址内的 指令,即可实现多路多分支处理.
• JTAB:JMP MESS0

JMP MESS1

JMP MESS2
• 元素地址=表首地址+给定参数*3
• JTAB

JMP MESS0(其它也相同)
• 程序:
• DATA SEGMENT
• (1)选择合适的转移指令,否则可能不能转移到预定的程序分支 • (2)必须为每个分支安排出口,否则将导致程序运行混乱. • (3)应把各分支中的公共部分尽可能集中到分支前或后的程序段中 • (4)程序中分支出现顺序必须与流程图中一致,也尽量与问题中一致. • (5)在调试程序时,应尽可能对每个分支进行测试. • (6)无条件转移指令的转移范围不受限制,条件转移指令只能在-128~127字节范围内

DB 100 DUP(?)
• STACK ENDS
• CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK
• MAIN PROC FAR
– PUSH DS
– MOV AX,0
– PUSH AX
– MOV AX,DATA – MOV DS,AX – MOV AL,X – CMP AL,0 – JZ ZERO;0时转ZERO – JS NEGL;为负时转NEGL – MOV AL,1;为正时等于1 – JMP DONE NEGL:MOV AL,0FFH;为负时等于-1
返回本节
5.3 条件转移指令
• 1.简单条件转移指令 • 2.无符号数条件转移指令 • 3. 有符号数条件转移指令 • 它们都有通用的语句格式和功能。 • 语句格式:[ 标号:] 操作符 短标号 • 功能:如果条件满足,则(IP)+位移
量→IP。
1.简单条件转移指令
2.无符号数条件转移指令
• 表5.2 无符号数条件转移指令
显示

INT 21H
结束
编写程序:将(01号功能调用)输入的大写字母转换为小写字母(02号功
能调用输出).用09号功能显示出错信息.将大写转换小写,只需将其加
上20H.
DATA SEGMENT

开始
ERRMESS DB ‘ERROR!’,’$’ DATA ENDS
输入AL
STACK SEGMENT STACK DB 100 DUP(?)
相关文档
最新文档