微机原理与汇编语言 第5章 汇编语言程序设计ppt课件.ppt

微机原理与汇编语言 第5章 汇编语言程序设计ppt课件.ppt

ID:59274150

大小:778.00 KB

页数:92页

时间:2020-09-22

上传者:U-5097
微机原理与汇编语言 第5章 汇编语言程序设计ppt课件.ppt_第1页
微机原理与汇编语言 第5章 汇编语言程序设计ppt课件.ppt_第2页
微机原理与汇编语言 第5章 汇编语言程序设计ppt课件.ppt_第3页
微机原理与汇编语言 第5章 汇编语言程序设计ppt课件.ppt_第4页
微机原理与汇编语言 第5章 汇编语言程序设计ppt课件.ppt_第5页
资源描述:

《微机原理与汇编语言 第5章 汇编语言程序设计ppt课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

西安邮电学院计算机系系统结构教研室2009.8微机原理与汇编语言教材及参考书《微型计算机原理》王忠民王钰王晓婕编著《微型计算机原理》学习与实验指导王钰王劲松刑高峰编著2021年7月27日 第5章汇编语言程序设计主要内容:汇编语言源程序的格式及上机过程汇编语句源程序的编写汇编语言程序的设计(一)——顺序与分支结构汇编语言程序的设计(二)——循环结构与子程序2021年7月27日 5.1汇编语言源程序的格式及上机过程本节学习要求学会在DEBUG调试环境下察看程序结果学会简单汇编程序的编辑、运行过程掌握常见的输入及显示方法2021年7月27日 计算机语言发展过程机器语言汇编语言高级语言FORTRANBASICCOBOLPASCALC/C++/C#JAVA…...2021年7月27日 机器语言:依赖于机器的低级语言,书写格式为二进制代码。优点:执行速度快,效率高。缺点:表达的意义不直观,编写、阅读、调试较困难。汇编语言:一种符号语言,与机器语言一一对应;使用助记符优点:用户理解容易缺点:不能被机器直接识别高级语言:独立于机器的通用语言,接近人类的自然语言。优点:易学易用,可移植性较好缺点:目标代码冗长,占用内存多,执行效率不高2021年7月27日 例一编程实现c=a+b,并在屏幕上显示结果解1:用C语言实现#include"stdio.h"intmain(intargc,char*argv[]){inta,b,c;a=1;b=2;c=a+b;printf(“c=%d ",c);return0;}编译后的目标文件达到3.59KB2021年7月27日 datasegmentadb?bdb?cdb?stringdb'c=$'dataendscodesegmentmainprocfarassumecs:code,ds:dataassumees:datastart:pushdssubax,axpushaxmovax,datamovds,axmoves,axmova,1movb,2moval,aaddal,bmovc,alleadx,stringmovah,09int21haddc,30hmovdl,cmovah,2int21hmovdl,0ahint21hmovdl,0dhint21hretmainendpcodeendsendstart解2:用汇编语言实现汇编后的目标文件只有208字节2021年7月27日 汇编语言源程序的格式例二编程实现多字节加法,如S=3B74AC60F8H+20D59E36C1HF8H60HACH74H3BHC1H36H9EHD5H20H被加数、和加数DATA1DATA2……2021年7月27日 CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVCX,5MOVSI,0CLCLOOPER:MOVAL,DATA2[SI]ADCDATA1[SI],ALINCSIDECCXJNZLOOPERMOVAH,4CHINT21HCODEENDSENDSTARTDATASEGMENTDATA1DB0F8H,60H,0ACH,74H,3BHDATA2DB0C1H,36H,9EH,0D5H,20HDATAENDS2021年7月27日 汇编语言源程序的组织结构汇编语言源程序采用的是分段结构,即一个汇编语言源程序由若干段组成(一般由数据段和代码段组成),每一个段以SEGMENT语句开始,以ENDS语句结束,整个程序的结尾是END语句。在代码段中下面的内容是不可缺少的:(1)定义段(使用SEGMENT/ENDS语句定义)(2)约定段寄存器和段的关系(即物理段和逻辑段的关系,使用一个或多个ASSUME语句实现)(3)装填段寄存器(只装填数据型段寄存器)(4)设置返回DOS的方法2021年7月27日 例如:MYDARASEGMENT;定义数据段起始语句……;定义数据MYDATAENDS;定义数据段终止语句MYCODESEGMENT;定义代码段起始语句ASSUMECS:MYCODE,DS:MYDATA;约定段寄存器和段的关系START:MOVAX,MYDATA;装填相应的段寄存器MOVDS,AX……;完成所需功能的程序段MOVAH,4CH;设置返回DOSINT21HMYCODEENDS;定义代码段终止语句ENDSTART;程序结束2021年7月27日 汇编语言语句的类型和格式1.语句分类①指令性语句:也称指令语句,指令系统的指令,汇编后产生目标代码。②指示性语句:也称伪指令语句,告诉汇编程序如何汇编,汇编后不产生目标代码。③宏指令语句:自定义语句,由指令语句和伪指令语句组成的指令集合,不展开时不产生目标代码。2.语句格式汇编语言是由一条条的语句组成的,其每条语句的格式如下:2021年7月27日 [名字][语句前缀]助记符[操作数][;注释]其中带方括号的部分表示任选项,既可以有,也可以没有。(1)名字“名字”是语句的符号地址,对于指令语句,“名字”称为标号,其后必须加冒号“:”;对于伪指令语句“名字”可以是变量名、段名、过程名等,其后不能加冒号“:”。“名字”一般都有三个属性:段属性、偏移属性和类型属性。①段属性:表示“名字”所在段的起始地址(即段地址)。2021年7月27日 ②偏移属性:表示“名字”所在段的起始地址到定义该“名字”的地址之间的字节数(即偏移量)。偏移量是一个16位无符号数。③类型属性:表示该名字的数据或地址的类型。对于标号和过程名,类型属性有NEAR和FAR两种,表示只能在段内被引用还是可以在其它段被引用;对于变量类型属性有BYTE(字节)、WORD(字)、DWORD(双字)、QWORD(四字)、TBYTE(十字节)等,表示数据区中存取操作对象的大小。对于段名只有段属性,表示段的起始地址(段地址),而没有偏移属性和类型属性。2021年7月27日 (2)助记符在指令语句中,表示该指令语句的操作码,在伪指令语句中称为定义符,它们指出其语句的功能。(3)操作数操作数即为操作的对象。在指令语句中,可能有单操作数或双操作数,也可能无操作数或隐含操作数;而在伪指令中可能有更多个操作数。当操作数不止一个时,相互之间应该用逗号隔开。可以作为操作数的有:常数、寄存器、标号、变量和表达式等。2021年7月27日 1)常量:是指令在中出现的哪些固定值,可以分为数值常数和字符串常数两类。2)寄存器:8086/8088CPU的寄存器可以作为指令的操作数。3)变量:是存储器中某个数据区的名字,因此在指令中可以作为存储器操作数。4)表达式:使用运算符把常数、寄存器、标号、变量等连接起来的运算式。①表达式分为数值表达式和地址表达式两种。②表达式中常用的运算符有以下几种:2021年7月27日 算术运算符:+、-、*、/和MOD(模除,即两个整数相除后取余数)等。逻辑运算符:AND、OR、XOR、NOT等。关系运算符:EQ、NE、LT、GT、LE、GE等。分析运算符:SEG、OFFSET、TYPE、SIZE、LENGTH等。合成运算符:PTR、THIS、SHORT等。其它运算符::、LOW、HIGH等(4)注释注释是对汇编语句的功能或汇编程序的说明。2021年7月27日 上机环境硬件系统软件应用软件操作系统:DOS系统编辑器:EDIT.exe汇编程序:MASM.exe连接程序:LINK.exe用户开发的程序:ABC.exe等CPU、存储器(ROM、RAM)、I/O接口、输入、输出设备汇编语言源程序的上机过程2021年7月27日 上机过程.EXE文件手写程序.ASM文件.OBJ文件编辑程序编辑汇编程序汇编连接程序连接EDITMASMLINK有语法错误无法正常连接有算法错误2021年7月27日 (1)编辑程序DOS环境下用EDIT编辑器WINDOWS环境下用记事本(2)汇编源程序宏汇编程序MASM.EXE或小汇编程序ASM.EXE汇编程序主要有以下功能:①检查源程序中语法错误,给出错误提示信息②产生目标文件(.OBJ)、列表文件(.LST)及交叉引用文件(.CRF)③展开宏指令2021年7月27日 MASM宏汇编的提示信息及回答交叉参考文件用的文件名(缺省:无交叉参考文件)Crossreference[NUL.CRF]:(交叉参考文件名)列表文件名(缺省:无列表文件)Sourcelisting[NUL.LST]:(源列表文件名)目标文件名(缺省:源文件名.OBJ)Objectfilename[Source.OBJ]:(目标文件名)欲汇编的.ASM源文件名(缺省:命令中的文件名)Sourcefilename[.ASM]:(源文件名)回答提示信息2021年7月27日 LINK的提示信息及回答用到的库文件名(缺省:无库文件)Libraries[.LIB]:(库文件名)建立连接映象文件名(缺省:无连接映象文件)Listfile[NUL.MAP]:(连接映象文件名)欲连接的.OBJ文件名(缺省:命令中的文件名)Runfile[.EXE]:(可执行文件名)回答提示信息(3)连接目标文件通过LINK.EXE程序实现①将多模块连接,产生一个.EXE文件②连接库文件(.LIB)及产生连接映象文件(.MAP)2021年7月27日 (4)运行程序当我们建立了可执行文件后,就可以直接在DOS下执行该程序。程序调试DEBUG是一种面向汇编语言的动态调试工具,共有19条命令。DEBUG提供了可以跟踪、测试程序的环境和条件,使编辑者能够对.EXE和.COM文件的执行进行动态跟踪调试,能够较快地查找出文件的错误和检查程序的运行结果。还可以利用DEBUG直接编写一段小的汇编程序,并进行调试和运行。2021年7月27日 DEBUG常用命令-A[起始地址]↙汇编并保存一段指令语句-U[起始地址]↙反汇编-T[=起始地址]↙单步执行(执行一条语句)-R[寄存器]↙显示或修改寄存器内容-D[存储单元逻辑地址]↙显示存储单元(80个字节/次)-N[文件名]↙定义文件-L↙装入文件2021年7月27日 DATASEGMENTNUMDB82H,68H,88HSUMDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVBX,OFFSETNUMMOVAL,[BX]INCBXADDAL,[BX]INCBXADDAL,[BX]MOVSUM,ALMOVAH,4CHINT21HCODEENDSENDSTART例:2021年7月27日 5.2汇编语言和DOS操作系统的接口1.用户程序在存储器中的位置ROMRAMDOS磁盘应用程序其他系统程序引导程序ROMBIOS系统检测程序内存FFFFFH00000HIO.SYSCOMMAND.COMMSDOS.SYSIO.SYS模块MSDOS.SYS模块COMMAND.COMhello.asmhello.objhello.exe用户程序空间hello.exe1KB中断向量表EDIT.EXEMASM.EXELINK.EXEDEBUG.EXE2021年7月27日 2.用户程序的装入完成以下操作:确定内存可用部分以便存放要执行的.exe文件。建立程序段前缀PSP(ProgramSegmentPrefix)◢程序段前缀大小100H,即256个字节。◢存放执行过程中的控制信息。◢PSP最开始的两个字节CD20,是一条INT20H指令。装入可执行程序.exeSPDS、ES代码段INT20H…数据段CS:IPSSPSP(256字节)用户程序没有定义堆栈段的用户程序装入情况SPDS、ESINT20H…数据段代码段堆栈段CS:IPSS用户程序定义了堆栈段的用户程序装入情况附加段PSP(256字节)2021年7月27日 DSEGSEGMENTSTRING1DB1,2,3,4,5DSEGENDSESEGSEGMENTSTRING2DB?ESEGENDSSSEGSEGMENTSTACK‘STACK’DW10DUP(?)TOPLABELWORDSSEGENDSCSEGSEGMENTASSUMECS:CSEG,DS:DSEGASSUMEES:ESEG,SS:SSEGSTART:MOVAX,DSEGMOVDS,AXMOVAX,ESEGMOVES,AXMOVAX,SSEGMOVSS,AXMOVSP,OFFSETTOPLEASI,STRING1LEADI,STRING2MOVCX,5CLDREPMOVSBMOVAH,4CHINT21HCSEGENDSENDSTART2021年7月27日 3.返回DOS的方法执行用户程序后,若要返回DOS状态,即在屏幕上出现DOS提示符,等待输入新的命令,应在用户程序的最后安排完成此功能的程序段。为了保证用户程序执行完后,能回到DOS,可使用如下两种方法:(1)非标准方法:调用INT21H的4CH功能,例如:MOVAH,4CHINT21H2021年7月27日 (2)标准方法:借用PSP首单元的INT20H返回DOS。这种方法较麻烦。由于执行INT20H的前提是CS:IP必须指向PSP首单元,否则执行INT20H反而会造成死机,因此在.EXE文件汇编格式中,不能直接执行INT20H。用下列方法可使在需返回DOS时,CS:IP指向PSP首单元。①把主程序定义成一个远过程。即:过程名PROCFAR…RET过程名ENDP2021年7月27日 ②在给DS、ES赋初值之前,用下列三条指令,把PSP首单元的逻辑地址压入堆栈,即PUSHDS;PSP段地址压栈MOVAX,0;或用XORAX,AX指令PUSHAX;PSP段首单元的偏移地址;压栈(偏移地址为0000H)③采取了以上措施之后,程序在返回DOS的时候,执行一条RET指令即可返回DOS。因为这条RET指令是远过程中的RET指令,它将从栈顶弹出四个字节,即把PSP首单元的逻辑地址反弹到CS:IP之中,于是CPU就自动从PSP首单元取出INT20H,执行它返回DOS。2021年7月27日 例:DATASEGMENTNUMDB82H,68H,88HSUMDB?DATAENDSCODESEGMENTMAINPROCFARASSUMECS:CODE,DS:DATASTART:PUSHDSXORAX,AXPUSHAXMOVAX,DATAMOVDS,AXLEABX,NUMMOVAL,[BX]INCBXADDAL,[BX]INCBXADDAL,[BX]MOVSUM,ALRETMAINENDPCODEENDSENDSTART2021年7月27日 4.数据的输入与输出(DOS功能调用)微型计算机系统为汇编用户提供了两个程序接口来使用计算机的硬件资源,一个是DOS功能调用,另一个是ROM中的BIOS(basicinput/outputsystem)功能调用。DOS功能调用和BIOS功能调用都是由一系列的服务子程序构成的,但调用与返回不是使用子程序调用指令CALL和返回指令RET,而是通过软中断指令INTn和中断返回指令IRET调用和返回的。软中断(INTn指令)可分为三部分:2021年7月27日 ①ROMBIOS中断,占用类型号为10H1FH。②DOS中断,占用类型号为20H3FH。目前使用的有20H27H和2FH,其余类型号保留。③自由中断,占用类型号为40HFFH,可供系统或应用程序设置开发的中断处理程序用。1)DOS中断及功能调用目前DOS常用的9类中断(20H27H和2FH)分为两种:①DOS专用中断:INT22H、INT23H和INT24H,用户不能使用。②DOS可调用中断:INT20H、INT27H(程序退出);INT25H、INT26H(磁盘R/W中断);INT2FH(假脱机打印文件);INT21H(系统功能调用)。2021年7月27日 2)BIOS中断调用BIOS中断功能依功能分为两种,一种为系统服务程序,另一种为设备驱动程序。其中中断类型号为10H、16H和17H的是显示器、键盘和打印机的驱动子程序。①键盘输入子程序:INT16H。②显示输出子程序:INT10H。③打印输出子程序:INT17H。2021年7月27日 3)DOS及BIOS功能调用方法对于所有的功能调用,使用时一般需要经过以下三个步骤:①子程序入口参数送相应寄存器。②子程序编号(功能号)送AH寄存器:MOVAH,功能号。③发中断请求:INTn(系统功能调用使用INT21H指令)。2021年7月27日 功能号功能入口参数出口参数01H带回显的字符输入(单字符输入)(AL)=输入字符02H字符显示(单字符输出)(DL)=输出字符09H字符串显示(字符串输出)(DS:DX)=缓冲区首地址0AH字符串缓冲输入(字符串输入)(DS:DX)=缓冲区首地址4)系统功能调用系统功能调用是指INT21H中断。它是可供系统程序和应用程序调用的一个极其重要的中断,内含近百个已经标准化了的系统调用子功能。它是构成操作系统内核的主要成分。这里我们主要介绍他的几个成用的功能。如下表所示。2021年7月27日 INT21H常用功能介绍(1)键盘输入(1#功能)功能:键盘输入一个字符,将其ASCII码存放于AL,并在屏幕上显示该字符输入字符ASCII码ALMOVAH,01HINT21H(2)字符显示(2#功能)功能:在屏幕上显示任意单个字符待输出字符ASCII码DLMOVDL,‘A’MOVAH,2INT21H2021年7月27日 INT21H常用功能介绍(3)字符串输(10#功能)功能:键盘输入一串字符存至存储区存储区起始单元地址(段地址:偏移量)(DS:DX)存储区特点:首字节为存储区最大长度M(1255);第二字节存放输入字符串的实际长度;第三字节以后为用户输入内容(含结束标识回车的ASCII码0DH2021年7月27日 例从键盘输入一串字符,个数小于50其程序设计方法是:DATASEGMENTBUFDB50DB?DB50DUP(?)DATAENDSCODESEGMENT…MOVAX,DATAMOVDS,AX…LEADX,BUFMOVAH,10INT21H…CODEENDS50BUF预留字节数实际字节数用户输入内容2021年7月27日 INT21H常用功能介绍(4)字符串显示(9#功能)功能:屏幕上显示一串以‘$’结尾的字符待显示字符串首单元地址(DS:DX)DATASEGMENTBUFDB‘HOWDOYOUDO?$’DATAENDSCODESEGMENT…MOVDX,OFFSETBUFMOVAH,9INT21H…CODEENDS‘H’‘O’‘W’‘’‘D’‘O’BUF输出内容‘O’‘’‘Y’‘U’‘’‘D’‘O’‘?’‘$’2021年7月27日 5.3伪指令语句宏汇编程序MASM提供了约几十种伪指令,其中有一些伪指令小汇编ASM不支持,例如宏处理伪指令等。根据伪指令的功能,大致可以分为以下几类:⒈方式伪指令⑴.8086。汇编程序将在8086/8088方式下操作。⑵.386。汇编程序将在80386方式下操作。2.符号定义伪指令⑴EQU(赋值伪指令)名字EQU表达式2021年7月27日 ⑵=(等号伪指令)名字=表达式⑶LABEL(类型定义伪指令)名字LABEL类型3.数据定义伪指令数据定义伪指令的一般格式为:[变量名]伪操作符操作数[,操作数…]⑴DB定义变量的类型为BYTE,给变量分配字节或字节串操作数。⑵DW定义变量的类型为WORD,给变量分配字操作数。2021年7月27日 ⑶DD定义变量的类型为DWORD,给变量分配双字操作数。除了常数、表达式和字符串外,问号“?”也可以作为数据定义伪指令的操作数,此时仅给变量保留相应的存储单元,而不赋与变量某个确定的初值。当同样的操作数重复多次时,可用重复操作符“DUP”表示,其形式为:nDUP(初值[,初值…])2021年7月27日 例:画图说明下列伪指令所定义的数据在内存中的存放形式。ARV1DB3+4,43H,-2ARV2DW474FH,1,?COUNTEQU2ARV3DB2DUP(1,COUNTDUP(2))ARV4DDARV3ARV5DB‘AB’ARV6DW‘AB’解:假设此数据段的段地址为1234H,即DS=1234H,则有:1234H:0000H01H02H03H04H05H06H07H08H1234H:0009H0AH0BH0CH0DH0EH0FH10H11H12H13H14H15H1234H:0016H07H43HFEHARV14FH47H01H00HARV201H02H02H01H02H02HARV309H00H34H12HARV441H42HARV542H41HARV6ARV1ARV2ARV3ARV4ARV5ARV62021年7月27日 4.段定义伪指令段定义伪指令的用途是在汇编语言源程序中定义逻辑段,常用的段定义伪指令有SEGMENT/ENDS和ASSUME等⑴SEGMENT/ENDS伪指令段名SEGMENT[定位类型][组合类型][‘类名’]段名ENDS①定位类型。定位类型给出实际段起点的类型。它有PAGE(页类型)、PARA(节类型)、WORD(字类型)、BYTE(字节类型)四种类型。其中PARA为默认值。…2021年7月27日 ②组合类型。组合类型在多模块程序设计中表示该段和其它同名段间的组合连接方法。组合类型有PUBLIC、COMMON、AT、MEMORY、STACK等。③类名。类名是程序员任选的一个字符串,使用时必须用单引号括起来。其作用是在连接时决定各逻辑段的装入顺序。⑵ASSUME伪指令它是用来说明逻辑段和物理段关系的伪指令,即告诉汇编程序在指令执行期间内存的哪一段是数据段,哪一段是堆栈段,哪一段是代码段。ASSUME段寄存器名:段名[,段寄存器名:段名,…]2021年7月27日 ⑶ORG伪指令伪指令ORG指出其后的程序段或数据块的起始地址的偏移量。其格式为:ORG表达式5.过程定义伪指令过程名PROC[NEAR/FAR]过程名ENDP…2021年7月27日 5.4宏指令及其使用1.宏指令、宏定义和宏调用宏指令是源程序中具有独立功能的一段程序代码。在汇编语言中,如果在源程序中需要多次使用同一个程序段,可以将这个程序段定义(宏定义)为一个宏指令,然后每次需要是,即可简单地用宏指令名来代替(称为宏调用),从而避免了重复书写,使源程序更加简洁、易读。宏定义由MASM宏汇编程序提供的伪指令实现。2021年7月27日 1.宏定义宏指令名MACRO[形式参数]ENDM2.宏调用宏指令名[实际参数]这就是说,只要在源程序中写上已定义过的宏指令名就算是调用该宏指令了。3.宏展开…宏体2021年7月27日 具有宏调用的源程序被汇编时,每个宏调用将被MASM进行宏展开。宏展开实际上是用宏定义时设计的宏体去代替相应的宏指令,并用实际参数一一取代形式参数。由此可见,使用宏的过程共有三步:首先进行宏定义;然后可以进行宏调用;最后,汇编时由MASM进行宏展开。2021年7月27日 [例]若源程序中多处需要将AL和CL寄存器中的两位压缩型的BCD数相加,并将和送回CL寄存器,则可象下述这样定义宏指令,然后在需要的地方进行调用。DECADDMACROADDAL,CLDAAMOVCL,ALENDM显而易见,这是一个无形式参数的宏定义。2021年7月27日 如果对分别存放在任意8位寄存器或存储单元中的两个压缩型的BCD数进行加法运算,则可将上例宏定义改写为DECADD1MACROOPR1,OPR2MOVAL,OPR1ADDAL,OPR2DAAMOVOPR1,ALENDM这是一个带有两个形式参数的宏定义。宏指令为DECADD1。例如有以下宏调用:2021年7月27日 DECADD1DL,BUFFERDECADD1AREA1,AREA2则汇编时进行宏展开,得到以下指令:DECADD1DL,BUFFER+MOVAL,DL+ADDAL,BUFFER+DAA+MOVDL,ALDECADD1AREA1,AREA2+MOVAL,AREA1+ADDAL,AREA2+DAA+MOVAREA1,AL2021年7月27日 2.宏指令与子程序(过程)在汇编语言程序设计中,宏指令和子程序都给设计者提供了很大方便。他们都是可被程序多次调用的程序段,并且调用前必须由设计者根据需要按一定格式进行定义。然而,宏指令和子程序由于定义方法和其格式不同,因此,使用中有许多不同之处,主要是空间和时间的差异。2021年7月27日 ⑴子程序由CALL指令调用,由RET指令返回,所以汇编后子程序的机器码只占有一个程序段,不管调用多少次均如此,较为节约内存。宏指令在每次宏调用处宏展开时,宏体都要占一个程序段,调用次数愈多,占用内存愈多。因此从内存空间开销来说,子程序优于宏指令。2021年7月27日 ⑵从程序的执行时间来分析,每调用一次子程序都要保护和恢复返回地址(断点)及寄存器内容(现场)等,要消耗较多的时间。宏指令调用时不需要这个过程,执行时间较短。因此,从执行时间来分析,宏指令又优于子程序。综上所述,当某一需多次访问的程序段较长,访问次数又不是太多时,选用子程序结构较好。当某一需多次访问的程序段较段,访问次数又很频繁时,选用宏指令结构显然要更好些。2021年7月27日 5.5汇编语言程序设计通常,编制一个汇编语言源程序应按如下步骤进行:⑴明确任务,确定算法。⑵绘制流程图。⑶根据流程图编写汇编语言程序。⑷上机调试程序。程序的基本结构有四种:顺序结构、分支结构、循环结构和子程序结构。2021年7月27日 一、顺序程序设计顺序结构也称线性结构,其特点是其中的语句或结构被连续执行。顺序程序是最简单的,也是最基本的一种程序结构。这种结构的程序从开始到结尾一直是顺序执行的,中途没有任何分支。从这种结构的流程图来看,除了有一个起始框,一个终止框外,就是若干执行框,没有判断框。S1S2S3开始结束2021年7月27日 [例1]求两个数的平均值。这两个数分别存放在X单元和Y单元中,而平均值放在Z单元中。源程序编制如下:DATASEGMENTXDB5FHYDB57HZDB?DATAENDSSTACSEGMENTSTACK‘STACK’DW20HDUP(?)TOPLABELWORDSTACENDS2021年7月27日 CODESEGMENTMAINPROCFARASSUMECS:CODE,DS:DATA,SS:STACSTART:PUSHDSMOVAX,0PUSHAXMOVAX,DATAMOVDS,AXMOVAX,STACMOVSS,AXMOVSP,OFFSETTOPMOVAL,XADDAL,YMOVAH,0ADCAH,AHSHRAX,1MOVZ,ALRETMAINENDPCODEENDSENDSTART2021年7月27日 二、分支程序设计分支程序结构也称条件结构,通常是在两种或两个以上的不同的操作中选择其中的一个,如下图所示:分支是通过条件转移指令来实现的。分支结构有一个共同点:运行方向总是向前的。条件S1S2条件SS1S2Sn条件NNYY…2021年7月27日 [例2]现有一符号函数:1当X>0时Y=0当X=0时-1当X<0时假定X为-25,且存放在VARX单元中,函数值Y存放在VARY单元,试编写程序根据X的值确定函数Y的值。根据题意画出流程图如下:2021年7月27日 实现符号函数程序的流程图开始AL←XAL≥0?Y←-1结束AL=0Y←1Y←0YYNN2021年7月27日 DSEGSEGMENTVARXDB-25VARYDB?DSEGENDSCSEGSEGMENTASSUMECS:CSEG,DS:DSEGSTART:MOVAX,DSEGMOVDS,AXMOVAL,VARXCMPAL,0JGENEXTMOVAL,0FFHJMPHALTNEXT:JEZAREMOVAL,1JMPHALTZARE:MOVAL,0HALT:MOVVARY,ALMOVAH,4CHINT21HCODEENDSENDSTARTMOVDL,VARYMOVCL,4RORDL,CLANDDL,0FHCMPDL,0AHJBNUAADDDL,7NUA:ADDDL,30HMOVAH,2INT21HMOVDL,VARYANDDL,0FHCMPDL,0AHJBNUBADDDL,7NUB:ADDDL,30HMOVAH,2INT21HMOVDL,‘H’MOVAH,2INT21H2021年7月27日 三、循环程序设计循环程序结构就是重复执行某一段程序,直到某个条件出现为止。循环程序结构同分支程序结构有相似之处,都是根据条件来实现的,只不过循环是一种运动方向总是向后的分支程序结构。因此,循环可以用分支来实现。循环初始状态循环控制条件循环体YN循环初始状态循环体循环控制条件NY2021年7月27日 用分支结构实现:MOVDL,VARYMOVCL,4ROLDL,CLANDDL,0FHCMPDL,0AHJBNUMADDDL,7NUM:ADDDL,30HMOVAH,2INT21HMOVDL,VARYANDDL,0FHCMPDL,0AHJBNUBADDDL,7NUB:ADDDL,30HMOVAH,2INT21HMOVDL,‘H’MOVAH,2INT21H用循环结构实现:MOVBL,2MOVDH,VARYLOP:MOVCL,4RORDH,CLMOVDL,DHANDDL,0FHCMPDL,0AHJBNUMADDDL,7NUM:ADDDL,30HMOVAH,2INT21HDECBLJNZLOPMOVDL,‘H’MOVAH,2INT21H[例3]将上例题中字节变量VARY中两位十六进制数输出。2021年7月27日 1.循环程序的组成一个循环程序通常由四部分构成:⑴初始化部分建立循环初始值。如初始化地址指针,计数器,其他循环参数的起始值等。⑵工作部分它是循环程序的这主要部分,是为完成某种特定功能而设计的程序段。⑶修改部分为保证正确的循环而修改某些参数。如修改计数器的值、操作数地址等。⑷控制部分2021年7月27日 判断循环结束条件是否成立。这是循环程序设计的关键。通常判断循环是否结束的办法有两种:①用计数控制循环:循环是否已进行预定次数,它适用于已知循环次数的循环程序设计;②用条件控制循环:循环终止条件是否已成立,它适用于未知循环次数的循环程序设计。2.循环控制方法⑴用计数控制循环2021年7月27日 [例4]在xx单元开始的连续单元中存放有10个无符号字节数,从中找出中最大者送yy单元。根据题意,我们把第一个数先送入AL寄存器中,然后将AL中的数与后面的9个数逐个进行比较。如果AL中的数较小,则两数交换;如果AL中的数大,则不交换。在比较过程中,AL中始终保持较大的数,这样,比较9次后,则最大的数在AL中,最后把AL中的数(最大者)存入yy单元。由此可画出程序的流程图:2021年7月27日 从一批数中求最大者流程图开始AL←xx,BX←xx的有效地址,CX←9BX←BX+1AL≥[BX]?AL,[BX]中的数交换CX←CX-1CX=0?yy←AL结束YYNN2021年7月27日 DATASEGMENTxxDB49,38,65,12,97,13,55,27,28,85yyDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXLEABX,xxMOVAL,[BX]MOVCX,9LOOP1:INCBXCMPAL,[BX]JAENEXTXCHGAL,[BX]NEXT:LOOPLOOP1MOVyy,ALMOVAH,4CHINT21HCODEENDSENDSTART2021年7月27日 LOOP1:INCBXCMPAL,[BX]JAENEXTXCHGAL,[BX]NEXT:LOOPLOOP1AAMMOVyy,ALMOVDL,AHORDL,30HMOVAH,2INT21HMOVDL,yyORDL,30HMOVAH,2INT21HMOVAH,4CHINT21HCODEENDSENDSTART将最大数输出显示2021年7月27日 (2)用条件控制循环有些情况无法确定循环次数,但是循环何时结束,可用某种条件来确定。这时,编制程序主要是寻找控制条件及对控制条件的检测。[例5]从自然数1开始累加,直到累加和大于1000为止,统计被累加的自然数的个数,并把统计的个数送入n单元,把累加和送入sum单元。根据题意,被累加的自然数的个数事先是未知的,也就是说,循环的次数是未知的,因此不能用计数器方法控制循环。但题目中给定一个重要条件,即累加和大于1000则停止累加,因此,可以根据这一条件控制循环。我们用CX寄存器统计自然数的个数,用AX寄存器存放累加和,用BX寄存器存放每次取得的自然数。2021年7月27日 程序的流程图如下所示。开始初始化AX←0,CX←0,BX←0BX←BX+1AX←AX+BX,CX←CX+1AX≤1000?n←CX,sum←AX结束YN2021年7月27日 DATASSEGMENTnDW?sumDW?DATASENDSSTACKSEGMENTPARASTACK’stack’DW100DUP(?)STACKENDSCODESSEGMENTMAINPROCFARASSUMECX:CODES,DS:DATAS,SS:STACKSTART:PUSHDSMOVAX,0PUSHAXMOVAX,DATASMOVDS,AX2021年7月27日 MOVCX,0MOVAX,0MOVBX,0LOOPT:INCBXADDAX,BXINCCXCMPAX,1000JBELOOPTMOVn,CXMOVsum,AXRETMAINENDPCODESENDSENDSTART2021年7月27日 3.多重循环程序设计多重循环又称循环嵌套,即循环套循环。有些问题比较复杂,单重循环难以解决,必须使用多重循环。在使用多重循环时,必须注意以下几点:⑴内循环必须完整地包含在外循环内,内外循环不能相互交叉。⑵内循环既可以嵌套在外循环中,也可以几个内循环并列存在。可以从内循环中直接跳到外循环,但不能从外循环直接跳进内循环中。⑶防止出现“死循环”。无论是外循环,还是内循环,千万不要使循环返回到初始部分,这一点应当特别注意。2021年7月27日 ⑷每次通过外循环再次进入内循环时,初始条件必须重新设置。[例6]利用逐次求大数的方法对内存单元ARRAY开始的一字节为单位的无符号数进行从大到小排序。根据题意,排序方法为:编制程序如下:4938651297135527788549496565979738384949656578788585786555493827131212ARRAYALBXSISISISISISISISISIBXSISISISISISISISI2021年7月27日 DATASEGMENTARRAYDB49,38,65,12,97,13,55,27,28,85DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVDX,9LEABX,ARRAYLOOP0:MOVAL,[BX]MOVSI,BX+1MOVCX,DXLOOP1:CMPAL,[SI]JAENEXTXCHGAL,[SI]NEXT:INCSILOOPLOOP1MOV[BX],ALINCBXDECDXJNZLOOP0MOVAH,4CHINT21HCODEENDSENDSTART2021年7月27日 四、子程序设计子程序又称为过程,它相当于高级语言的过程或函数,是一个独立的程序段,能完成某些确定的功能,并能别其它程序调用。当一个子程序不被调用,且该子程序完成确定的功能后,便返回调用程序处。1.过程的定义和调用过程的定义采用过程定义伪指令,其格式为:过程名PROC类型RET过程名ENDP…2021年7月27日 过程的调用采用指令语句CALL,其格式为:CALL过程名⑴段内调用CSEGSEGMENTCALLSUBTMOVAH,4CHINT21HSUBTPROCNEARRETSUBTENDPCSEGENDS………2021年7月27日 ⑵段间调用XSEGSEGMENTYSEGSEGMENTCALLSUBT1CALLSUBT1MOVAH,4CHYSEGENDSINT21HSUBT1PROCFARRETSUBT1ENDPXSEGSEGMENT……………2021年7月27日 2.寄存器内容的保护和恢复通常主程序和过程的设计是分开的,因而他们所使用的寄存器往往会发生冲突。为避免冲突,应在进入过程时,将该过程所用到的寄存器内容保护起来,称为保护现场。而从过程返回主程序前,再将这些寄存器的内容恢复,称为恢复现场。保护现场和恢复现场通常分别用堆栈压入指令和弹出指令来实现。例如:2021年7月27日 SUBPRPROCFARPUSHAXPUSHBXPUSHCXPUSHDXPOPDXPOPCXPOPBXPOPAXRETSUBPRENDPPUSHAXPUSHBXPUSHCXPUSHDXCALLSUBPPOPDXPOPCXPOPBXPOPAX………2021年7月27日 3.主程序和过程之间的参数传递主程序调用过程时,必须先将过程所需要的初始数据设置好,这些初始数据称为过程的入口参数。过程执行完毕返回主程序时也必须将过程运行所得的结果送给主程序,这些回送的结果称为过程的出口参数。过程入口参数的送入和出口参数的送出城为主程序和过程间的参数传递,也称过程通信。过程通信通常有四种方法。⑴通过寄存器传递参数⑵通过变量传递参数⑶通过地址表传递参数⑷通过堆栈传递参数2021年7月27日 4.子程序的嵌套与递归调用一个子程序调用另一个子程序叫子程序嵌套,如下图所示:CALLCALLCALLRETRETRET主程序子程序1子程序2子程序n2021年7月27日 由于调用子程序时,断点地址保存在堆栈中,因此只要有足够的堆栈空间,嵌套的层次(也称深度)是不受限制的。若一个子程序调用该子程序自身,则称为递归调用。递归调用是子程序嵌套的特例。5.子程序调用和宏指令使用的例子[例7]AX寄存器中存放着4位十六进制数,试编写程序将这4位十六进制数分别转换为相应的ASCII码,并依次存放到RESULT数组的4个字节中去,要求分别用子程序和宏指令的方法实现。2021年7月27日 ⑴用子程序方法编程:DATASEGMENTHEXDATADW4D7EHRESULTDB4DUP(?)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVCX,4LEASI,HEXDATALEADI,RESULTMOVBX,[SI]NEXT:MOVAX,BXANDAL,0FHCALLHEXASCMOV[DI],ALINCDIPUSHCXMOVCX,4SHRBX,CLPOPCXLOOPNEXT2021年7月27日 LEASI,RESULT+3MOVCX,4STDLOOP1:LODSBMOVDL,ALMOVAH,02HINT21HLOOPLOOP1MOVDL,'H'MOVAH,02HINT21HMOVAH,4CHINT21H;十六进制转换成ASCII码子程序HEXASCPROCCMPAL,0AHJBPLUS30ADDAL,07HPLUS30:ADDAL,30HRETHEXASCENDPCODEENDSENDSTART2021年7月27日 ⑵用宏指令方法编程:DATASEGMENTHEXDATADW4D7EHRESULTDB4DUP(?)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXHEXASCMACROCMPAL,0AHJBPLUS30ADDAL,07HPLUS30:ADDAL,30HENDMMOVCX,4LEASI,HEXDATALEADI,RESULTMOVBX,[SI]2021年7月27日 NEXT:MOVAX,BXANDAL,0FHHEXASCMOV[DI],ALINCDIPUSHCXMOVCX,4SHRBX,CLPOPCXLOOPNEXTLEASI,RESULT+3MOVCX,4STDLOOP1:LODSBMOVDL,ALMOVAH,02HINT21HLOOPLOOP1MOVDL,'H'MOVAH,02HINT21HMOVAH,4CHINT21HCODEENDSENDSTART2021年7月27日

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭