第5章8086汇编语言程序设计C知识分享

上传人:yuzo****123 文档编号:141249102 上传时间:2020-08-05 格式:PPT 页数:65 大小:861.50KB
返回 下载 相关 举报
第5章8086汇编语言程序设计C知识分享_第1页
第1页 / 共65页
第5章8086汇编语言程序设计C知识分享_第2页
第2页 / 共65页
第5章8086汇编语言程序设计C知识分享_第3页
第3页 / 共65页
第5章8086汇编语言程序设计C知识分享_第4页
第4页 / 共65页
第5章8086汇编语言程序设计C知识分享_第5页
第5页 / 共65页
点击查看更多>>
资源描述

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

1、第5章 分支与循环程序设计,本章主要内容,汇编语言程序设计概述,8086汇编语言程序采用模块化结构,通常由一个主程序模块和多个子程序(过程)模块构成。 对于简单程序,只有主程序模块,没有子程序模块。 汇编语言程序有3种基本结构: 顺序结构 分支结构 循环结构,汇编语言程序设计的基本步骤, 分析问题,抽象出描述问题的数学模型; 确定解决问题的算法或算法思想; 程序模块划分在解决复杂实际问题时,往往需要把它分成若干功能模块,在进行功能模块划分后,必须确定各功能模块间的通信问题; 绘制各功能模块流程图或结构图; 分配存储空间、寄存器等工作单元;,汇编语言程序设计的基本步骤(续), 根据流程图,编写程

2、序; 静态检查,纠正错误; 上机运行调试,纠正错误,直至测试通过; 整理资料,建立完整的文档。,5.1顺序结构程序设计,顺序结构程序又称简单程序。 采用这种结构的程序,按照指令书写的顺序逐条执行,程序的执行路径没有分支和循环。,顺序结构程序设计举例,【例5-2】编程将内存数据段字节单元INDAT存放的一个数n(假设0 n 9 ),以十进制形式在屏幕上显示出来。 例如,若INSTR单元存放的是数8,则在屏幕上显示:8D。,【例5-2】程序代码,DATA SEGMENT ;数据段定义 INDAT DB 8 DATA ENDS CODE SEGMENT ;代码段定义 ASSUME CS:CODE,D

3、S:DATA START: MOV AX,DATA MOV DS,AX ;初始化DS,【例5-2】程序代码(续),MOV DL,INDAT OR DL,30H MOV AH2 INT 21H MOV DL,D MOV AH,2 INT 21H MOV AH,4CH INT 21H CODE ENDS END START,5.2 分支结构程序设计,分支结构程序利用条件转移指令或跳转表,使程序执行完某条指令后,根据指令执行后状态标志的情况选择要执行哪个程序段。 分支结构程序的指令执行顺序与指令的存储顺序不一致。 转移指令JMP和Jcc可以实现分支结构。,分支结构的三种形式,单分支结构程序设计举例,

4、【例5-3】编写程序段,求AX中存放的带符号数的绝对值,结果存RES单元。 CMP AX,0 JGE ISPOSITIVE NEGAX ISPOSITIVE: MOV RES,AX 本例采用的是单分支结构。特点是:条件成立时程序跳转;否则,顺序执行。,双分支结构程序设计举例,【例5-4】 编程判断DAT单元存放的带符号数的正负。 如该数为负数,则显示“DAT is a negative number!”;否则显示“DAT is a nonnegative number!”。,【例5-4】(续),DATA SEGMENT ;数据段定义 N DB DAT is a negative number!

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

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

7、 MOV AX,DATA MOV DS,AX,【例5-5】(续),MOV AX,X CMP AX,0 JG ISPN JZ ISZN MOV Y,-1 JMP FINISH ISPN:MOV Y,1 JMP FINISH ISZN:MOV Y,0,【例5-5】(续),FINISH:MOV AH,4CH INT 21H CODEENDS END START 本例实现的是多分支结构。 设计多分支结构程序时,应注意: 要为每个分支安排出口; 各分支的公共部分尽量集中,以减少程序代码; 无条件转移没有范围的限制,但条件转移指令只能在-128+127字节范围内转移; 调试程序时,要对每个分支进行调试。,

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

9、生规律的变化而建立的程序段。 (3)循环控制部分 根据预先设定的循环次数或条件,判断下一次循环是否要继续进行,从而保证循环正常执行。,循环体的组成,循环工作部分:是循环程序的主体。 完成程序的基本操作。 循环多少次,这部分语句就执行多少次。 循环修改部分: 修改循环工作部分的变量、地址等,保证每次循环参加执行的数据能发生有规律的变化。 举例:高级语言程序段 I=1:SUM=0 DO SUM=SUM+I I=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,SI MOV AH,2 INT 21H CMP DL,! JZ FINISH INC SI JMP NEXTCHAR,【例5-6】(续),FINISH: MOV AH,4CH INT 21H CODE ENDS END START,计数循环程序,【例5-6】 将内存数据段

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

13、】(续),LEA SI,INSTR LEA DI,OUTSTR MOV CX,STRLEN NEXTCHAR: MOV AL,SI CMP AL,a JB UNCHG;不是小写字母,则不转换 CMP AL,z JA UNCHG;不是小写字母,则不转换 SUB AL,20H;将小写字母转换为大写字母 UNCHG: MOVDI,AL INC SI INC DI LOOP NEXTCHAR,【例5-6】(续),MOV AH,4CH INT 21H CODE ENDS END START,循环结构程序设计举例(续),【例5-7】 编程以二进制形式显示BX的值(假设为无符号数)。 如果(BX)=20,那

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

15、次 FINISH: MOV DL,B MOV AH,2 INT 21H;利用2号DOS调用,显示B MOV AH,4CH INT 21H ; 返回操作系统 CODE ENDS END START,【例5-8】 编程以十六进制形式显示BX的值(假设为无符号数)。 如(BX)=20,那么显示0014H。,N,CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV BX,20;BX中存放的是要显示的数 MOV CH,4,【例5-8】(续),NEXT: MOV CL,4 ROL BX,CL ;将最高4位二进制值移至低4位

16、 MOV DL,BL AND DL,0FH;仅保留本次要显示的数值 OR DL,30H ;得到要显示的字符的ASCII值 CMP DL,39H ;是小于9 JBE DISPHEX ADD DL,7;得到1015所对应的字符ASCII值,【例5-8】(续),DISPHEX: MOV AH,2 INT 21H;利用DOS功能调用,显示字符 DEC CH JNZ NEXT;显示下一位十六进制数字 MOV DL,H;显示字符H MOV AH,2 INT 21H MOV AH,4CH INT 21H CODE ENDS END START,【例5-9】 编程以十进制形式显示BX的值(假设为无符号数)。 如(BX)=20,那么显示20D。 分析: 本例分两步实现。 (1)转换并保存结果。 (2)显示。,【例5-9】(续),本例分两步实现。 (1)转换并保存结果 这一步将二进制

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

当前位置:首页 > 中学教育 > 教学课件 > 高中课件

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