-
2018-09-21 20:57:54
上机实验06 分支程序设计
知识提要:
本章主要对分支程序加以介绍,其知识要点:
1.无条件转移指令JMP
无条件转移指令JMP是使程序无条件转移至目标处,又分为段内转移、段间转移。
2.条件转移指令JXX
条件转移指令可分为三大类:
1.简单条件转移指令。根据单个标志位的状态判断转移条件。
标志位
指令
转移条件
意义
CF
JC
CF=1
有进位/借位
JNC
CF=0
无进位/借位
ZF
JE/JZ
ZF=1
相等/等于0
JNE/JNZ
ZF=0
不相等/不等于0
SF
JS
SF=1
是负数
JNS
SF=0
是正数
OF
JO
OF=1
有溢出
JNO
OF=0
无溢出
PF
JP/JPE
PF=1
有偶数个1
JNP/JPO
PF=0
有奇数个1
2.无符号数条件转移指令。
假设在条件转移指令前使用比较指令,比较两个无符号数A,B,指令进行的的操作是A-B,其转移指令如下:
指令
转移条件
意义
JA/JNBE
CF=0 AND ZF=0
A>B
JAE/JNB
CF=0 OR ZF=1
A>=B
JB/JNAE
CF=1 AND ZF=0
A<B
JBE/JNA
CF=1 OR ZF=1
A<=B
3.带符号数条件转移指令。
指令
转移条件
意义
JG/JNLE
SF=OF AND ZF=0
A>B
JGE/JNL
SF=OF OR ZF=1
A>=B
JL/JNGE
SF OF AND ZF=0
A<B
JLE/JNG
SF OF OR ZF=1
A<=B
一、实验要求和目的
1.熟悉汇编语言程序设计结构;
2.熟悉汇编语言分支程序基本指令的使用方法;
3.掌握利用汇编语言实现单分支、双分支、多分支的程序设计方法。
二、软硬件环境
1.硬件环境:微机CPU 486以上,500MB以上硬盘,32M以上内存;
2.软件环境:装有MASM 5.0、DEBUG、LINK和EDIT等应用程序。
三、实验涉及的主要知识单元
在实际应用中,经常根据一些条件来选择一条分支执行。汇编语言的条件判断主要是通过状态寄存器中的状态位、无符号数相减或有符号和相减而导致的结果来进行。下面就有符号数转移指令来了解在汇编语言程序设计方法。
如:判断方程AX2+BX+C=0是否有实根。若有实根,则将字节变量TAG置1,否则置0。假设A、B、C均为字节变量,数据范围为-128~127。
分析:二元一次方程有根的条件是B2-4*A*C>=0。依据题意,先计算出B2和4*A*C,然后比较两者大小,根据比较结果给TAG赋不同的值。
请分析并理解下面程序:
Data segment
A db 7
B db 8
C db 6
Tag db ?
Data ends
Code segment
Assume ds:data,cs:code
Start:
Mov ax,data
Mov ds,ax
Mov al,b
Imul al;乘法指令,求出B2的值并放入AX中
Mov bx,ax
Mov al,a
Imul c
Mov cx,4
Imul cx
Cmp bx,ax
Jge yes
Mov tag ,0
Jmp done
Yes: mov tag,1
Done: mov ah,4ch
Int 21h
Code Ends
End start
四、实验内容与步骤
1、实验内容
录入并调试完成教材P355例9-2,例9-3,和P358例9-5,掌握8086汇编跳转指令的使用。
9-2
9-3
9-5
运行结果:
2、把调试完成后的例9-2,例9-3,例9-5提交。
更多相关内容 -
masm汇编语言上机实验-分支程序设计
2017-04-30 14:35:54masm汇编语言上机实验-分支程序设计 -
分支程序设计实验
2012-05-16 11:46:45实验三 分支程序设计实验 1.实验目的 (1)掌握分支程序的设计方法。 (2)掌握利用DEBUG修改参数、检查结果的方法。 (3)掌握汇编语言源程序的编辑、汇编、连接及调试过程。 2.实验内容 (1)编一程序,显示AL寄存器中的两... -
分支程序设计if语句用法
2013-09-16 15:55:52分支程序设计if语句用法 主要是上课的课件,供大家分享。 -
汇编 分支程序设计
2020-05-27 11:50:47汇编之分支程序设计 1. 条件转移指令 1.1 无条件转移指令 格式:JMP label 功能:JMP 指令无条件跳转到目标地址,该地址用代码标号(label)来标识,并被汇编器转换为偏移量。 说明:当 CPU 执行一个无条件转移时,...文章目录
汇编 分支程序设计
一、与分支有关的指令
1.1 无条件转移指令
- 格式:
JMP label
- 功能:JMP 指令无条件跳转到目标地址,该地址用代码标号(label)来标识,并被汇编器转换为偏移量。
- 说明:当 CPU 执行一个无条件转移时,目标地址的偏移量被送入指令指针寄存器,从而导致迈从新地址开始继续执行。
1.2 条件转移指令
- 格式:
Jcc label
- 功能:指定的条件cc如果成立,程序转移到由标号label指定的目标地址去执行指令;条件不成立,则程序将顺序执行下一条指令。
- 说明:
(1)操作数label是采用段内短转移;
(2)Jcc指令不影响标志,但要利用标志。 - Jcc指令的分类:根据利用的标志位不同,16条指令分成3种情况。
(1)判断单个标志位状态
(2)比较无符号数高低
(3)比较有符号数大小
1.2.1 判断单个标志位状态
这组指令单独判断5个状态标志之一:
-
JZ/JE和JNZ/JNE:利用零标志ZF,判断结果是否为零(或相等)。 JZ/JE表示结果为零(或相等),则转移。
-
JS和JNS:利用符号标志SF,判断结果是正是负, JS表示结果为负则转移。
-
JO和JNO:利用溢出标志OF,判断结果是否产生溢出, JO表示溢出则转移。
-
JP/JPE和JNP/JPO:利用奇偶标志PF,判断结果中“1”的个数是偶是奇。JP表示偶个数个1。
-
JC和JNC:利用进位标志CF,判断结果是否进位或借位。进位或借位为1则转移。
助记符 说明 标志位/寄存器 助记符 说明 标志位/寄存器 JZ 为零跳转 ZF=1 JNO 无溢出跳转 OF=0 JNZ 非零跳转 ZF=0 JS 有符号跳转 SF=1 JC 进位跳转 CF=1 JNS 无符号跳转 SF=0 JNC 无进位跳转 CF=0 JP 偶校验跳转 PF=1 JO 溢出跳转 OF=1 JNP 奇校验跳转 PF=0 1.2.2 比较无符号数高低
无符号数高低有4种关系:
- 高于(不低于等于):JA 和JNBE
- 高于等于(不低于):JAE 和JNB
- 低于(不高于等于):JB和JNAE
- 低于等于(不高于):JBE和JNA
助记符 说明 助记符 说明 JA 大于跳转(若 leftOp > rightOp) JB 小于跳转(若 leftOp < rightOp) JNBE 不小于或等于跳转(与 JA 相同) JNAE 不大于或等于跳转(与 JB 相同) JAE 大于或等于跳转(若 leftOp ≥ rightOp) JBE 小于或等于跳转(若 leftOp ≤ rightOp) JNB 不小于跳转(与 JAE 相同) JNA 不大于跳转(与 JBE 相同) 1.2.3 比较有符号数大小
两数的大小分成4种关系:
- 大于(不小于等于):JG和JNLE
- 大于等于(不小于):JGE和JNL
- 小于(不大于等于):JL和JNGE
- 小于等于(不大于):JLE和JNG
助记符 说明 助记符 说明 JG 大于跳转(若 leftOp > rightOp) JL 小于跳转(若 leftOp < rightOp) JNLE 不小于或等于跳转(与 JG 相同) JNGE 不大于或等于跳转(与 JL 相同) JGE 大于或等于跳转(若 leftOp ≥ rightOp) JLE 小于或等于跳转(若 leftOp ≤ rightOp) JNL 不小于跳转(与 JGE 相同) JNG 不大于跳转(与 JLE 相同) 二、分支的概念
- 分支程序根据条件是真或假决定执行与否,判断的条件是各种指令,如CMP、TEST等执行后形成的状态标志与条件转移指令Jcc联合可以实现分支控制。
1.1 单重分支
- 条件成立跳转到标号所在的指令执行,否则顺序执行分支语句体。
- 注意:选择正确的条件转移指令和转移目标地址。
- 举例:编程求|X-Y|,结果存于RESULT单元中,设X和Y都为16位数。
DATA SEGMENT X DW -10 Y DW 20 RESULT DW? 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 AX,X SUB AX,Y JNS NONNEG NEG AX NONNEG: MOV RESULT,AX MOV AH,4CH INT 21H CODE ENDS END START
2.2 双分支
- 条件成立跳转执行第2个分支语句体,否则顺序执行第1个分支语句体。
- 注意第1个分支体后一定要有一个JMP指令跳到第2个分支体后。
- 举例:编写计算下面函数值的程序:设输入数据为X、输出数据Y,且皆为字节变量。
{ Y = 1 , X > = 0 ; Y = − 1 , X < 0 ; \begin{cases} Y=1,X>=0;\\ Y=-1,X<0; \end{cases} {Y=1,X>=0;Y=−1,X<0;DATA SEGMENT X DB -10 Y DB ? DATA ENDS STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS CODE SEGMENT ASSUME DS:DATA,SS:STACK,CS:CODE START: MOV AX,DATA MOV DS,AX CMP X,0 JGE A MOV Y,-1 JMP EXIT A: MOV Y,1 EXIT:MOV AH,4CH INT 21H CODE ENDS END START
- 格式:
-
单片机分支程序设计教案.doc
2020-07-04 07:03:31一复习上次课内容 1什么是标识符 答标识符是程序员选择的名字用来标识常量变量过程段名等2什么是伪指令 答注释性的没有对应的机器码不令计算机做任何操作不产生目标程序不影响程序的执行 二讲授新课 4.3分支程序设计 ... -
微机实验二——分支程序设计
2020-07-21 17:00:51微机实验二——分支程序设计复习
一、实验题目
用地址表法完成下面要求的多路分支程序的设计。根据MODE单元中的模式字(0~7)分别转向L0、L1…L7标号处执行。L0、L1…L7程序段中分别实现显示’0’~’7’字符。(提示:可用DOS系统功能调用INT 21H)。
二、代码
//逻辑分解法 DATAS SEGMENT MODE DB 7//数据段定义字节变量MODE为0 DATAS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS//CODES部分代码和CS寄存器对应,DATAS的(数据)和DS寄存器对应 START: MOV AX,DATAS MOV DS,AX MOV AL,MODE CMP AL,0//cmp指令比较两个操作数,它影响flag的CF等 ZF零标志位:若当前的运算结果为零,则ZF为1,否则为0。 JZ LO//条件跳转指令JZ,等于跳转,ZF=1,转到指定地址执行 CMP AL,1 JZ L1 CMP AL,2 JZ L2 CMP AL,3 JZ L3 CMP AL,4 JZ L4 CMP AL,5 JZ L5 CMP AL,6 JZ L6 CMP AL,7 JZ L7 LO:MOV DL,'0' MOV AH,02H//放2,是2号功能,字符输出,并且要输出的字符是已经放在dl里面的 INT 21H JMP L8 L1:MOV DL,'1' MOV AH,02H INT 21H JMP L8 L2:MOV DL,'2' MOV AH,02H INT 21H JMP L8 L3:MOV DL,'3' MOV AH,02H INT 21H JMP L8 L4:MOV DL,'4' MOV AH,02H INT 21H JMP L8 L5:MOV DL,'5' MOV AH,02H INT 21H JMP L8 L6:MOV DL,'6' MOV AH,02H INT 21H JMP L8 L7:MOV DL,'7' MOV AH,02H INT 21H JMP L8 L8:MOV AH,4CH INT 21H//调用DOS中的子程序。当MOV AH,4CH,就是结束本程序,返回DOS操作系统 CODES ENDS END START
LEA指令的功能是取偏移地址,例如LEA AX,[1000H],作用是将源操作数[1000H]的偏移地址1000H送至AX。理解时,可直接将[ ]去掉,等同于MOV AX,1000H。
DOS的中断调用
通过给AH寄存器赋值,然后调用INT 21H指令,计算机就会根据AH寄存器中的值执行相应的操作,其中1H是键盘输入并回显,AL中有输入字符。
sub AL, 30h 的意思是把 AL中的值减去30h再存入AL中.
其目的是把输入的数字代码转换为具体的数值.转移表法 DATAS SEGMENT MODE DB 01H DATAS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS START: MOV AX,DATAS MOV DS,AX MOV AL,MODE LEA BX,TAB ADD AL,AL MOV AH,0H ADD BX,AX JMP BX TAB: JMP SHORT L0 JMP SHORT L1 JMP SHORT L2 JMP SHORT L3 JMP SHORT L4 JMP SHORT L5 JMP SHORT L6 JMP SHORT L7 L0:MOV DL,'0' MOV AH,02H INT 21H JMP L8 L1:MOV DL,'1' MOV AH,02H INT 21H JMP L8 L2:MOV DL,'2' MOV AH,02H INT 21H JMP L8 L3:MOV DL,'3' MOV AH,02H INT 21H JMP L8 L4:MOV DL,'4' MOV AH,02H INT 21H JMP L8 L5:MOV DL,'5' MOV AH,02H INT 21H JMP L8 L6:MOV DL,'6' MOV AH,02H INT 21H JMP L8 L7:MOV DL,'7' MOV AH,02H INT 21H JMP L8 L8:MOV AH,4CH INT 21H CODES ENDS END START
//地址表法 DATAS SEGMENT TAB DW L0,L2,L3,L4,L5,L6,L7 MODE DB 01H DATAS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS START: MOV AX,DATAS MOV DS,AX MOV AL,MODE ADD AL,AL MOV AH,0H ADD BX,AX SUB BX,2 JMP TAB[BX] L0:MOV DL,'0' MOV AH,02H INT 21H JMP L8 L1:MOV DL,'1' MOV AH,02H INT 21H JMP L8 L2:MOV DL,'2' MOV AH,02H INT 21H JMP L8 L3:MOV DL,'3' MOV AH,02H INT 21H JMP L8 L4:MOV DL,'4' MOV AH,02H INT 21H JMP L8 L5:MOV DL,'5' MOV AH,02H INT 21H JMP L8 L6:MOV DL,'6' MOV AH,02H INT 21H JMP L8 L7:MOV DL,'7' MOV AH,02H INT 21H JMP L8 L8:MOV AH,4CH INT 21H CODES ENDS END START
-
汇编:分支程序设计
2020-03-16 18:28:30分支程序设计 (1)简单分支程序:通过判断一个条件获得两路分支,该条件的判断结果决定了程序的执行流向。缺点在于执行流向的局限性,例如当条件为一个多分段函数时,则无法满足要求。 Created with Raphaël 2.2.0...分支程序设计
(1)简单分支程序:通过判断一个条件获得两路分支,该条件的判断结果决定了程序的执行流向。缺点在于执行流向的局限性,例如当条件为一个多分段函数时,则无法满足要求。
实例:试编程实现函数Y=MAX(X1、X2、X3)的程序。程序流程图如图所示(设X1、X2、X3存放在以BUF起始的3个连续单元中,且均为无符号的8位二进制数)
.486 DATA SEGMENT BUF DB 21,30,98 Y DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX LEA SI,BUF MOV AL,[SI] CMP AL,[SI+1] JNB NEXT ;如果X1不小于X2,则转到NEXT MOV AL,[SI+1] ;如果X1小于X2,则将A2送给AL NEXT: CMP AL,[SI+2] JNB NEXT1 MOV AL,[SI+2] NEXT1: MOV Y,AL MOV AH,4CH INT 21H CODE ENDS END START
(2)多分支程序:为解决单分支结构程序的缺点,采用跳转表法实现多分支程序的设计。例如如果我们想要设计一个4分支的程序,在数据段中定义一个TBLE跳转表,里面分别存放4个CASE的地址。每个地址占内存两个单元(2个字节),那么CASE0的地址存放在数据段中地址为TBLE的地方,即表首。假设满足CASE0时跳转至CS段地址为122AH的地方,那么TABLE存放2AH,TABLE+1存放12H。
跳转表地址 入口标号地址 序号 TBLE R0低字节+R0高字节 0 TBLE+2 R1低字节+R1高字节 1 TBLE+4 R2低字节+R2高字节 2 TBLE+8 R3低字节+R3高字节 4 实例:试编程实现:在提示字符串“INPUT”后输入数字序号0~4,根据键盘输入的数字转向5个分支程序段中的某一个。假设各分支程序段入口地址标号为R0-R4,若输入数字n则准信Rn程序段并显示“OUTPUT:n”。当按下回车键时,结束程序。要求利用跳转表实现转移(设各分支程序段与主程序在同一段代码中)。
.486 DATA SEGMENT TBLE DW R0,R1,R2,R3,R4 ;自动将Rx的偏移地址填进去 MESS1 DB 'INPUT:$' ; 字符串定义时必须以'$'结尾 MESS2 DB 'OUTPUT:$' DATA ENDS STACKA SEGMENT PARA STACK'STACK' ;PARA定义段首地址(20位的后4位0)为16的整数倍 DW 50 DUP(?) STACKA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACKA MAIN PROC FAR ;子程序定义指令PROC,FAR为段间调用 START: PUSH DS MOV AX,0 PUSH AX ;将子程序中将会用到的寄存器中的内容压栈 MOV AX,DATA MOV DS,AX MOV AX,STACKA MOV SS,AX ;16~19段寄存器说明语句 AGAN: LEA DX,MESS1 MOV AH,09H INT 21H ; DOS09号功能调用 MOV AH,01H INT 21H ;DOS01号功能调用 CMP AL,0DH; 是否键入回车,回车符的ascii码为0DH JZ EXIT CMP AL,'4' JA AGAN AND AL,0FH ;将ascii码变为数字,0~9对应十六进制ascii30~39 MOVZX AX,AL SHL AX,1 MOV SI,AX LEA DX,MESS2 MOV AH,9 INT 21H JMP TBLE[SI] ;转向键入序号程序段,寄存器相对寻址方式 R0: MOV DL,'0' JMP DISP R1: MOV DL,'1' JMP DISP R2: MOV DL,'2' JMP DISP R3: MOV DL,'3' JMP DISP R4: MOV DL,'4' JMP DISP DISP: MOV AH,02H INT 21H ; JMP AGAN EXIT: RET MAIN ENDP CODE ENDS END START
注:在DOS的01H,02H,09H功能中,程序中输入输出都为字符相应的ASCII码,而不是直接的数。
-
分支程序设计方案实验.docx
2020-12-08 08:49:37单片机实验报告 实验名称 分支程序设计实验 指导教师 刘冬生 专业班级 电子1103班 姓名 XXXXXX 学号 XXXXXXXXXXX 联系方式 XXXXXXXXXXX 一 任务要求 熟练掌握 KeilC环境下汇编语言程序的调试方法加深对汇编语言指令... -
汇编语言程序设计 实验6 分支程序设计
2020-12-26 09:17:04实验目的:掌握分支程序的基本编程方法。熟悉数制转换。用LOOP指令、条件转移指令和向量地址法实现程序转移。 1.编写程序,如果输人的是大写字母,则输出对应的小写字母;如果输入的是小写字母则输出对应的大写字母... -
分支程序设计总结
2019-11-16 22:24:20主要以if,which为主的分支语句。多用于选择或者条件实例。就是将题目条件进行分类处理,在利用if或者switch编程。 如果编程一直不正确,先检查变量,文件名,以及输入输出以及函数格式是否正确 注意关系运算符==... -
单片机-分支程序设计教案.docx
2020-02-29 10:48:121什么是标识符 答标识符是程序员选择的名字用来标识常量变量过程段名等 2什么是伪指令 答注释性的没有对应的机器码不令计算机做任何操作不产生目 标程序不影响程序的执行 二讲授新课 4.3 分支程序设计 在很多实际... -
分支程序设计实验实验报告.pdf
2020-07-14 22:13:27实验二 分支程序设计实验实验报告 实验名称分支程序设计实验 指导教师 罗志祥 专 业 班 级 光 信 1006 姓 名 张 博 学 号 U201013339 联系方式 13554098548 一任务要求 熟练掌握 KeilC 环境下汇编语言程序的调试方法... -
分支程序设计实验报告.doc
2021-10-10 17:58:23分支程序设计实验报告.doc -
实验二:分支程序设计.docx
2020-06-09 07:55:54实验名称 分支程序设计 姓名 杨旺辉 学号 3130100475 专业生物系统工程 专业生物系统工程 姓名 杨旺辉_ 学号_3130100475 日期_ 地点 D414 课程名称_微机原理与应用_指导老师_ _成绩_ 实验名称_分支程序设计 实验类型... -
微机原理实验3分支程序设计.docx
2020-07-23 23:16:37物理与机电工程系 20152016 学年第 一 学期 分支程序设计 上机实验报告 专 业电子信息工程 学 号 4625852555 姓 名 不同人 任课教师 规范和 实验地点 实验楼 368 项目编号 实 验 三 一实验目的 1. 掌握分支程序的... -
微机原理实验3分支程序设计.pdf
2020-07-23 15:45:27物理与机电工程系 2015 2016 学年第 一 学期 分支程序设计 上机实验报告 专 业电子信息工程 学 号 4625852555 姓 名 不同人 任课教师 规范和 实验地点 实验楼 368 项目编号 实 验 三 一实验目的 1. 掌握分支程序的... -
汇编分支程序设计实验报告
2009-05-22 13:49:531、 掌握分支程序、循环程序的设计方法。 2、 熟悉DEBUG程序的使用方法。 3、 掌握汇编语言程序的编辑、汇编、连接以及调试过程。 二、 实验内容 1、 编写一程序,将内存中某一区域的数据传送到另一个区域中(要求用... -
8086汇编语言分支程序设计.pdf
2021-10-28 14:23:538086汇编语言分支程序设计.pdf -
单片机-分支程序设计教案.pdf
2021-10-12 03:25:11单片机-分支程序设计教案.pdf -
分支程序设计[整理].pdf
2021-10-12 02:48:06分支程序设计[整理].pdf -
分支程序设计实验实验报告.doc
2021-10-10 17:58:27分支程序设计实验实验报告.doc -
微机原理分支程序设计实验.doc
2021-10-10 16:48:25微机原理分支程序设计实验.doc -
微机原理 分支程序设计实验.doc
2021-10-06 09:56:24微机原理 分支程序设计实验.doc -
实验四 分支程序设计实验报告
2012-11-19 23:10:57从键盘输入一个字符,判断该字符是小写字母、大写字母、数字或其他字符,并给出相应的提示。