汇编语言分支结构程序设计
- 格式:doc
- 大小:190.00 KB
- 文档页数:7
实验二 分支结构程序设计实验1、实验目的和要求:掌握汇编语言分支程序的设计方法;2、实验内容:编程序求分段函数Y 的值。
已知变量X 为16位带符号数, 分段函数的值要求 保存到字单元Y 中。
函数定义如下:1 (当X>0)Y = 0 (当x=0)—1 (当X<0)3、实验仪器与器材:计算机及EMU8086汇编软件等。
4、实验原理:分支结构的程序设计方法的关键在于构造合适的分支条件和分析程序流程,根据不同的程序流程选择适当的分支语句。
分支结构适合于带有逻辑或关系比较等条件判断的计算,设计这类程序时往往都要先绘制其程序流程图,然后根据程序流程写出源程序,这样做把程序设计分析与语言分开,使得问题简单化,易于理解。
程序流程图是根据解题分析所绘制的程序执行流程图。
5、实验过程与测试数据(含电路图/程序流程框图):6、实验分析:自己分析7、实验体会:自己总结实验参考程序:DATA SEGMENTX DW -128Y DW ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA START: MOV AX,DATAMOV DS,AXMOV AX,XCMP AX,0JG ISPNJZ ISZNMOV Y,-1JMP FINISHISPN: MOV Y,1JMP FINISHISZN: MOV Y,0FINISH: MOV AH,4CHINT 21HCODE ENDSEND START思考题:把程序修改成如下的分段函数的值—1 (当X>=0)Y=1 (当X<0)。
第5章分支、循环程序设计本章要点: 转移指令的寻址方式及其执行过程,控制转移类指令的使用,分支和循环程序的设计和应用。
程序调试的方法,常见问题的程序设计方法。
一、单项选择题5.1.1条件转移是根据标志寄存器中的标志位来判断的,条件判断的标志位共有( B )位。
A. 4B. 5C. 6D. 95.1.2用一条条件转移指令一次可以实现( A )个分支。
A. 2B. 3C. 4D. N5.1.3 条件转移指令的转移范围是(A)。
A. -128~127B. 0~255C. 0~65535D. -32768~327675.1.4 设A为字变量,B为标号,下列指令中不正确的是(D)。
A. MOV AX,AB. JNZ BC. JMP [SI]D. JMP B[BX]5.1.5 下述指令中影响CF标志位的是(A)。
A. SHL AL,1B. MOV AL,1C. JC LD. JNC L5.1.6 下述指令中不影响CF标志位的是(A)。
A. INC SIB. SUB SI,0C. NEG ALD. TEST AL,15.1.7 在多重循环程序设计中,每次通过外层循环进入内层循环时,其内层循环的初始条件(B)。
A. 不必考虑B. 必须重新设置C. 必须清0D. 必须置15.1.8 当设计一个程序时,最重要的是(B)。
A. 程序的结构化B. 能使程序正常运行并实现功能C. 程序的执行速度快D. 程序占用的存储空间小*5.1.9 如果“JNC L”指令的操作码放在0040H,转移后在0020H处取下一指令的操作码,那么这条指令的位移量是(C)。
A. 1EHB. 20HC. 0DEHD. 0E0H*5.1.10 如果“JGE P”指令的操作码放在0050H,该指令的位移量是34H,执行完这条指令转移取下一条指令的偏移地址是(C)。
A. 82HB. 84HC. 86HD. 88H二、填空题5.2.1 当下面循环程序中的划线处填上一个什么数字时,执行的循环次数最多?MOV CX,____0______MOV AX,0L:INC AXLOOP L5.2.2 当两个数进行比较后,执行__JE L(JZ L)表示两数相等则转移到L。
第四章汇编语言程序设计本章的汇编语言程序设计的主要容有:汇编语言程序设计概述、汇编语言程序的结构形式、汇编语言的伪指令。
(一个单片机应用系统和其它计算机系统一样,在完成一项具体工作的时候,它要按照一定的次序,去执行操作,这些操作实际上就是由设计人员,以单片机能够接受的指令编制的程序,那么无论计算机也好,单片机也好,实际上编制程序的过程,就是用计算机来反映设计者的编程思想,那么这一章中,我们将向大家介绍怎样使用单片机指令系统来编制一些应用程序。
在介绍之前,我们还是来学习汇编语言的一些基础知识)4.1 汇编语言程序设计概述1、计算机的汇编语言以助记符表示的指令,每一条指令就是汇编语言的一条语句。
(汇编语言程序设计实际上就是使用汇编指令来编写计算机程序。
汇编语言的语句有严格的格式要求)2、汇编语言的语句格式MCS-51汇编语言的语句格式表示如下:[<标号>]: <操作码> [<操作数>]; [<注释>]标号:指令的符号地址,有了标号,程序中的其它语句才能访问该语句。
①标号是由1~8个ASCII字符组成,但头一个字符必须是字母,其余字符可以是字母、数字或其它特定字符。
②不能使用汇编语言已经定义了的符号作为标号,如指令助记符、伪指令记忆符以及寄存器的符号名称等。
(同一个标号在程序中只能定义一次,不能重复定义;一条语句可以有标号,也可以没有标号,所以是否有标号,取决于程序中是否需要访问该语句。
)操作码:规定语句执行的操作容,操作码是以指令助记符表示的,是汇编指令格式中唯一不能空缺的部分。
操作数:给指令的操作提供数据或地址。
注释:是对语句或程序段的解释说明。
(在单片机中,这四个部分怎么加以区分呢?使用分界符)分界符(分隔符):用于把语句格式中的各部分隔开,以便于编译程序区分不同的指令段。
冒号(:)用于标号之后空格()用于操作码和操作数之间逗号(,)用于操作数之间,分割两个以上的操作数分号(;)用于注释之前。
实验七分支结构程序设计
一、实验目的
掌握条件转移指令的使用方法及指令对标志寄存器中各标志位的影响;掌握标志位和转移指令之间的关系;会用条件转移指令和无条件转移指令设计多分支结构程序;掌握设置断点调试程序的方法。
二、示例
1、存自BUF单元开始的缓冲区连续存放着10个学生的英文分数,编程序统计其中90~100,
60~89,60以下者各有多少人?并把90-100分人数结果存放在P1单元中、60-89分人数结果存放在P2单元中,60分以下人数结果存放在P3单元中(P1、P2、P3为数据段的单元),最后把P1、P2、P3中的数以”P1=?、P2=?、P3=?”显示在屏幕上。
(注:数据以10进制显示)
DATA SEGMENT
BUF DB 70H,58H,50H,91H,99H,62H,75H,82H,74H,60H ;定义BUF单元地址开始的缓冲区的数据
ORG 0020H ;程序执行时,将P1送到0200H存单元
P1 DB 0
ORG 0030H ;程序执行时,将P2送到0300H存单元
P2 DB 0
ORG 0040H
P3 DB 0 ;程序执行时,将P3送到0400H存单元
ORG 0050H ;程序执行时,将DP1送到0500H存单元
DP1 DB'P1= $'
ORG 0060H ;程序执行时,将DP2送到0600H存单元
DP2 DB'P2= $'
ORG 0070H ;程序执行时,将DP3送到0700H存单元
DP3 DB'P3= $'
ORG 0080H ;程序执行时,将COUNT送到0800H存单元
COUNT DW 10 ;'$'为地址运算符,返回当前程序语句的地址偏移值DATA ENDS;定义数据段
CSEG SEGMENT
ASSUME CS:CSEG,DS:DATA
PUSH DS ;将DS压入堆栈
SUB AX,AX;将AX存器容清空
PUSH AX
START:MOV AX,DATA
MOV DS,AX ;将数据传给数据段DS
MOV CX,COUNT ;设置计数器CX,最多为10
MOV SI,0 ;给SI赋值为0
LP1:
MOV AL,BUF[SI] ;将BUF存单元的第si个容赋值给AL
CMP AL,90H ;判断该学生的分数是否>=90
JNB LP2 ;若不低于90则跳转到LP2
CMP AL,60H ;判断该学生的分数是否>=60
JC LP3 ;若产生进位则跳转到LP3
INC P2 ;将分数在60-89的学生的分数个数存放到P2中 JMP LP5 ;跳转到LP5,即循环遍历数组BUF
LP3: INC P3 ;将P3中的个数+1
JMP LP5 ;跳转到LP5
LP2: INC P1 ;给P1中的个数+1
LP5: INC SI ;将SI进行+1操作,即下一个成绩分数
LOOP LP1 ;循环LP1
LEA DX,DP1
MOV AH,09H
INT 21H
MOV DL,P1
ADD DL,30H ;转对应的ASCII值
MOV AH,2
INT 21H ;将P1数据转10进制输出
LEA DX,DP2
MOV AH,09H
INT 21H
MOV DL,P2
ADD DL,30H ;转对应的ASCII值
MOV AH,2
INT 21H ;将P2数据转10进制输出
LEA DX,DP3
MOV AH,09H
INT 21H
MOV DL,P3
ADD DL,30H ;转对应的ASCII值
MOV AH,2
INT 21H
MOV AH,4CH
INT 21H ;将P3数据转10进制输出
CSEG ENDS
END START
对上述程序加上注释,并运行观察结果。
运行结果:
BUF开始的存单元的10个数中有2个>=90,6个在60-89,2个在60以下
验证正确
三、实验题
1已知DATAX和DATAY单元各存放一个带符号字节数据,从键盘上接收加(+)、减(-)、乘(*)或除(/)符号,然后完成相应运算,结果存入RLT单元。
四、实验报告
1、总结调试分支程序的方法;
2、写出程序清单,并记录执行结果。
解:
1.总结调试分支程序的方法
将每个分支的功能编写清楚后,根据运行结果与自身判断结果相比较,若有误,则单步执行程序,观察程序运行的每一步结果变化是否和自身想象的一样。
2.已知DATAX和DATAY单元各存放一个带符号字节数据,从键盘上接收加(+)、减(-)、乘(*)或除(/)符号,然后完成相应运算,结果存入RLT单元。
程序代码:
DATAS SEGMENT
DATAX DB 9H
DATAY DB 2H
RLT DB 1 DUP(?)
;此处输入数据段代码
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX ;将DATAS中的数据存入DS
MOV BL,DATAX ;将DATAX送入BL
MOV BH,DATAY ;将DATAY送入BH
MOV AH,01H
int 21H ;DOS功能调用,等待键盘输入一个值
CMP AL,'+'
JE addition ;若输入符号为'+',则跳转到addition CMP AL,'-'
JE subtraction;若输入符号为'-',则跳转到subtraction CMP AL,'*'
JE multiplication;若输入符号为'*',则跳转到multiplication CMP AL,'/'
JE division ;若输入符号为'/',则跳转到division
addition:
ADD BL,BH ;将BL,BH容相加
JMP print ;跳转到输出过程
subtraction:
SUB BL,BH ;将BL,BH容相减
JMP print
multiplication:
MOV AL,BH
MUL BL ;将BL,BH容相乘
MOV BL,AL
JMP print
division:
MOV AL,BL
SUB AH,AH
DIV BH ;将BL,BH容相除
MOV BL,AL
JMP print
print:
MOV AL,BL
MOV CL,4
SHR AL,CL ;将AL数据逻辑右移4位
ADD AL,30H ;将AL数据转为对应ASCII值
CMP AL,39H ;比较AL中数据与39H的大小
JBE look1 ;当AL<=39H时,跳转到look1
ADD AL,07H ;>=39H,则只加07H
look1:
MOV DL,AL
MOV RLT,AL
MOV AH,02H
INT 21H
MOV AL,BL
AND AL,0FH
ADD AL,30H
CMP AL,39H
JBE look2
ADD AL,07H
look2:
MOV DL,AL
MOV RLT,AL
MOV AH,02H ;dos功能调用,输出DL INT 21H
;此处输入代码段代码
MOV AH,4CH
INT 21H
CODES ENDS
END START
运行结果:
加:
减:
乘:
除:
人工验算结果为正确的。