欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > PPT文档下载  

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

    • 资源ID:3502872       资源大小:811.55KB        全文页数:65页
    • 资源格式: PPT        下载积分:8
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要8
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

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

    第5章 分支与循环程序设计,本章主要内容,汇编语言程序设计概述,8086汇编语言程序采用模块化结构,通常由一个主程序模块和多个子程序(过程)模块构成。 对于简单程序,只有主程序模块,没有子程序模块。 汇编语言程序有3种基本结构: 顺序结构 分支结构 循环结构,程序的质量标准,衡量程序的质量通常有以下几个标准: 程序正确、完整; 程序易读性强; 程序的执行速度快; 程序占内存小,程序代码的行数少。,汇编语言程序设计的基本步骤, 分析问题,抽象出描述问题的数学模型; 确定解决问题的算法或算法思想; 程序模块划分在解决复杂实际问题时,往往需要把它分成若干功能模块,在进行功能模块划分后,必须确定各功能模块间的通信问题; 绘制各功能模块流程图或结构图; 分配存储空间、寄存器等工作单元;,汇编语言程序设计的基本步骤(续), 根据流程图,编写程序; 静态检查,纠正错误; 上机运行调试,纠正错误,直至测试通过; 整理资料,建立完整的文档。,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,DS:DATA START: MOV AX,DATA MOV DS,AX ;初始化DS,【例5-2】程序代码(续),MOV DL,INDAT OR DL,30H MOV AH 2 INT 21H MOV DL,'D' MOV AH,2 INT 21H MOV AH,4CH INT 21H CODE ENDS END START,5.2 分支结构程序设计,分支结构程序利用条件转移指令或跳转表,使程序执行完某条指令后,根据指令执行后状态标志的情况选择要执行哪个程序段。 分支结构程序的指令执行顺序与指令的存储顺序不一致。 转移指令JMP和Jcc可以实现分支结构。,分支结构的三种形式,单分支结构程序设计举例,【例5-3】编写程序段,求AX中存放的带符号数的绝对值,结果存RES单元。 CMP AX,0 JGE ISPOSITIVE NEG AX 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!','$' 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】(续),【例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: 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 CODE ENDS END START 本例实现的是多分支结构。 设计多分支结构程序时,应注意: 要为每个分支安排出口; 各分支的公共部分尽量集中,以减少程序代码; 无条件转移没有范围的限制,但条件转移指令只能在-128+127字节范围内转移; 调试程序时,要对每个分支进行调试。,总结: 首先除第一分支外,其它的每个分支和出口位置用标号标名 除最后一个分支外,其它分支结束时后要加JMP指令使程序跳转到出口位置,多分支程序设计结构,5.2 循环结构程序设计,当程序处理的问题需要包含多次重复执行某些相同的操作时,在程序中可使用循环结构来实现. 用同一组指令,每次替换不同的数据,反复执行这一组指令。 使用循环结构,可以缩短程序代码,提高编程效率。,循环结构程序的组成- 3个部分,(1)初始化部分 循环的准备部分。 完成地址指针、循环计数、结束条件等初值的设置。 (2)循环体-2个部分 循环工作部分:是循环程序的主体。 循环修改部分:为了保证每一次循环重复时,参加执行的信息能发生规律的变化而建立的程序段。 (3)循环控制部分 根据预先设定的循环次数或条件,判断下一次循环是否要继续进行,从而保证循环正常执行。,循环体的组成,循环工作部分:是循环程序的主体。 完成程序的基本操作。 循环多少次,这部分语句就执行多少次。 循环修改部分: 修改循环工作部分的变量、地址等,保证每次循环参加执行的数据能发生有规律的变化。 举例:高级语言程序段 I=1:SUM=0 DO SUM=SUM+I I=I+1 WHILE I10,循环程序结构,设计循环结构程序时,要注意的问题:,选用计数循环还是条件循环? 采用直到型循环结构还是当型循环结构? 要综合考虑循环执行的条件和循环退出的条件: 可以用循环次数、计数器、标志位、变量值等多种方式来作为循环的控制条件 特别注意: 不要把初始化部分放到循环体中。 循环体中要有能改变循环条件的语句。,使用LOOP,LOOPZ,LOOPNZ时均为相对寻址,跳转地址必须在IP+128ip-128之间。否则可用JMP与三循环指令结合控制循环。,LOP: . LOOP ANET JMP BNET ANET:JMP LOP BNET: ,循环结构程序设计举例,【例5-6】 编程显示以“!”结尾的字符串。 如:“Welcome to MASM!”。,只知道循环结束的条件是该字符串以“!”结束,不知道字符串的长度,所以,可用条件控制的方法来控制循环的次数。,【例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】 将内存数据段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】(续),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: MOV DI,AL INC SI INC DI LOOP NEXTCHAR,【例5-6】(续),MOV AH,4CH INT 21H CODE ENDS END START,循环结构程序设计举例(续),【例5-7】 编程以二进制形式显示BX的值(假设为无符号数)。 如果(BX)=20,那么显示: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次 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位 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)转换并保存结果 这一步将二进制数转换为十进制值,即求出十进制值各位上的数字。由于16位二进制数最大能表示的数是65535,所以,转换后,最多是一个万位的十进制数。转换的步骤就是:把要转换的数依次除以10000,1000,100和10,分别可以得到万位数字、千位数字、百位数字和十位数字。除以10得到的余数就是个位数字。程序中,将得到的这些数字先存入内存指定单元,供显示模块使用。 (2)显示 本例程序把转换和显示分成两个模块来实现,使得程序的结构清晰。,【例5-9】(续),DATA SEGMENT DECNUM DB 5 DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV BX,65530 ;要转换的值 LEA SI,DECNUM,【例5-9】(续),MOV DX,0 MOV AX,BX MOV CX,10000 DIV CX MOV SI,AL;求得万位的值,存入指定单元 INC SI MOV AX,DX MOV DX,0 MOV CX,1000 DIV CX MOV SI,AL;求得千位的值,存入指定单元,【例5-9】(续),INC SI MOV AX,DX MOV DX,0 MOV CX,100 DIV CX MOV SI,AL;求得百位的值,存入指定单元 INC SI MOV AX,DX MOV CL,10 DIV CL MOV SI,AL ;求得十位的值,存入指定单元,【例5-9】(续),INC SI MOV SI,AH ;此时,余数就是个位的值, LEA SI,DECNUM MOV CX,5 DISP: MOV DL,SI ;依次取出十进制数各位的值 OR DL,30H ;将取出的值转换为ASCII值 MOV AH,2 INT 21H ;利用DOS功能调用,显示 INC SI LOOP DISP,【例5-9】(续),MOV DL,'D' MOV AH,2 INT 21H MOV AH,4CH INT 21H CODE ENDS END START,条件循环程序,若循环次数预先不能确定,可谓设法根据问题的特定条件进行循环控制。如例1 例:求12+22+32+。 前项的和刚大于1000的项数N,并将项数存入到T单元中。,DATA SEGMENT T DB ? DATA ENDS COSEG SEGMENT ASSUME DS:DATA,CS:COSEG START: MOV AX,DATA MOV DS,AX MOV CL,0 ;项数计数器 MOV DL,0 ;自然数计数器 MOV BX,0 ;和 INCR: INC DL ;形成一个自然数,MOV AL,DL MOV SH,AL MUL AH ADD BX,AX ;计算累加和 INC CL ;计项数 CMP BX,1000 JA ATOREN JMP INCR ;和=1000,继续求下一项 STOREN:MOV T,CL MOV AH,4CH INT 21H COSEG ENDS END START,【例5-10】 请用冒泡排序法编程将内存ARRAY单元开始存储的一组8位带符号数据按从大到小排列 编制多重循环程序时要注意内外循环应完全嵌套在外循环内,不得出现内外循环交叉,内外循环的初始化部分也不能混淆。 冒泡法:N个数要进行N-1趟。第一趟从第一个开始一次对相邻两个数进行比较,若数的大小次序错误,则交换,否则不作任何操作。进行N-1次比较结束时,最小数排在最后。然后,进行第二趟,只需要进行N-2次比较,就可排好次小数。第三趟,进行N-3次比较,依次类推。,DATA SEGMENT NUM DB 5,9,8,7,3,15 LEN EQU $-NUM DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV CX,LEN DEC CX ;CX比较趟数,即外循环次数,LOP1: MOV DX,CX ; 保存外循环次数在DX,内循环比较次数在CX中。 MOV SI,0 LOP2: MOV AL,NUMSI CMP AL,ANUMSI+1 ;相邻两数据比较 JAE CONT XCHG AL,NUMSI+1 MOV NUMSI,AL CONT :INC SI ;修改数据地址指针 LOOP LOP2 ; 内循环结束 MOV CX,DX ;恢复外循环计数值 LOOP LOP1 ;外循环是否结束,MOV AH,4CH INT 21H CODE ENDS END START,多重循环设计方案,上述程序内外排序共进行N*(N-1)/2次比较操作。若数据本来就已经排好,或经过几次操作后次序已经排好,也还要进行N*(N-1)/2次比较操作。 设立交换标志来判断是否还需要排序。因为一旦当第i趟排序过程中,没有发生数据交换,说明这批数据已经按要求的顺序排好了,就可以提前结束。AH作交换标志,每次内循环前置0,在内循环一旦发生交换AH置1,继续循环,做下一趟的排序;AH为0,即在第i趟排序内没有发生数据交换,说明数已按序排列,提前结束循环结束。,【例5-10】(续),DATA SEGMENT NUM DB 5,9,8,7,3,15 LEN EQU $-NUM DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV CX,LEN DEC CX ;CX比较趟数,【例5-10】(续),LOP1: MOV DX,CX ; 保存外循环次数在DX,内循环比较次数在CX中。 MOV SI,0 ; MOV AH,0 ; 交换标致寄存器置0 LOP2: MOV AL,NUMSI CMP AL,ANUMSI+1 ;相邻两数据比较 JAE CONT XCHG AL,NUMSI+1 MOV NUMSI,AL MOV AH,1,【例5-10】(续),CONT:INC SI ;修改数据地址 LOOP LOP2 ;控制内循环比较完一轮吗? AND AH,AH ;内循环结束,AH=0结束排序,为 1,继续需要下一轮。 JZ FINISH ;不需要下一轮,已全部排好序 MOV CX,DX ;恢复外循环的次数 JNZ LOP1 ;未完继续 FINISH: MOV AH,4CH INT 21H CODE ENDS END START,

    注意事项

    本文(第5章8086汇编语言程序设计.ppt)为本站会员(本田雅阁)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开