资源预览内容
第1页 / 共12页
第2页 / 共12页
第3页 / 共12页
第4页 / 共12页
第5页 / 共12页
第6页 / 共12页
第7页 / 共12页
第8页 / 共12页
第9页 / 共12页
第10页 / 共12页
亲,该文档总共12页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第六章 汇编程序设计及高级汇编语言技术 本章学习目标 本章重点介绍程序设计的基本方法:顺序程序、分支程序、循环程序、子 程序以及宏汇编、重复汇编和条件汇编、结构与记录等高级编程技术。 6.1 顺序程序设计 一般说来,编制一个汇编语言程序的步骤如下: (1) 分析题意确定算法。这一步是能否编制出高质量程序的关键,因此不应该一拿到题 目就急于写程序,而是应该仔细地分析和理解题意,找出合理的算法及适当的数据结构。 (2) 根据算法画出程序框图。这一点对初学者特别重要,这样做可以减少出错的可能 性。画图时可以从粗到细把算法逐步地具体化。 (3) 根据框图编写程序。 (4) 上机调试程序。任何程序必须经过调试才能检查出你的设计思想是否正确以及你的 程序是否符合你的设计思想。在调试程序的过程中应该善于利用机器提供的调试工具来进行 工作,你会发现它会给你提供很大的帮助。 程序有顺序、循环、分支和子程序四种结构形式。下面分别进行介绍。 顺序程序设计,又叫直接程序设计。它是相对于分支程序和循环程序设计而言的。因 此,可以说顺序程序是既不包含分支,又不包含循环的程序,顺序程序是从第一条指令开 始,按其自然顺序,一条指令一条指令地执行,在运行期间,CPU既不跳过某些指令,也 不重复执行某些指令。一直执行到最后一条指令为止,此程序的任务也就完成了,前面我们 所举的例子,大多数是这种程序。汇编语言中的大部分指令,如数据传送指令、算术运算指 令、处理器控制指令、移位指令和逻辑运算指令,都可以用来构造顺序结构。 例例 6.1.1:从键盘键入 0至 9 中任一自然数 X,求其立方值。 求一个数的立方值可以利用乘法和查表方法来实现, 在本例中利用查表方法来实现。构造一个立方表,事先将 0 至 9 的立方存放在表中,求 0 至 9的立方值可直接从表 中查出。表存储单元分配:字节变量 x 存放键入的自然数 x,字变量 xxx 中存放 x 的立方值。从表结构可知,x 的 立方值在表中的存放地址与 x 有如下对应关系: TAB 0 的立方值 1 的立方值 2 的立方值 9 的立方值 X DB ? XXX DW ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK BEGIN:MOV AX, DATA (TAB+2*x)=x 的立方值 源程序如下: STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS DATA SEGMENT INPUT DB “PLEASE INPUT X(09):$“ TAB DW 0,1,8,27,64,125,216,343,512,729 第六章 汇编程序设计及高级汇编语言技术 165 MOV BL, AL MOV BH, 0 MOV AX, TABBX MOV XXX, AX MOV AH, 4CH INT 21H CODE ENDS END BEGIN MOV DS, AX MOV AH, 9 LEA DX, INPUT INT 21H MOV AH, 1 INT 21H AND AL, 0FH MOV X, AL ADD AL, AL 6.2 分支程序设计 6.2.1 分支程序设计概述 顺序程序设计是最基本的程序设计技术,但实际上在很多情况下,不单要求计算某个确 定的计算公式,而且要求根据变量变化的情况,从几个公式中选择一个进行计算,这时,对 变量所处的状态要进行判断,根据判断结果决定程序的流向,这就是分支程序设计技术。 分支程序结构可以有两种形式,如图 6.2.1 所示。它们分别相当于高级语言中的 IF THENELSE 语句和 CASE 语句,它们适用于要根据不同条件作不同处理的情况。IF THENELSE 语句可以引出两个分支,CASE 语句则可以引出多个分支,不论哪一种形 式,它们的共同特点是:运行方向是向前的,在某一种确定条件下,只能执行多个分支中的 一个分支。 图 6.2.1 分支程序结构图 在 8086/8088的程序中,指令执行的顺序由代码寄存器 CS和指令指针 IP的内容确定。 CS寄存器用来存放当前代码段的基址,当前代码段是从基址开始以后连续的一个 64K字节 的存储空间。IP的内容作为偏移地址。一个存储单元的偏移地址是指从段的基址算起到这 个单元所处位置的字节数。CS和 IP结合起来给出了下条指令在存储器中的位置。CPU根据 IP和 CS的值,从存储器中取出一条指令,送到 CPU中去执行,然后根据程序转移以后的 地址逐条读取指令重新填入指令列队。程序的分支一般用转移指令来产生。 6.2.2 分支程序设计 分支结构程序设计的关键在于准确地知道操作结果影响的标志位状态和正确地使用条件 转移指令。根据对条件的判断而选择不同的处理方法是人的基本智能体现。计算机根据对标 志位的判断而决定程序流向的条件转移指令表明计算机能实现这种智能。当我们运用条件转 移指令去解决具体问题时,能否达到预期目的,主要取决于编程人员的思维是否符合逻辑, 以及能否正确使用相应的条件转移指令。 在这一节里我们通过具体的例子来说明分支程序的设计。 第六章 汇编程序设计及高级汇编语言技术 166 例例 6.2.1:设内存中有三个互不相等的无符号字数据,分别放在 ARG开始的字单元,编 制程序将其中最大值存入 MAX单元。 分析:求三个无符号数中的最大值,只要把三个数据两两比较,用 JA/JNB/JNA/JB/JC 等指令就可判断两数的大小,从而选出其中最大值。 源程序如下: LEA SI,ARG MOV AX,SI MOV BX,SI+2 CMP AX,BX JAE FMAX1 MOV AX,BX FMAX1: CMP AX,SI+4 JAE FMAX2 MOV AX,SI+4 FMAX2: MOV MAX,AX MOV AH,4CH INT 21H CSEG ENDS SSEG SEGMENT STACK STK DB 20 DUP (0) SSEG ENDS DSEG SEGMENT ARG DW 7138H,84A6H,29EH MAX DW ? DESG ENDS CSEG SEGMENT ASSUME CS:CSEG,DS:DSEG,SS:SSEG FMAX:MOV AX,DSEG MOV DS,AX MOV AX,SSEG MOV SS,AX MOV SP,SIZE STK 6.3 循环程序设计 6.3.1 循环程序设计概述 有时我们会需要能按一定规律,多次重复执行的一串语句,这类程序叫循环程序。我们 在这里将向大家介绍循环程序的结果和控制方法以及循环程序的设计方法。 循环程序一般由四个部分组成: (1)置循环初值部分:这是为了保证循环程序能正常进行循环操作而必须做的准备工 作。循环初值分两类:一类是循环工作部分的初值,另一类是控制循环结束条件的初值。 (2)工作部分:即需要重复执行的程序段。这是循环的中心,称之为循环体。 (3)修改部分:按一定规律修改操作数地址及控制变量,以便每次执行循环体时得到新 的数据。 (4)控制部分:用来保证循环程序按规定的次数或特定条件正常循环。 循环程序常见的结构形式如图 6.3.1 所示。其中工作部分与修改部分有时互相包含、互 相交叉,不一定能明显分开。 图 6.3.1 循环程序的结构图 第六章 汇编程序设计及高级汇编语言技术 167 例例 6.3.1:已知道有 n 个元素存放在以 BUF为首址的字节存储区中,试统计其中负元素 的个数。显然,每个元素为一个 8位有符号二进制数。统计其中负元素个数的工作可用循环 程序实现。 存储单元及寄存器分配如下: BX: BUF存储区的地址指针,初值为 BUF的偏移地址,每循环一次之后,其值增 1。 CX:循环计数器,初值为 BUF区中元素的个数 n,每循环一次之后,其值减 1。 AX:用来记录负元素的个数,初值为零。 字变量 R:用来存放负元素的个数。 统计负元素个数流程图的循环结构类同于上图中的图 1。在控制部分之后,用(AX)R 将负元素个数送入了字变量 R 之中。 源程序如下: MOV CX,N MOV AX, 0 LOPA: CMP BX, BYTE PTR 0 JGE NEXT INC AX NEXT: INC BX DEC CX JNE LOPA MOV R,AX MOV AH,4CH INT 21H CODE ENDS END BEGIN STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS DATA SEGMENT BUF DB 2,5,-3,6,100 BUF DB 0,-20,-9,8,-110,20 N = $-BUF R DW ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK BEGIN:MOV AX,DATA MOV DS,AX LEA BX,BUF 该程序的循环体被重复执行了 n 次,即当(CX)=N,N-1,1 时循环执行,当(CX)=0 时结束循环,将负元素个数送入字变量 R 中之后,返回 DOS状态。程序执行后,R 中是负 号元素个数 5。注意:在循环程序中,置初值部分总是处于四个部分的首位。在向循环体或 控制部分转移时,千万不要转到置初值部分,否则会出现死循环。例如,若不小心将例题中 的标号 LOPA上移两行,即移到“MOV CX,N“处,将导致系统死循环。 6.3.2 循环程序设计 1. 循环的控制方法 如何控制循环程序设计中一个重要环节。下面介绍最常见的两种控制方法:计数控制 和条件控制。 (1) 计数控制 当循环次数已知时,通常使用计数控制法。假设循环次数为 n,常常用以下三种方法实 现计数控制和条件控制。 1) 先将循环次数 n 送入循环计数器中,然后,每循环一次,计数器减 1,直至循环计数 器中的内容为 0 时结束循环。如: MOV CX,n ;循环初值部分 LOOPA: ;工作部分 ;修改部分 DEC CX ;控制部分 第六章 汇编程序设计及高级汇编语言技术 168 JNZ LOOPA 其中工作部分、修改部分被重复执行 n 次,即当(CX)=n,n-1,1 时,重复执行循 环体,当(CX)=0 时,结束循环。 2) 先将循环次数的负值送入循环计数器中,然后每循环一次,计数器加 1,直至计数器 中的内容为零时结束循环。例如: MOV CX,-n ;置循环初值部分 L0OPA: ;工作部分 ;修改部分 INC CX ;控制部分 JNZ LOOPA 其中工作部分、修改部分被重复执行 n 次,即当(CX)= -n,-(n-1),-1 时重复执 行,当(CX)=0 时结束循环。 3) 先将 0 送入循环计数器中,然后没循环一次,计数器加 1,直到循环计数器的内容与 循环次数 n相等时退出循环。例如: MOV CX,0 ;置循环初值部分 LOOPA: ;工作部分 ;修改部分 INC CX ;修改部分 CMP CX,n JNE LOOPA 其中,工作部分、修改部分重复执行 n 次,即当(CX)=0,1,n-1 时重复执行,当 (CX)=n 时结束循环。 (2) 条件控制 有些情况下,循环次数事先无法确定,但它与问题的某些条件有关。这些条件可以通过 指令来测试。若测试比较的结果表明满足循环条件,则继续循环,否则结束循环。 例例 6.3.2:统计 AX寄存器中
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号