已阅读5页,还剩99页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
教学目的和要求: 本章介绍了程序的基本结构和设计方法,通过本章的学习,重点掌握各类程序结构(顺序结构、分支结构、循环结构及子程序结构)的特征,以及应用场合。,第5章 汇编语言程序设计,汇编语言:用指令的助记符、符号地址、标 号、伪指令等符号书写的语言。 汇编语言源程序: 用汇编语言编写的程序。 汇编: 把汇编语言源程序自动翻译成机器 语言(目的程序)的过程。 汇编程序:完成汇编任务程序。,5.1 汇编语言的语句格式,汇编语言编写的源程序是由许多语句组成的。每条语句由14个部分组成,格式如下: 名字 助记符 操作数 注释 根据不同指令功能,其中用方括号括起来的部分,可以有,也可以没有。编写语句时每部分之间要用空格分开,这些部分可以在一行输入,以便用户阅读源程序。 LOOPER: MOV AL,DATA2SI ; 取一个字节加数 DATA1 DB 0F8H,60H,0ACH,74H,3BH ;被加数,DATA1,(1)名字 这是给指令或某一存储单元地址所起的名称,常作为一段程序的开头,一个数据块的开头。 在指令语句中这个名字是一个标号,语句中的标号实质上是指令的符号地址。并非每条指令语句必须有标号,但如果一条指令前面有一标号,则程序中其他地方就可以引用这个标号。 标号使用要注意: 标号可以由字母、数字和下划线组合,一个标号的最大长度不能超过31个字符。 标号不能以数字开头,但数字可以出现在标号符的中间或末尾。,标号有三种属性:段、偏移量和类型。 标号的段属性是定义标号在程序段的段地址。当程序中引用一个标号时,该标号的段值应在CS寄存器中。 标号的偏移量属性表示标号所在段的起始地址到定义该标号的地址之间的字节数。偏移量是一个16位无符号数。 标号的类型属性有两种:NEAR和FAR。前一种标号可以在段内被引用,地址指针为2字节;后一种标号可以在其他段被引用,地址指针为4字节。如果定义一个标号时后跟冒号,则汇编程序确认其类型为NEAR。,伪指令语句中的名字可以是变量名、段名、过程名。与指令语句中的标号不同,不同的伪指令对于是否有名字有不同的规定。伪指令语句的名字后面通常不跟冒号,这是它和标号的一个明显区别。 很多情况下伪指令语句中的名字是变量名。变量名代表存储器中一个数据区的名字。例如,例5.1中的DATA1、DATA2就是变量名。,变量也有三种属性:段、偏移量和类型。 变量的段属性是变量所代表的数据区所在段的段地址。由于数据区一般在存储器的数据段中,因此变量的段地址常常在DS和ES寄存器中。 变量的偏移量属性是该变量所在段的起始地址与变量的地址之间的字节数。 变量的类型属性有BYTE(字节)、WORD(字)、 DWORD (双字)、 QWORD (四字)、TBYTE(十字)等,表示数据区中存取操作对象的大小。,(2)助记符 助记符是表示不同操作的指令,可以是指令的助记符,也可以是伪指令。 (3)操作数 操作数是指令执行的对象。 (4)注释 在汇编语言源程序中,为了便于理解和阅读程序,常常加上注释。注释要用分号打头,在汇编过程中,对注释不做处理。 标号 助记符 操作数 注释 MOV AL,BL RET ; 子程序返回指令 START: MOV AX, DATA ;以START标号为程序开头 ABC EQU 2000H ; 将2000H赋值给ABC,5.2 常数,汇编语言程序中经常使用的常数有以下几种: 二进制数:以字母B结尾的,由0和1组成的数字序列。如:10101011B。 八进制数:以字母Q或O结尾的0 7的数字序列。如:23Q,24O。 十进制数:09的数字序列,可以用字母D结尾,也可以省略。如:183D。 十六进制数: 以H字母结尾的, 由数字0 9和字母A F组成的序列 3ACFH,0AFH。 凡是以字母AF为起始的一个十六进制数,必须在其前面加数字“0”,否则汇编程序会认为是标识符。,实数:它由整数、小数和指数3部分组成。如:5421E-4 字符串常数:用单引号括起来的一个或多个字符,这些字符以ASCII码形式存储在内存中。如:ABC,在内存中就是41H、42H、43H。 5.3 伪指令 伪指令用来为汇编程序提供某些信息,让汇编程序在汇编过程中执行某些特定的功能。如伪指令可以指定一个程序的数据段从哪里开始,可以指定堆栈区的大小,等等。 伪指令与指令的本质差别是,在汇编过程中伪指令并不形成任何代码,不直接命令CPU去执行什么操作,伪指令是给汇编程序的命令,在汇编过程中由汇编程序进行处理,如分配存储区、定义段等。,常用的伪指令有以下几种: 1. 标号赋值伪指令EQU EQU伪指令用来对一个标号赋值。例如: ABC EQU 2400H ;使ABC为数值2400H STR EQU 64*1024 2定义存储单元的伪指令DB、DW、DD、DQ、DT 伪指令DB和DW等用来给出程序中所需要的数据、字符串、地址表。该类伪指令用来为一个数据项分配存储单元,用一个符号名与这个存储单元相联系,且为这个数据提供一个任选的初始值。 DB用来规定字节,DW用来规定字,DD用来规定双字,DQ用来规定4个字,DT用来规定10个字。例如: DATA DB 24H,32H 表示从DATA地址单元开始,连续存入24H,32H,共占用2个字节的地址。,DATA DW 4142H 汇编时会把41H与42H分别放到与DATA相联系的两个连续的字节单元中(一个字)。42H放在地址低字节,41放在地址高字节。 DATA DB ?,? 汇编程序分配两个字节单元,以DATA地址单元开始的两个单元可预置任何内容。 STRING DB ABCD 以STRING为起始地址单元,为字符串中的每一个字符分配一个字节单元,字符串自左至右以字符的ASC码按地址递增的排列顺序依次存放41H,42H,43H,44H。 BUFFER DB 20H DUP(?) DUP为重复操作符 表示保留20H个字节,每个字节可预置任意内容。 BUFFER DB 50 DUP(0) 表示以BUFFER为首地址的50个字节中都存放同一数据00H。,3定义存储单元类型的伪指令BYTE、WORD、DWORD 利用这些伪指令,可以对存储单元的类型进行规定。例如: MOV BYTE PTRDI ,00H MOV WORD PTR1000H,00H JMP DWORD PTR2000H 第一个语句使DI所指的1个单元清0; 第二个语句使1000H所指的1个字即2个单元清0: 第三个语句使程序转移到另外一个段的某个单元,转移地址放在2000H开始的4个单元,前两个单元中的内容作为转移地址的偏移量,后面两个单元中的内容作为转移地址的段 值。,4段定义伪指令SEGMENT、 ENDS、ASSUME、ORG 伪指令SEGMENT和ENDS总是成对使用的。用这一对伪指令可以将汇编语言源程序分成几个段,通常分为数据段、堆栈段和代码段。代码段主要有指令和其他伪指令;对于数据段和附加段主要有定义数据区的伪指令。 例: 数据段、堆栈段两段程序框架。 DATA SEGMENT M1 DW 2478H M2 DW 6758H P1 DW ? P2 DW ? DATA ENDS STACK SEGMENT DW 20 DUP(?) ;定义20个字存储空间 STACK ENDS,伪指令ASSUME用来告诉汇编程序有关段寄存器与逻辑段的关系,哪一个段为数据段,哪一个段为堆栈段,哪一个段为代码段。并没有给段寄存器赋予实际的初值,真正将段地址装入段寄存器还需要由传送指令在执行时赋值(CS除外)。例如: CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS, AX CODE ENDS,ORG伪指令用来规定该伪指令后面的源程序或数据块存放的起始地址 例如,在源程序的第一条指令前用了如下伪指令: ORG 2000H 汇编程序将把指令指针IP的值置成2000H,即目标程序的第一个字节放在2000H处。 5定义过程的伪指令PROC、ENDP 伪指令PROC和ENDP总是成对出现的,这两条伪指令之间的内容就作为一个过程,即一个子程序。 格式: 过程名 PROC NEAR/FAR RET 过程名 ENDP,其中PROC伪指令定义一个过程(子程序),赋予过程一个名字,并指出该过程的属性为NEAR或FAR。如果没有特别指明类型,则认为过程的类型是NEAR。 如果对应的子程序头部标有FAR,则产生一个段间调用地址,它包括16位的段地址和16位的偏移量;如果子程序头部标有NEAR,则为段内调用。 当一个程序段被定义为过程后,程序中其他地方就可以用 CALL指令调用这个过程。调用一个过程的格式为: CALL 过程名,例: CODE SEGMENT APRC PROC ADD AX, BX : RET APRC ENDP STAT: MOV AX, NUM : CALL APRC : CODE ENDS END STAT,6程序结束伪指令END 伪指令END是源程序的结束标志,该指令并不和其他伪指令成对使用。 汇编程序在对源程序进行汇编的过程中,遇到END,便得知源程序到此结束。 例如: END START,5.4 汇编语言源程序的结构,汇编语言源程序建立在段结构的基础上,一个段就是一些指令和数据的集合。 一个汇编语言源程序,根据程序用途被划分成几段,如数据段、堆栈段、附加段和程序段(码段),用CS、DS、SS、ES段寄存器存放段值。这样就构造了源程序的基本格式:,DATA SEGMENT 存放数据项的数据段 DATA ENDS EXTRA SEGMENT 存放数据项的附加数据段 EXTRA ENDS STACKl SEGMENT 设置堆栈段 STACKl ENDS CODE SEGMENT ASSUME CS: CODE DS: DATA ASSUME SS: STACK1 ES: EXTRA BEING: MOV AX, DATA MOV DS, AX 存放指令序列 CODE ENDS END BEING,例:要求将两个5字节十六进制数相加, 3B74AC60F8H+20D59E36C1H=? 可以编写出以下汇编语言源程序。 DATA SEGMENT ;定义数据段 DATA1 DB 0F8H,60H,0ACH,74H,3BH ;被加数 DATA2 DB 0C1H,36H,9EH,0D5H,20H ;加数 DATA ENDS ;数据段结束 CODE SEGMENT ;定义代码段 ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS, AX ;初始化DS,图被加数和加数在内存中的存放情况,MOV CX,5 ;循环次数送CX MOV SI,0 ;置SI初值为0 CLC ;清CF标志 LOOPER:MOV AL,DATA2SI ;取一个字节加数 ADC DATA1SI,AL ;与被加数相加 INC SI ;SI加1 DEC CX ;CX减1 JNZ LOOPER ;若不等于0,转LOOPER MOV AH,4CH INT 21H ;返回DOS状态 CODE ENDS ;代码段结束 END START ;源程序结束,5.5 汇编语言程序的上机过程,在计算机上建立和运行汇编语言程序时,首先要用编辑程序(如行编辑程序EDLIN或全屏幕编辑程序EDIT等)建立汇编语言源程序(其扩展名必须为 .ASM)。源程序就是用汇编语言的语句编写的程序。汇编语言源程序是不能被计算机所识别和运行的,必须经过汇编程序(MASM或ASM)加以汇编(翻译), 把源程序文件转换成为用机器码(二进制代码)表示的目标程序文件(其扩展名为.OBJ)。若在汇编过程中没有出现语法错误,则汇编结束后,还必须经过连接程序(LINK)把目标程序文件与库文件或其他目标文件连接在一起形成可执行文件(其扩展名为.EXE文件)。这时就可以在DOS下直接键入文件名运行此程序。,在计算机上运行汇编语言程序的步骤是: (1) 用编辑程序(EDIT)建立ASM源程序文件。 (2) 用汇编程序(MASM或ASM)把ASM文件汇编成OBJ 文件。 (3) 用连接程序(LINK)把OBJ文件转换成EXE文件。 (4) 在DOS命令状态下直接键入文件名就可执行该文件。,5.5.1 用编辑程序建立汇编语言源程序文件(ASM文件) 例如,我们要建立一个求从1开始连续50个奇数之和的汇编语言源程序,可以在DOS模式下用编辑程序EDIT.EXE建立汇编语言源程序文件MBA.ASM。例如: C: EDIT MBA.ASM 进入EDIT的程序编辑画面时, 输入汇编语言源程序如下:,DATA SEGMENT SUM DW 0 DATA ENDS,CODE SEGMENT ASSUME DS:DATA, CS:CODE START: MOV AX , DATA ;将DS初始化 MOV DS , AX MOV CX , 50 MOV AX , 0 MOV BX , 1 NEXT: ADD AX , BX INC BX INC BX ;求下一个奇数 DEC CX JNE NEXT ;未计够50次转至NEXT MOV SUM , AX MOV AH , 4CH INT 21H ; 返回DOS 状态 CODE ENDS END START,注意:程序输入完毕后,一定要将源程序文件存入盘中,以便进行汇编和连接,也可以再次调入源程序进行修改。,5.5.2 用汇编程序MASM将ASM文件汇编成目标程序文件(OBJ文件) 在对源程序文件(简称ASM文件)汇编时,汇编程序将对ASM文件进行两遍扫描,若程序文件中有语法错误,则结束汇编后,汇编程序将指出源程序中存在的错误,这时应返回编辑环境修改源程序中的错误,再经过汇编,直到最后得到无错误的目标程序,即OBJ文件。因此,汇编程序的主要功能可以概括为以下三点:,(1) 检查源程序中的语法错误,并给出错误信息。 (2) 产生目标程序文件(OBJ文件)。 (3) 展开宏指令。 完成汇编功能的是汇编程序ASM或宏汇编程序MASM,二者的区别在于:MASM有宏处理功能,而ASM没有宏处理功能,因此,MASM比ASM的功能强大,但MASM需要占据较大的内存空间,当内存空间较小时(如64 KB),只能使用ASM。,汇编过程如下: 当源程序建立以后,仍以MBA.ASM程序为例,我们用汇编程序MASM对MBA.ASM源程序文件进行汇编,以便产生机器码的目标程序文件MBA.OBJ,其操作步骤如下: C:MASM MBA Microsoft (R) Macro Assembler Version 5.00 Copyright (C) Microsoft Corp 19811985,1987. All rights reserved. Object filename MBA.OBJ: Source listing NUL.LST:MBA Cross-reference NUL.CRF:MBA,50468 + 303948 Bytes symbol space free 0 Warning Errors 0 Severe Errors,由此可知,汇编程序调入后,首先显示版本号,然后出现三个提示行。 第一个提示行为: Object filename MBA.OBJ: 这是询问目标程序文件名,方括号内为机器规定的默认的文件名,通常直接按回车键,表示采用默认的文件名(如上所示),这是我们汇编的主要目的。,第二个提示行为: Source listing NUL.LST: 这是询问是否建立列表文件。若不建立,直接回车;若要建立,则输入文件名再回车(如上所示,表示要建立名为MBA的列表文件)。列表文件中同时列出源程序和机器语言程序清单,并给出符号表,有利于程序调试。,第三个提示行为: Cross-reference NUL.CRF: 这是询问是否要建立交叉索引文件。若不建立,则直接回车;若要建立,则应输入文件名(如上所示,表示要建立MBA.CRF文件)。为了建立交叉索引文件,还必须调用CREF.EXE程序,即输入:,C:CREF MBA Microsoft (R) Cross-Reference Utility Version 5.00 Copyright (C) Microsoft Corp 19811985,1987. All rights reserved. listing MBA.REF: 11 Symbols,这时首先显示版本号,然后出现一个提示行: Listing MBA.REF: 这是询问交叉索引文件名。这时可用回车承认方括号内机器默认的文件名,如上所示。这样就建立了MBA.REF文件。其内容是用户定义的所有符号(包括变量),并给出每个符号定义所在的行号(附以)以及引用的行号。,调入汇编程序,当我们回答了上述各提示行的询问之后,汇编程序就对源程序进行汇编。若汇编过程中发现源程序有语法错误,则列出有错误的语句和错误的代码。错误分警告错误(Wraning Errors)和严重错误(Severe Errors)。 警告错误是指汇编程序认为的一般性错误;严重错误是指汇编程序认为无法进行正确汇编的错误,并给出错误的个数及行号、错误的性质等。这时,就要对错误进行分析,找出问题和原因,然后再调用编辑程序加以修改,修改后重新汇编,直到汇编后无错误为止。,5.5.3 用连接程序LINK生成可执行程序文件(EXE文件) 经汇编后产生的二进制的目标程序文件(OBJ文件)并不是可执行程序文件(EXE文件),必须经连接以后,才能成为可执行文件。连接程序并不是专为汇编语言程序设计的。如果一个程序是由若干个模块组成的,也可通过连接程序LINK把它们连接在一起。这些模块可以是汇编程序产生的目标文件,也可以是高级语言编译程序产生的目标文件。,连接过程如下: C:LINK MBA Microsoft (R) Overlay Linker Version 3.60 Copyright (C) Microsoft Corp 1983-1987. All rights reserved. Run File MBA.EXE: List File NUL.MAP:MBA Libraries .LIB:,由此可知,在连接程序调入后,首先显示版本号,然后出现三个提示行。 第一个提示行为: Run File MBA.EXE: 这是询问要产生的可执行文件的文件名。一般直接回车采用方括号内规定的隐含文件名。 第二个提示行为: List File NUL.MAP: 这是询问是否要建立连接映象文件。若不建立,则直接回车;若要建立,则输入文件名再回车。我们这里是要建立该文件,则输入文件名MBA。,第三个提示行为: Libraries .LIB: 这是询问是否用到库文件。若无特殊需要,则直接回车即可。 上述提示行回答后,连接程序开始连接。若连接过程中有错,则显示错误信息,错误分析清楚后,要重新调入编辑程序进行修改,然后重新汇编,再经过连接,直至无错为止。连接以后,便产生了可执行程序文件(EXE文件)。,5.5.4 程序的执行 当我们建立了可执行文件MBA.EXE后,就可直接在DOS下执行该程序: C:MBA C: 程序运行结束并返回DOS。这里我们并未看到运行结果。怎么知道程序运行已经结束?又怎么知道程序已返回DOS?下面我们来讨论这些问题。,5.5.5 汇编语言和DOS操作系统的接口 当编写的汇编语言源程序是在DOS环境下运行时,必须了解汇编语言是如何同DOS操作系统接口的。 当我们用编辑程序把源程序输入到机器中,用汇编程序把它转换为目标程序,用连接程序对其进行连接和定位时,操作系统为每一个用户程序建立了一个程序段前缀区PSP,其长度为256个字节,主要用于存放所要执行程序的有关信息,同时也提供了程序和操作系统的接口。操作系统在程序段前缀的开始处(偏移地址0000H)安排了一条INT 20H软中断指令。INT 20H中断服务程序由DOS提供,执行该服务程序后,控制就转移到DOS,即返回到DOS管理的状态。因此,用户在组织程序时,必须使程序执行完后能去执行存放于PSP开始处的INT 20H指令,这样便返回到DOS,否则就无法继续键入命令和程序。,DOS在建立了程序段前缀区PSP之后,就将要执行的程序从磁盘装入内存。在定位程序时,DOS将代码段置于PSP下方,代码段之后是数据段,最后放置堆栈段。内存分配好之后,DOS就设置段寄存器DS和ES的值,以使它们指向PSP的开始处,即INT 20H的存放地址,同时将CS设置为PSP后面代码段的段地址,IP设置为指向代码段中第一条要执行的指令位置,把SS设置为指向堆栈的段地址,让SP指向堆栈段的栈底(取决于堆栈的长度),然后系统开始执行用户程序。 为了保证用户程序执行完后能返回到DOS状态,可使用如下两种方法。,1标准方法 首先将用户程序的主程序定义成一个FAR过程,其最后一条指令为RET。然后在代码段的主程序(即FAR过程)的开始部分用如下三条指令将PSP中INT 20H 指令的段地址及偏移地址压入堆栈: PUSH DS ;保护PSP段地址 MOV AX,0 ;保护偏移地址0 PUSH AX 这样,当程序执行到主程序的最后一条指令RET时,由于该过程具有FAR属性,故存在堆栈内的两个字就分别弹出到CS和IP,从而执行INT 20H指令,使控制返回到DOS状态。返回DOS的标志就是程序运行完后出现一个DOS的标识符,如C)。,2. 非标准方法 在用户的程序中不定义过程段,只在代码段结束之前(即CODE ENDS之前)增加两条语句: MOV AH,4CH INT 21H 则程序执行完后也会自动返回DOS状态。,说明:由于开始执行用户程序时,DS并不设置在用户的数据段的起始处,ES同样也不设置在用户的附加段起始处,因而在程序开始处(或在保护了PSP段地址和偏移地址0以后),应该使用以下方法重新装填DS和ES的值使其指向用户的数据段: MOV AX,段名 MOV 段寄存器名,AX ;段寄存器名可以是DS、ES、SS之一,5.5.6. 常用系统功能调用和BIOS中断调用 微型计算机系统为汇编用户提供了两个程序接口,一个是DOS系统功能调用,另一个是ROM中的BIOS(Basic Input/Output System)。系统功能调用和BIOS由一系列的服务子程序构成,但调用与返回不是使用子程序调用指令 CALL和返回指令RET,而是通过软中断指令INT n 和中断返回指令IRET调用和返回的。 DOS系统功能调用和BIOS的服务子程序,使得程序设计人员不必涉及硬件就可以使用系统的硬件,尤其是I/O的使用与管理。,1系统功能调用 系统功能调用是微机的磁盘操作系统DOS为用户提供的一组例行子程序,因而又称为DOS系统功能调用。这些子程序可分为以下四个主要方面: (1) 磁盘的读/写及控制管理。 (2) 内存管理。 (3) 基本输入/输出管理(如键盘、打印机、显示器等)。 (4) 其他管理(如时间、日期等)。,为了使用方便,系统已将所有子程序按顺序编号,称为调用号。其调用号为075H,如表5.4所示。表中只列出了基本输入/输出管理中部分键盘和显示器DOS功能调用。 对于所有的功能调用,使用时一般需要经过以下三个步骤: (1) 子程序的入口参数送相应的寄存器。 (2) 子程序编号送AH。 (3) 发出中断请求:INT 21H(系统功能调用指令)。,表5.4 键盘和显示器的DOS调用,1) 1号功能调用 调用格式: MOV AH,1 INT 21H 系统执行该功能时将扫描键盘,等待键入。一旦有键按下,就将键值(相应字符的ASCII码值)读入,先检查是否是CtrlBreak。若是,则退出命令执行;否则将键值送入AL寄存器,同时将这个字符显示在屏幕上。,2) 2号功能调用 调用格式: MOV DL,待显示字符的ASCII码 MOV AH,2 INT 21H 本调用执行后,显示器显示其ASCII码值放入DL中的字符。,3) 9号功能调用 调用格式: MOV DX,待显示字符串首字符的偏移地址 MOV AH,9 INT 21H,本调用执行后,显示器显示待显示的字符串。调用时,要求DS:DX必须指向内存中一个以“$”作为结束标志的字符串。例如:,4) 10号功能调用 调用格式: MOV DX,数据区的首偏移地址 MOV AH,10 INT 21H 该功能调用将从键盘接收的字符串送到内存数据区。要求事先定义一个数据区,数据区内第一个字节指出数据区能容纳的字符个数,不能为零;第二个字节保留,以用做填写实际输入的字符个数;从第三个字节开始存放从键盘上接收的字符串。实际输入的字符数少于定义的字节数,数据区内其余字节填零;若多于定义的字节数,则后来输入的字符丢掉,且响铃。调用时,要求DS:DX指向数据区首地址。例如:,2常用系统功能调用应用举例 例5.5 利用DOS系统功能调用实现人机对话。 下述程序可以在屏幕上显示一行提示信息,然后接收用户从键盘输入的信息并将其存入内存数据区。,DATA SEGMENT PARS DB 100 ;定义输入缓冲区 DB ? DB 100 DUP(?) MESG DB WHAT IS YOUR NAME ? ;要显示的提示信息 DB $ ;提示信息结束标志 DATA ENDS,STACK SEGMENT PARA STACK STACK DB 100 DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START PROC FAR BEGIN:PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX,DISP: MOV DX,OFFSET MESG MOV AH,9 ;利用9号功能调用显示提示 INT 21H KEYBD:MOV DX,OFFSET PARS MOV AH,10 ;利用10号功能调用接收键盘输入 INT 21H RET ;返回DOS START ENDP CODE ENDS END BEGIN,5.6 汇编语言程序设计的基本方法,1. 顺序程序设计 顺序程序是一种最简单的程序,也称为直线程序,它的执行自始至终按照语句出现的先后顺序进行。 例5.8 求两个数的平均值。这两个数分别放在x单元和y单元中,而平均值放在z单元中。程序如下: DATA SEGMENT x DB 95 y DB 87 z DB ?,DATA ENDS CODE SEGMENT MAIN PROC FAR ASSUME CS:CODE,DS:DATA START:PUSH DS MOV AX,0 PUSH AX MOV AX,DATA ;装填数据段寄存器DS MOV DS,AX MOV AL,x ;第一个数送入AL,ADD AL,y ;两数相加,结果送AL MOV AH,0 ADC AH,0 ;带进位加法,进位送AH MOV BL,2 ;除数2送BL DIV BL ;AX/BL, 求平均值送AL MOV z,AL ;结果送入z单元 RET MAIN ENDP CODE ENDS END START,例5.9 在内存中自tab开始的16个单元连续存放着015的平方值(平方表),任给一个数x(0x15),如13,且存放在x单元中,查表求x的平方值,并把结果送入y单元中。 分析 : 根据给出的平方表,分析表的存放规律,可知表的起始地址与数之和,正是的平方值所在单元的地址,由此编制程序如下:,DATA SEGMENT tab DB 0,1,4,9,16,25,36,49,64,81 DB 100,121,144,169,196,225 x DB 13 y DB ? DATA ENDS,tab,tab+1,tab+2,tab+3,CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX LEA BX,tab MOV AH,0 MOV AL,x ADD BX,AX MOV AL,BX MOV y,AL MOV AH,4CH INT 21H CODE ENDS END START,2. 分支程序设计 许多实际问题并不能设计成顺序程序,需要根据不同的条件作出不同的处理。把不同的处理方法编制成各自的处理程序段,运行时由机器根据不同的条件自动作出选择判断,绕过某些指令,仅执行相应的处理程序段。按这种方式编制的程序,执行的顺序与指令存储的顺序失去了完全的一致性,称之为分支程序。 分支程序实现方法: 利用改变标志位的指令和转移指令。,转移指令有JMP和Jcc两类。前者是无条件转移指令,后者是条件转移指令。JMP无条件转移指令将控制转向其后的目的标号指定的地址。Jcc条件转移指令跟随在能改变状态标志的指令之后,根据条件决定是否将控制转向其后的目的地址处。,例5.10 给定以下符号函数:,任意给定x值,假定为25,且存放在x单元,函数值y 存放在y单元,根据x的值确定函数y的值。程序流程图如图5.6所示。,图5.6 实现符号函数程序的流程图,程序如下: DATAX SEGMENT x DB 25 y DB ? DATAX ENDS CODEX SEGMENT MAIN PROC FAR ASSUME CS:CODEX,DS:DATAX,START: PUSH DS MOV AX,0 PUSH AX MOV AX,DATAX MOV DS,AX MOV AL,x ;ALx CMP AL,0 JGE LOOP1 ;x0时转LOOP1 MOV AL,0FFH ;否则将1送入y单元 MOV y,AL RET,LOOP1:JE LOOP2 ;x=0时转LOOP2 MOV AL,1 ;否则将1送入y单元 MOV y,AL RET LOOP2:MOV AL,0 ;将0送入y单元 MOV y,AL RET MAIN ENDP CODEX ENDS END START,例5.11 设有首地址为arry的字数组,已按升序排好,数组长度为n(假设n15),且数据段与附加段占同一段,在该数组中查找数number(假设等于83)。若找到它,则从数组中删掉;若找不到,则把它插入正确位置,且变化后的数组长度在DX中。 根据题意编写程序如下:,DATAJ SEGMENT DW ? n DW 15 number DW 83 arry DW 5,10,17,21,28,32,41,50,56,67,72 DW 88,95,125,150 DATAJ ENDS,arry,arry+1,CODMA SEGMENT MAIN PROC FAR ASSUME CS:CODMA,DS:DATAJ,ES:DATAJ START:PUSH DS SUB AX,AX PUSH AX PUSH ES MOV AX,DATAJ MOV DS,AX PUSH DS POP ES ;数据段与附加段占同一段,MOV AX,number ;待查找的数放入AX MOV DX,n ;初始化DX MOV CX,n ;设置计数器CX MOV DI,OFFSET arry ;arry的有效地址放入DI CLD ;清方向标志 DF0 REPNE SCASW ;用重复串扫描指令进行查找 ; (AX) ( (ES: (DI) ; (DI) (DI)+2 JE DELETE ;等于0,ZF=1,找到 则转到DELETE DEC DX MOV SI,DX ADD SI,DX,TT3: CMP AX,arrySI JL TT1 ;小于 则转到TT1 MOV arrySI+2,AX ;功能是:若没有查到, JMP TT2 ;则将此数插入正确位置 TT1: MOV BX,arrySI MOV arrySI+2,BX SUB SI,2 JMP TT3 TT2:ADD DX,2 ;修改数组长度 JMP FAN DELETE:JCXZ NEXT,LOOPT: MOV BX,DI ;此程序段功能是:若查找到, MOV DI2,BX ;则从数组中删除该数 ADD DI,2 LOOP LOOPT NEXT: DEC DX ;修改数组长度 FAN: POP ES RET MAIN ENDP CODMA ENDS END START,3. 循环程序设计,(1)循环程序的结构,图5.7 循环程序的基本结构 (a) 先执行后判断;(b) 先判断后执行,(1) 初始化部分:建立循环初始值。如设置地址指针、计数器、其他循环参数的起始值等。 (2) 工作部分:在循环过程中所要完成的具体操作,是循环程序的主要部分。这部分视具体情况而定。它可以是一个顺序程序、一个分支程序或另一个循环程序。 (3) 修改部分:为执行下一个循环而修改某些参数。如修改地址指针、其他循环参数等。,(4) 控制部分:判断循环结束条件是否成立 用计数控制循环适合已知循环次数的循环 用条件控制循环适合未知循环次数的循环 (5)结束处理部分:对循环结束进行适当处理,如存储结果等。有的循环程序可以没有这部分。 图5.7(a)给出的循环程序框图是“先执行后判断”的结构;另有一种结构形式是“先判断后执行”的形式,如图5.7(b)所示,这种结构仍由五个部分组成,但是重新安排了中间三个部分的顺序。从框图可以看出它的最大优点是可以一次也不执行循环,也就是说可以设计为零次循环的程序。,2循环控制方法 1) 用计数控制循环 这种方法直观、方便,易于程序设计。只要在编制程序时,循环次数已知,就可以使用这种方法设计循环程序。 例5.12 从xx单元开始的30个连续单元中存放有30个无符号数,从中找出最大者送入yy单元中。 根据题意,我们把第一个数先送入AL寄存器,将AL中的数与后面的29个数逐个进行比较。如果AL中的数较小,则两数交换位置;如果AL中的数大于等于相比较的数,则两数不交换位置。在比较过程中,AL中始终保持较大的数,比较29次,则最大者必在AL中。最后把AL中的数(最大者)送入yy单元。,图5.8 从一批数中求最大者的程序流程图,程序如下: DATASP SEGMENT xx DB 73,59,61,45,81 DB 107,37,25,14,64 DB 3,17,9,23,55,97 DB 115,78,121,67 DB 215,137,99,241 DB 36,58,87,100,74,62 yy DB ? DATASP ENDS,CODESP SEGMENT ASSUME CS:CODESP,DS:DATASP MAIN PROC FAR START: PUSH DS MOV AX,0 PUSH AX MOV AX, DATASP MOV DS,AX MOV AL,xx MOV SI,OFFSET xx MOV CX,29,LOOP1: INC SI CMP AL,SI JAE LOOP2 ; ALSI XCHG AL,SI LOOP2: DEC CX JNZ LOOP1 MOV yy,AL RET MAIN ENDP CODESP ENDS END START,2) 用条件控制循环 有些情况无法确定循环次数,但可用某种条件来确定是否结束循环。这时,编制程序主要是寻找控制条件以及对控制条件的检测。 例5.13 从自然数1开始累加,直到累加和大于1000为止,统计被累加的自然数的个数,并把统计的个数送入n单元,把累加和送入sum单元。 根据题意,被累加的自然数的个数事先是未知的,也就是说,循环的次数是未知的,因此不能用计数器方法控制循环。但题目中给定一个重要条件,即累加和大于1000则停止累加,因此,可以根据这一条件控制循环。我们用CX寄存器统计自然数的个数,用AX寄存器存放累加和,用BX寄存器存放每次取得的自然数。程序的流程图如图5.9所示。,图5.9 利用条件控制循环的程序流程图,程序如下: DATAS SEGMENT n DW ? sum DW ? DATAS ENDS STACK SEGMENT PARA STACK STACK DW 200 DUP (?) STACK ENDS,CODES SEGMENT MAIN PROC FAR ASSUME CS:CODES,DS:DATAS,SS:STACK START: PUSH DS MOV AX,0 PUSH AX MOV AX,DATAS MOV DS,AX MOV AX,0 MOV BX,0 MOV CX,0,LOOPT:INC BX ADD AX,BX INC CX CMP AX,1000 JBE LOOPT ; (AX)1000,则转到LOOPT MOV n,CX MOV sum,AX RET MAIN ENDP CODES ENDS END START,4. 子程序设计 (1)子程序概念 如果在一个程序中的多处需要用到同一段程序,或者说在一个程序中需要多次执行某一连串的指令时,那么我们可以把这段要执行的程序或这一连串的指令抽取出来,写成一个相对独立的程序段,每当我们想要执行这段程序或这一
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 水上乐园建设室外施工合同
- 冶金行业定价管理办法
- 停职留薪协议书范本
- 火车站单元门定制安装合同
- 企业融资保理操作指南
- 建筑工程机械施工合同
- 教育培训机构资金引入指南
- 教育论坛活动免责承诺书
- 文化传媒劳务招投标管理规定
- 城市快速路路灯设施安装合同
- 高边坡专项施工方案专家已评审
- 氧气吸入操作评分标准(中心供氧)
- 2024年深圳公司试用期员工劳动合同范文(二篇)
- QBT 102T-2023 甜菜糖厂设计规范 (正式版)
- 气体分析实验室操作规程
- 2023年上海市闵行区中考二模语文试卷含详解
- 2024年中考道德与法治三轮复习:综合探究题 练习题(含答案)
- 高等学校教师岗前培训考试暨教师资格笔试题库及答案(易错题)
- 24秋国家开放大学《计算机系统与维护》实验1-13参考答案
- 2024年山东济南新旧动能转换起步区专职网格员招聘笔试冲刺题(带答案解析)
- 部编人教版小学六年级语文上册《习作:笔尖流出的故事》
评论
0/150
提交评论