汇编语言程序设计-分支程序设计
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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(?)