汇编语言程序设计2.ppt_第1页
汇编语言程序设计2.ppt_第2页
汇编语言程序设计2.ppt_第3页
汇编语言程序设计2.ppt_第4页
汇编语言程序设计2.ppt_第5页
已阅读5页,还剩103页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1,第 5 讲 汇编语言程序设计,2,主要内容:,概述 顺序程序设计 分支程序设计 循环程序设计 子程序程序设计 综合举例,3,5.1 概述,汇编语言的程序设计步骤 程序的基本结构,4,5.1 概述,5.1.1 汇编语言的程序设计步骤 1)分析问题、确定算法 2)绘制程序流程图 3)编制程序 4)程序调试,5,5.1 概述,5.1.2 程序的基本结构,6,5.2 顺序程序设计,5.2.1 程序的基本结构 在程序执行前,DOS将要执行的第一条指令的地址装入CS:IP中,然后CPU按CS:IP中的地址从程序取指令到指令队列准备执行,同时修改IP内容指向下一条指令,执行完本条指令,接着执行下一条指令,例题:编写一程序计算以下表达式: Z=(3X+Y-5)/2 设X、Y的值存放在字变量VARX、VARY中,结果存放在VARZ中。,TITLE EQUATION COMPUTE DATA SEGMENT VARX DW 15 VARY DW 10 VARZ DW ? DATA ENDS STACK1 SEGMENT PARA STACK DW 20H DUP(0) STACK1 ENDS,CODE: SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK1 COMP PROC FAR PUSH DS ;保护返回DOS地址 MOV AX,0 PUSH AX MOV AX,DATA ;初始化DS MOV DS,AX MOV AX,VARX ;AXX SHL AX,1 ;AX2X ADD AX,VARX ;AX3X ADD AX,VARY ;AX3X+Y SUB AX,5 ;AX3X+Y-5 SAR AX,1 ;AX(3X+Y-5)/2 MOV VARZ,AX ;存结果 RET ;返回DOS COMP ENDP CODE ENDS END COMP,例题:利用学号查学生的数学成绩表。首先在数据段中建立一个成绩表TABLE,在表中按学号从小到大的顺序存放分数。要查的学号存放在变量NUM中,查表的结果放在变量MATH中。 TITLE TABEL LOOK-UP DATA SEGMENT TABLE DB 81,78,90,64,85,76,93,82,57,80 DB 73,62,87,77,74,86,95,91,82,71 NUM DB 8 MATH DB ? DATA EDNS STACK1 SEGMENT PARA STACK DW 20H DUP(0) STACK1 ENDS,COSEG SEGMENT ASSUME CS:COSEG,DS:DATA,SS:STACK1 START: MOV AX,DATA MOV DS,AX MOV BX,OFFSET TABLE ;BX指向表首址 XOR AH,AH MOV AL,NUM DEC AL ADD BX,AX MOV AL,BX ;查到成绩 MOV MATH,AL ;存结果 MOV AH,4CH INT 21H COSEG ENDS END START,12,5.3 分支程序设计,对于复杂的问题,往往需要进行逻辑判断,并根据判断结果进行不同的处理,采用分支结构,转移指令用来实现程序的分支。,13,5.3 分支程序设计,5.3.1 用条件转移指令实现程序分支 条件转移指令依据的条件是标志位的状态。 例题1:,15,5.3 分支程序设计,例题2:编写一程序,实现将存储器中的源数据块传送到目的数据块。,16,5.3 分支程序设计,由于数据块首址是无符号数因此程序中对两个首址进行比较后,可用JA或JB指令进行分支判断。,20,5.3 分支程序设计,5.3.2 用跳转表实现多路分支 跳转表可用分支程序段的人口地址构成也可以用无条件转移指令构成。 1) 跳转表用入口地址构成 在程序中,将各路分支程序段的入口地址组成一个表放在数据段中。实现分支时,根据判断条件形成对应入口地址在表中的位置即查表地址然后查表获得人口地址就可转到程序分支入口处,因此称这个表为跳转表。,例题: 设某程序有10路分支,试根据变量N的值(110),将程序转移到其中的一路分支去。 设10路分支程序段的入口地址分别为: BRAN1、BRAN2、BRAN10。 当变量N为1时,转移到BRANl;N为2时,转移到 BRAN2, 依次类推。 在跳转表中,每两个字节存放一个人口地址的偏移量,如下 图所示。 程序中先根据N的值形成查表地址:(N-1)2十表首址。 程序的流程图如图所示。,TITLE JUMP TABLE OF ADDRESS DATA SEGMENT ATABLE DW BRAN1, BRAN2, BRAN3, . , BRAN10 N DB 3 DATA ENDS STACK1 SEGMENT PARA STACK DW 20H DUP(0) STACK1 ENDS CODE SEGMENT ASSUME CS: CODE, DS: DATA, SS; STACK1 START: MOV AX, DATA MOV DS, AX . MOV AX, 0 MOV AL, N DEC AL SHL AL, 1,MOV BX, OFFSET ATABLE ; BX指向表首址 ADD BX, AX ; BX指向查表地址 MOV CX, BX ; 将N对应的分支入口地址送到CX中 JMP CX ; 转移到N对应的分支入口地址 BRAN1: . . JMP END1 BRAN2: . . JMP END1 BRAN3: . . JMP END1 . BRAN10: . . END1: MOV AH, 4CH INT 21H CODE ENDS END START,26,5.3 分支程序设计,2) 跳转表用无条件跳转指令构成 将转到各分支入口地址的无条件转移指令“JMP BRAN1”、“JMP BRAN2”、“JMP BRAN10”组成一个表放在代码段中(设每条JMP指令代码都是 三字节长)。 实现分支时,首先根据N的值转到表中对应的JMP指令上,再通过执行这条JMP指令就可转到程序分支入口处。,TITLE JUMP TABLE OF INSTRUCTION DATA SEGMENT N DB 3 DATA ENDS STACK1 SEGMENT PARA STACK DW 20H DUP(0) STACK1 ENDS CODE SEGMENT ASSUME CS: CODE, DS: DATA, SS; STACK1 START: MOV AX, DATA MOV DS, AX . MOV BH, 0 MOV BL, N DEC BL MOV AL, BL SHL BL, 1,ADD BL, AL ADD BX, OFFSET ITABLE ; BX指向查表地址 JMP BX ; 转移到N对应的JMP指令 ITABLE: JMP BRAN1 JMP BRAN2 JMP BRAN3 . JMP BRAN10 BRAN1: . . JMP END1 BRAN2: . . JMP END1 BRAN3: . . JMP END1 . BRAN10: .,30,5.4 循环程序设计,5.4.1 循环控制指令 循环控制指令属于转移类指令,其功能的主要部分类似于条件转移指令。,31,5.4.1 循环控制指令 其中,DISP也是一个相对位移量,是以补码形式表示的带符号数。它表示循环控制指令的下一条指令地址与目标指令地址之间的字节距离。DISP只占一个字节。因此循环控制指令的转移范围只能在-128l27字节之间。,5.4 循环程序设计,32,1)LOOP指令,5.4 循环程序设计,例题: 从ARY数组的10个无符号数中找出最大者送入 MAX单元。,DATA SEGMENT,34,2)LOOPE/LOOPZ指令,5.4 循环程序设计,例题:试编写一程序,在一字符串中查找第一个非空格字符 ,并将其在字符串中的序号(1-n)送入INDEX单元中。 如果末找到非空格字符,则将全1送到INDEX单元中。,37,3)LOOPNE/LOOPNZ指令,5.4 循环程序设计,例题:试编写程序,计算两个字节数组ARYl和ARY2对应元素之和,一直计算到两数之和为0或数组结束为止。并将和存入非0数组SUM中,将该数组的长度存放在NUM单元中。,40,4)JCXZ在循环中的作用 为了避免CX为0时进入循环时,产生次数很大的循环(第一次(CX)-I0FFFFH)。因此在进人循环前用JCXZ指令对CX进行一次测试是很有必要的:,5.4 循环程序设计,41,5.4.2 循环程序的结构,5.4 循环程序设计,42,5.4.2 循环程序的结构 1)初始化部分 这部分用来建立循环的初始状态。如初始化循环次数计数器、地址指针,以及其他循环参数。 2)循环体部分 它由循环的工作部分与修改部分组成。 工作部分是为完成程序功能而设计的主要程序段 修改部分完成某些参数的修改,以使循环能够正确地 重复执行。如修改循环次数计数器、地址指针等。,5.4 循环程序设计,43,5.4.2 循环程序的结构 3)循环控制部分 这部分判断循环结束条件是否成立。通常有两种方法判断循环是否结束: 用计数控制循环:对于循环次数已知的情况,可用循环次数作为循环的控制条件,判断循环是否已进行到了预定的次数。 用条件控制循环:对于循环次数未知的情况,就需要根据具体情况找出控制循环结束的条件,并按这个条件判断循环是否结束。,5.4 循环程序设计,44,5.4.2 循环程序的结构 4)结束处理部分 这部分用来处理循环结束后的结果,如存储结果等。,5.4 循环程序设计,45,5.4.3 单重循环程序设计 1)计数控制循环 只要在执行循环体之前知道循环次数,就可用计数控制循环。计数器可选用寄存器或存储单元,可递增计数也可递减计数。 若用CX作计数器,且递减计数,则可选用LOOP、LOOPE或LOOPNE指令进行计数和判断循环是否结束; 也可选用INCDEC和条件转移指令进行计数和判断。,5.4 循环程序设计,按题意,要进行8次计算故用计数控制循环。但每次循环进行的运算可能不同,因此设置一位标志来区分:标志为0表示作加法;标志为1表示作减法。因有8次运算,则应设置8个标志位。将8个标志位按运算顺序从低位到高位放在一个字节单元LOGR中则称此单元为逻辑尺。本例的逻辑尺为:10011010B。其程序流程团如图下所示。,例题,50,2)条件控制循环 对于循环次数未知的情况,需要分析出循环结束的条件,然后用这个条件来控制循环。而且,对于某些循环次数已知的情况,为了减少循环次数提高程序执行的效率,也可采用条件控制循环。,5.4 循环程序设计,51,例题:试编写一程序,将字单元VARW中含1的个数存人CONT单元中。要测出VARW中1的个数就应逐位测试。一种方法是测试最高位是否为1来计数,然后依次将各位移到最高位去测试。循环的结束本可用计数到16来控制,但由于VARW中的低位可能为0为了减少循环次数,更好的方法是以判断移位后的数是否为0作为循环结束的条件。此外,考虑到VARW本身可能为0的情况,应采用“先判断后执行”的结构。,5.4 循环程序设计,55,5.4.4 多重循环程序设计 为了解决某些问题,在程序中需要采用循环嵌套循环的结构,即多重循环结构。在设计多重循环程序时,首先要分清每层循环的任务和要求,然后分别考虑每层循环的控制条件及程序实现。此外,应注意每次从外层循环进入内层循环时,必须重新设置内层循环的初始条件。,5.4 循环程序设计,56,例题 试编写一程序,求级数12+22+32+的前N项和。 题意:将N2转换成N次加法:N2NN=N+N+N+.+N按题意本程序采用双重循环结构: 内循环求出级数每一项的值; 外循环求级数各项的和。 为了简化程序,求级数项的值从第N项开始。,5.4 循环程序设计,60,子程序的定义 子程序的设计要求 子程序与主程序间的参数传递和设计举例 子程序的嵌套与递归调用 多模块程序设计,5.5 子程序设计,61,5.5.1 子程序的定义 1) 子程序的定义 下面是一个具有段内子程序的单模块结构的汇编语言源程序示例:,5.5 子程序设计,64,对于一个具有FAR属性的子程序来说,定义的子程序和调用程序不在同一个逻辑段内:,5.5 子程序设计,67,2) 子程序的调用与返回 子程序的调用 直接调用: 在CALL指令中直接使用子程序名作为目的 操作数。 间接调用: 将子程序的入口地址存放在内存单元中或 一个16位的通用寄存器中,在CALL指令中 用变址或寄存器寻址的方式来表示子程序的 入口地址。,5.5 子程序设计,68,5.5 子程序设计,无论采用哪一种调用方法,在执行CALL指令时,CS:IP总是指向CALL指令的下一条指令的起始地址。这个地址称为返回地址。 它是子程序中执行RET指令时,返回到调用程序的地址。 在执行CALL指令时,CPU首先将返回地址压入堆栈,然后再转移到子程序的入口地址,进入子程序。,69,段内直接调用:,5.5 子程序设计,段内间接调用:,71,段间直接调用:,5.5 子程序设计,段间间接调用:,73,子程序的返回 在执行返回指令时首先从栈顶弹出一个或两个字的内容,将其送入IP或IP、CS。,5.5 子程序设计,74,5.5 子程序设计,75,5.5.2 子程序的设计要求 子程序应该是一个结构清晰、功能明确、独立性好、通用性强的程序段。只有这样,它才可以在程序中方便地被调用,达到减少重复编程、提高编程效率的目的。 对于己编写好的子程序可以将它们存放在称为子程序库的文件中以供其他程序调用。,5.5 子程序设计,76,1) 具有一定的通用性 2) 选用适当的方法实现主程序与子程序间的参数传递 3) 注意保存信息,5.5 子程序设计,77,4) 正确使用堆栈 5) 清晰的子程序文本 下面是一个多精度数相减的子程序示例,5.5 子程序设计,80,5.5.3 子程序与主程序间的参数传递和设计举例 例题: 将一个给定的二进制数按位转换成它的ASCII码串,并将转换结果存放到指定的存储单元。比如二进制数01110101转换成字符串01110101。 要求采用主程序与子程序的结构格式,设计的子程序应具有较好的通用性。,5.5 子程序设计,主程序要求对一个8位和一个16位数分别转换,转换后的ASCII码存放在一个缓冲区中。数据段和堆栈段安排如下:,1) 用寄存器传递参数 入口参数安排:DX存放待转换的二进制数,CX存放待转换 数的位数(8位或16位),DI存放ASCII码首地址。 由主程序实现信息保存。,2) 用堆栈传递参数 对于使用堆栈传递参数方法来说,在主程序调用子程序之前,应将传递的参数压入堆栈。比如,在这个例子中,应将待转换的数及其位数、存放ASCII码的首地址压入堆栈。,3) 用地址表传递参数 当入口参数较多时,可用地址表传递参数。就是在主程序中将待传递的参数的地址或数值,存放到主程序和子程序共用的指定内存单元中。例如,在DATA段中定义的参数表ARGT

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论