第5章 8086汇编语言程序设计

上传人:ldj****22 文档编号:53440453 上传时间:2018-08-31 格式:PPT 页数:65 大小:811.50KB
返回 下载 相关 举报
第5章 8086汇编语言程序设计_第1页
第1页 / 共65页
第5章 8086汇编语言程序设计_第2页
第2页 / 共65页
第5章 8086汇编语言程序设计_第3页
第3页 / 共65页
第5章 8086汇编语言程序设计_第4页
第4页 / 共65页
第5章 8086汇编语言程序设计_第5页
第5页 / 共65页
点击查看更多>>
资源描述

《第5章 8086汇编语言程序设计》由会员分享,可在线阅读,更多相关《第5章 8086汇编语言程序设计(65页珍藏版)》请在金锄头文库上搜索。

1、第5章 分支与循环程序设计,本章主要内容,汇编语言程序设计概述,8086汇编语言程序采用模块化结构,通常由一个主程序模块和多个子程序(过程)模块构成。 对于简单程序,只有主程序模块,没有子程序模块。 汇编语言程序有3种基本结构: 顺序结构 分支结构 循环结构,程序的质量标准,衡量程序的质量通常有以下几个标准: 程序正确、完整; 程序易读性强; 程序的执行速度快; 程序占内存小,程序代码的行数少。,汇编语言程序设计的基本步骤, 分析问题,抽象出描述问题的数学模型; 确定解决问题的算法或算法思想; 程序模块划分在解决复杂实际问题时,往往需要把它分成若干功能模块,在进行功能模块划分后,必须确定各功能

2、模块间的通信问题; 绘制各功能模块流程图或结构图; 分配存储空间、寄存器等工作单元;,汇编语言程序设计的基本步骤(续), 根据流程图,编写程序; 静态检查,纠正错误; 上机运行调试,纠正错误,直至测试通过; 整理资料,建立完整的文档。,5.1顺序结构程序设计,顺序结构程序又称简单程序。 采用这种结构的程序,按照指令书写的顺序逐条执行,程序的执行路径没有分支和循环。,顺序结构程序设计举例,【例5-2】编程将内存数据段字节单元INDAT存放的一个数n(假设0 n 9 ),以十进制形式在屏幕上显示出来。 例如,若INSTR单元存放的是数8,则在屏幕上显示:8D。,【例5-2】程序代码,DATA SE

3、GMENT ;数据段定义INDAT DB 8 DATA ENDS CODE SEGMENT ;代码段定义ASSUME CS:CODE,DS:DATA START: MOV AX,DATAMOV DS,AX ;初始化DS,【例5-2】程序代码(续),MOV DL,INDAT OR DL,30HMOV AH 2INT 21HMOV DL,DMOV AH,2INT 21HMOV AH,4CHINT 21H CODE ENDSEND START,5.2 分支结构程序设计,分支结构程序利用条件转移指令或跳转表,使程序执行完某条指令后,根据指令执行后状态标志的情况选择要执行哪个程序段。 分支结构程序的指令

4、执行顺序与指令的存储顺序不一致。 转移指令JMP和Jcc可以实现分支结构。,分支结构的三种形式,单分支结构程序设计举例,【例5-3】编写程序段,求AX中存放的带符号数的绝对值,结果存RES单元。CMP AX,0JGE ISPOSITIVENEG AX ISPOSITIVE:MOV RES,AX 本例采用的是单分支结构。特点是:条件成立时程序跳转;否则,顺序执行。,双分支结构程序设计举例,【例5-4】 编程判断DAT单元存放的带符号数的正负。 如该数为负数,则显示“DAT is a negative number!”;否则显示“DAT is a nonnegative number!”。,【例5

5、-4】(续),DATA SEGMENT ;数据段定义N DB DAT is a negative number!,$NN DB DAT is a nonnegative number! $ DATA ENDS CODE SEGMENT ;代码段定义ASSUME CS:CODE,DS:DATA START: MOV AX,DATAMOV DS,AX ;设置DS,【例5-4】(续),MOV AX,-3CMP AX,0JGE ISNNLEA DX,NMOV AH,9INT 21HJMP FINISH,【例5-4】(续),ISNN: LEA DX,NNMOV AH,9INT 21H FINISH:MO

6、V AH,4CHINT 21H CODE ENDSEND START,【例5-4】(续),【例5-4】采用的是双分支结构。 采用这种结构时,特别要注意第一个分支后要利用JMP指令(程序第16行)使程序跳转到第二个分支的后面。 总结: 首先除第一分支外,第二分支和出口位置用标号标名 第一分支结束时后要加JMP指令使程序跳转到出口位置,多分支结构程序设计举例,【例5-5】 编程求分段函数Y的值。已知变量X为16位带符号数,分段函数的值要求保存到字单元Y中。函数定义如下:,【例5-5】(续),DATA SEGMENT ;数据段定义X DW -128Y DW ? DATA ENDS CODE SEGM

7、ENT ;代码段定义ASSUME CS:CODE,DS:DATA START: MOV AX,DATAMOV DS,AX,【例5-5】(续),MOV AX,XCMP AX,0JG ISPNJZ ISZNMOV Y,-1JMP FINISH ISPN: MOV Y,1JMP FINISH ISZN: MOV Y,0,【例5-5】(续),FINISH: MOV AH,4CHINT 21H CODE ENDSEND START 本例实现的是多分支结构。 设计多分支结构程序时,应注意: 要为每个分支安排出口; 各分支的公共部分尽量集中,以减少程序代码; 无条件转移没有范围的限制,但条件转移指令只能在-

8、128+127字节范围内转移; 调试程序时,要对每个分支进行调试。,总结: 首先除第一分支外,其它的每个分支和出口位置用标号标名 除最后一个分支外,其它分支结束时后要加JMP指令使程序跳转到出口位置,多分支程序设计结构,5.2 循环结构程序设计,当程序处理的问题需要包含多次重复执行某些相同的操作时,在程序中可使用循环结构来实现. 用同一组指令,每次替换不同的数据,反复执行这一组指令。 使用循环结构,可以缩短程序代码,提高编程效率。,循环结构程序的组成- 3个部分,(1)初始化部分 循环的准备部分。 完成地址指针、循环计数、结束条件等初值的设置。 (2)循环体-2个部分 循环工作部分:是循环程序

9、的主体。 循环修改部分:为了保证每一次循环重复时,参加执行的信息能发生规律的变化而建立的程序段。 (3)循环控制部分 根据预先设定的循环次数或条件,判断下一次循环是否要继续进行,从而保证循环正常执行。,循环体的组成,循环工作部分:是循环程序的主体。 完成程序的基本操作。 循环多少次,这部分语句就执行多少次。 循环修改部分: 修改循环工作部分的变量、地址等,保证每次循环参加执行的数据能发生有规律的变化。 举例:高级语言程序段I=1:SUM=0DO SUM=SUM+II=I+1 WHILE I10,循环程序结构,设计循环结构程序时,要注意的问题:,选用计数循环还是条件循环? 采用直到型循环结构还是

10、当型循环结构? 要综合考虑循环执行的条件和循环退出的条件: 可以用循环次数、计数器、标志位、变量值等多种方式来作为循环的控制条件 特别注意: 不要把初始化部分放到循环体中。 循环体中要有能改变循环条件的语句。,使用LOOP,LOOPZ,LOOPNZ时均为相对寻址,跳转地址必须在IP+128ip-128之间。否则可用JMP与三循环指令结合控制循环。,LOP: . LOOP ANET JMP BNET ANET:JMP LOP BNET: ,循环结构程序设计举例,【例5-6】 编程显示以“!”结尾的字符串。 如:“Welcome to MASM!”。,只知道循环结束的条件是该字符串以“!”结束,不

11、知道字符串的长度,所以,可用条件控制的方法来控制循环的次数。,【例5-6】(续),DATA SEGMENT MYSTR DB Welcome to MASM! DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX,【例5-6】(续),LEA SI,MYSTR NEXTCHAR:MOV DL,SIMOV AH,2INT 21HCMP DL,!JZ FINISHINC SIJMP NEXTCHAR,【例5-6】(续),FINISH:MOV AH,4CHINT 21H CODE ENDSEND START

12、,计数循环程序,【例5-6】 将内存数据段INSTR地址开始存放的一个由字母组成的字符串中的小写字母全部转换成大写字母(其余字符不变)后存至内存数据段OUTSTR地址处。 如原字符串是“hello ASM! 20110601”,那么转换完后应该是“HELLO ASM! 20110601”。,【例5-6】(续),DATA SEGMENT INSTR DB hello ASM! 20110601STRLEN EQU $-INSTR OUTSTR DB STRLEN DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,

13、DATAMOV DS,AX,【例5-6】(续),LEA SI,INSTRLEA DI,OUTSTRMOV CX,STRLEN NEXTCHAR:MOV AL,SICMP AL,a JB UNCHG ;不是小写字母,则不转换CMP AL,zJA UNCHG ;不是小写字母,则不转换SUB AL,20H ;将小写字母转换为大写字母 UNCHG: MOV DI,ALINC SIINC DI LOOP NEXTCHAR,【例5-6】(续),MOV AH,4CHINT 21H CODE ENDSEND START,循环结构程序设计举例(续),【例5-7】 编程以二进制形式显示BX的值(假设为无符号数)。

14、如果(BX)=20,那么显示:0000000000010100B。 分析: 由于已知BX是16位的,因此,循环的次数就是16次,所以可以采用计数法控制循环。,【例5-7】(续),CODE SEGMENT ASSUME CS:CODE START: MOV AX,DATAMOV DS,AX MOV BX,20 MOV CX,16 ; 计数器CX,置初值16 NEXTCHAR:ROL BX,1 ;显示顺序是从左往右,MOV DL,BL ;要显示的值仅占最低位D0AND DL,1 ;清除D7D1OR DL,30H MOV AH,2 INT 21H ;利用2号DOS调用显示 LOOP NEXTCHAR

15、 ;循环执行16次 FINISH:MOV DL,BMOV AH,2INT 21H ;利用2号DOS调用,显示BMOV AH,4CHINT 21H ; 返回操作系统 CODE ENDSEND START,【例5-8】 编程以十六进制形式显示BX的值(假设为无符号数)。 如(BX)=20,那么显示0014H。,N,CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATAMOV DS,AX MOV BX,20 ;BX中存放的是要显示的数MOV CH,4,【例5-8】(续),NEXT: MOV CL,4ROL BX,CL ;将最高4位二进制值移至低4位MOV DL,BLAND DL,0FH ;仅保留本次要显示的数值OR DL,30H ;得到要显示的字符的ASCII值CMP DL,39H ;是小于9JBE DISPHEX ADD DL,7 ;得到1015所对应的字符ASCII值,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号