《微机原理与接口技术》教学课件-第5章_第1页
《微机原理与接口技术》教学课件-第5章_第2页
《微机原理与接口技术》教学课件-第5章_第3页
《微机原理与接口技术》教学课件-第5章_第4页
《微机原理与接口技术》教学课件-第5章_第5页
已阅读5页,还剩119页未读 继续免费阅读

下载本文档

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

文档简介

微机原理与接口技术微机原理与接口技术第5章汇编语言程序设计第5章目录汇编语言程序的编辑、汇编、连接和调试汇编语言入门汇编程序设计的基本方法CONTENTS3高级汇编程序设计目录汇编语言程序的编辑、汇编、连接和调试汇编语言入门汇编程序引子汇编语言是一种基本的程序设计语言,它更能从原理上体现计算机的工作过程,因此,学习汇编语言是学习计算机原理和接口技术的基础。在掌握了8086指令系统后,本章将学习汇编语言程序设计。首先介绍的是汇编语言的编程环境和基础知识,然后学习三种基本结构的汇编程序设计方法,以及高级汇编程序设计方法。内容提要掌握汇编语言程序的编辑、汇编、连接和调试方法。掌握汇编语言的概念、助记符和语句格式,以及常数、表达式、标号、变量和运算符的定义与用法。掌握汇编语言的常用伪指令的格式和用法,以及源程序的结构。掌握汇编程序设计的基本方法。掌握高级汇编程序设计方法。4引子汇编语言是一种基本的程序设计语言,它更能从原理上体现计算5.1汇编语言程序的编辑、汇编、连接和调试5.1.1源程序编辑器EDIT用户可以在任意一种编辑程序(EDIT,NOTEPAD等)下,用键盘键入或编辑汇编语言的源程序。此时,源程序以ASCII码形式存放于内存中。将源文件以.ASM为扩展名存盘后,在磁盘上就建立了一个汇编语言源程序文件。5.1.2汇编程序MASM要使汇编语言源程序在机器上运行,必须先用汇编程序MASM对ASM文件进行汇编,生成一个扩展名为.OBJ的目标程序文件。这时,源程序中的指令被汇编成了计算机可以识别的二进制代码。在汇编过程中,可生成3个文件,用户可根据需要有选择地建立相应文件。Objectfilename[Filename.OBJ]:目标文件Sourcelisting[NUL.LST]:列表文件Cross-reference[NUL.CRF]:交叉引用文件5.1汇编语言程序的编辑、汇编、连接和调试5.1.15.1汇编语言程序的编辑、汇编、连接和调试5.1.3连接程序LINK汇编产生的目标程序文件虽然是二进制代码文件,但它还不能直接运行,须再经过连接程序LINK进行连接,生成一个扩展名为.EXE的可执行文件。所谓连接过程,就是找到要连接的所有目标模块,将它们装入内存,进而连接在一起形成一个完整的程序。在连接过程中,可生成3个文件,用户可根据需要有选择地建立相应文件。5.1.4程序的运行和调试经过以上三个步骤后,将可执行文件装入内存,就可以在DOS下运行此汇编程序了。RunFile[Filename.EXE]:可执行文件ListFile[NUL.MAP]:映像文件Libraries[.LIB]:库文件5.1汇编语言程序的编辑、汇编、连接和调试5.1.35.2汇编语言入门5.2.1汇编语言概述汇编语言人们采用字母、符号等来表示机器指令的二进制代码用汇编语言编写的程序称为汇编语言源程序。汇编语言中的字母、符号称为助记符。将汇编语言源程序翻译成机器语言的过程称为汇编。汇编语言是面向机器的低级语言,它与机器语言是一一对应的,但它比机器语言更容易理解和掌握。另外,汇编语言与微处理器的类型密切相关,因此,它比高级语言更接近硬件。5.2汇编语言入门5.2.1汇编语言概述汇编语言人们5.2汇编语言入门5.2.2汇编语言中的助记符1指令助记符指令助记符是汇编语言的基本助记符,它在汇编时被转换成二进制的指令代码,每一条指令代码都对应着CPU的一种操作。由指令助记符构成的可执行语句称为指令语句。指令系统中的每条指令都是指令语句。2伪指令助记符伪指令助记符是在汇编过程中用来控制汇编程序的一些特定的助记符,它在汇编时不产生机器码,也不产生任何操作,在汇编语言源程序中可以构成独立的语句。由伪指令助记符构成的语句称为伪指令语句,又称指示性语句。3其他助记符在汇编语言中,还有另外一些常见的助记符,如标号、常量、变量和表达式等,这些助记符是可以由用户自己定义的。5.2汇编语言入门5.2.2汇编语言中的助记符1指令5.2汇编语言入门5.2.3汇编语言的语句格式[标号:]指令助记符[操作数,操作数][;注释]指令语句[名字]伪指令助记符[操作数,…,操作数][;注释]汇编语言语句伪指令语句方括号中的内容可有可无,所以只有助记符是语句中必不可少的部分。5.2汇编语言入门5.2.3汇编语言的语句格式[标号5.2汇编语言入门(1)标号和名字标号可作为指令语句的符号地址,用来代表该指令语句在存储器中的地址。伪指令语句中的名字可以是变量名、段名、过程名、符号名等,用来代表它们在存储器中的地址。指令语句中的标号后面有冒号,而伪指令语句中的名字后面是空格。(2)助记符助记符是汇编语句中必不可少的部分。其中,指令助记符规定了指令语句的操作类型,伪指令助记符规定了伪指令语句的伪操作功能。(3)操作数操作数可以是寄存器、存储器、常数、变量、标号和表达式。指令语句的操作数可能是一个、两个或没有,它们之间用逗号分隔。而伪指令语句的操作数根据伪操作命令的不同而不同,有的伪指令不允许有操作数,有的伪指令允许带多个操作数。(4)注释以分号开头,直到行尾结束,用来对语句或程序的功能加以说明,增加程序的可读性。它不是程序的可执行部分,在汇编时不产生任何代码。5.2汇编语言入门(1)标号和名字标号可作为指令语句的符注意标号和名字都是使用标识符来定义的,标识符的命名规则如下:◆由英文大写字符、英文小写字母、数字和一些特殊符号(?@_.$)组成。◆不能以数字开头。◆“?”不能单独作为一个标识符。◆“.”只能作为首字符。◆最多由31个字符组成。◆不能把保留字作为标识符。5.2汇编语言入门注意标号和名字都是使用标识符来定义的,标识符的命名规则如下:5.2汇编语言入门5.2.4汇编语言的常数和表达式1常数可以是二进制常数、八进制常数、十进制常数和十六进制常数。不同的数制要用后缀表明,例如,6BH,10110111B等。数值常数由单引号括起来的一个或多个字符,例如,'IAMASTUDENT'。常数字符串常数在汇编语言中,数值常数必须以数字开头,如十六进制数B6H要写成0B6H。5.2汇编语言入门5.2.4汇编语言的常数和表达式15.2汇编语言入门2表达式汇编语言中的表达式分为数字表达式和地址表达式两种。汇编时对表达式进行计算,如果表达式的结果是一个数值,则称为数字表达式;如果表达式的结果是一个存储单元的地址,则称为地址表达式。表达式运算符算术运算符逻辑运算符关系运算符操作数可以是常数、标号、变量、寄存器或表达式;5.2汇编语言入门2表达式汇编语言中的表达式分为数字表达5.2汇编语言入门表达式中的运算符(1)算术运算符算术运算符常用于数字表达式或地址表达式中,将其用于地址表达式中时,必须保证运算有意义。例如,若COUNT的偏移地址为1000H,则“LEASI,COUNT+5”等效于“LEASI,[1005H]”。注意两个地址相乘或相除是无意义的,两个不同段的地址相加或相减也是无意义的。经常使用的是地址加减数字量,如上例,COUNT+5表示指向COUNT单元后面的第5个存储单元的地址。5.2汇编语言入门表达式中的运算符(1)算术运算符算术运5.2汇编语言入门(2)逻辑运算符逻辑运算符只能用于数字表达式中,不能用于地址表达式中。运算时是将两个数字操作数分别按位进行运算。例如,“MOVAL,0ABHAND0FH”等效于“MOVAL,0BH”。(3)关系运算符关系运算符连接的两个操作数必须都是数字操作数或者都是地址操作数,运算结果是一个逻辑值:如果关系为真,则结果为0FFFFH;如果关系为假,则结果为0。如“MOVAX,NUMGT100”,若NUM大于100,则等效于“MOVAX,0FFFFH”;否则,将等效于“MOVAX,0”。5.2汇编语言入门(2)逻辑运算符逻辑运算符只能用于数字5.2汇编语言入门5.2.5汇编语言的标号和变量1标号标号是指令语句的标识符,用来表示该指令所在内存单元的地址。在汇编语言程序中,标号常用在第一条指令、转移和循环的目标指令,以及子程序的第一条指令之前,并作为转移指令、循环指令或子程序调用指令的操作数,从而确定程序转移的目标地址。段地址(SEG)定义标号所在段的起始地址。偏移地址(OFFSET)定义标号所在位置与段的起始地址之间的偏移量。类型(TYPE)可以是NEAR(段内转移)或FAR(段间转移),一般默认为NEAR。5.2汇编语言入门5.2.5汇编语言的标号和变量1标5.2汇编语言入门2变量变量主要用来定义存放在存储单元中的数据,一般都在数据段或附加段中定义,并且在程序中可以随时修改其值。每个变量都有一个变量名,作为存储单元的名字或符号地址,通过变量名可以对存储单元中的数据进行访问。变量的定义格式为:变量名DB表达式 ;定义字节变量变量名DW表达式 ;定义字变量变量名DD表达式 ;定义双字变量变量名DQ表达式 ;定义8字节变量变量名DT表达式 ;定义10字节变量提示DB,DW,DD,DQ和DT是专门用于数据定义的伪指令。汇编时,汇编程序为变量分配相应字节数,并把表达式的值存放在指定的内存单元中。5.2汇编语言入门2变量变量主要用来定义存放在存储单元中5.2汇编语言入门变量具有5种属性(1)段地址(SEG)定义变量所在段的起始地址。(2)偏移地址(OFFSET)定义变量的位置与段的起始地址之间的偏移量。(3)类型(TYPE)定义变量所占存储单元的字节数,用DB,DW和DD伪指令定义的变量类型分别是字节(BYTE)、字(WORD)和双字(DWORD)。(4)长度(LENGTH)定义变量的个数。(5)大小(SIZE)分配给变量的总字节数。在编写程序时,变量名是可以直接引用的。在汇编程序为变量分配相应的内存区域后,对变量的引用实际上都转换成了变量的偏移地址。5.2汇编语言入门变量具有5种属性(1)段地址(SEG)5.2汇编语言入门5.2.6汇编语言的属性运算符和表达式用来获取或重新定义变量或标号属性的运算符称为属性运算符。(1)取地址运算符SEG格式:SEG变量或标号功能:返回变量或标号的段地址。例如,“MOVAX,SEGCOUNT”,指的是将变量COUNT的段地址送入AX。5.2汇编语言入门5.2.6汇编语言的属性运算符和表5.2汇编语言入门(2)取偏移地址运算符OFFSET格式:OFFSET变量或标号功能:返回变量或标号的偏移地址。例如,“MOVSI,OFFSETCOUNT”,指的是将变量COUNT的偏移地址送入SI。(3)取类型运算符TYPE格式:TYPE变量或标号功能:返回变量或标号的类型值例如,“MOVAX,TYPECOUNT”,指的是将变量COUNT的类型值送入AX。变量和标号的类型值5.2汇编语言入门(2)取偏移地址运算符OFFSET格式5.2汇编语言入门(4)取变量长度运算符LENGTH格式:LENGTH变量功能:返回变量的长度(即变量中元素的个数),可以以字节、字或双字为单位。例如,若定义“COUNTDW100DUP(1)”,则LENGTHCOUNT的值为100;若

定义“BUFFDD1,2,3”,则LENGTHBUFF的值为1。提示当在变量定义中使用DUP时,该表达式返回分配给变量的单元数,其他情况下返回值为1。5.2汇编语言入门(4)取变量长度运算符LENGTH格式5.2汇编语言入门(5)取变量总字节数运算符SIZE格式:SIZE变量功能:返回变量所包含的总字节数。例如,若定义“COUNTDW100DUP(1)”,则SIZECOUNT的值为200。提示该表达式的值实际上是LENGTH值和TYPE值的乘积,即SIZE=LENGTH×TYPE。5.2汇编语言入门(5)取变量总字节数运算符SIZE格式5.2汇编语言入门(6)类型运算符PTR格式:类型PTR变量、标号或表达式功能:对已定义的变量、标号或表达式,临时转换其类型,类型可以是BYTE,WORD,DWORD,NEAR或FAR。例如,“MOVAX,WORDPTRCOUNT”,指的是将变量COUNT临时转换成字类型。注意该操作符表达式只在本语句中有效,在其他地方不起作用。5.2汇编语言入门(6)类型运算符PTR格式:类型P5.2汇编语言入门(7)类型定义运算符THIS格式:变量或标号EQUTHIS类型功能:指定变量或标号的类型,但不为其分配存储单元,所定义变量的段地址和偏移地址与下一个存储单元地址相同。例如:COUNTEQUTHISBYTERESULTDW100DUP(?)该语句定义COUNT为字节类型,其地址与RESULT完全相同。注意,这里的RESULT是字型类型。(8)段超越前缀格式:段寄存器名:变量、标号或地址表达式功能:给变量、标号或地址表达式临时指定一个段属性。例如,“MOVAX,ES:[1000H]”,指的是将附加段中偏移地址为1000H的内存单元

的内容送入AX。5.2汇编语言入门(7)类型定义运算符THIS格式:变量5.2汇编语言入门(9)取高字节运算符HIGH格式:HIGH变量或标号功能:分离出变量或标号对应的运算对象的高字节。例如,“DATAEQU1234H”,则“MOVAL,HIGHDATA”的结果为(AL)=12H。(10)取低字节运算符LOW格式:LOW变量或标号功能:分离出变量或标号对应的运算对象的低字节。例如,“DATAEQU1234H”,则“MOVAL,LOWDATA”的结果为(AL)=34H。(11)短转移运算符SHORT格式:SHORT标号功能:说明转移指令中的转移为短转移,即目标地址与本指令之间的距离在-128~127字节范围内。例如,“JMPSHORTNEXT”,限制转移范围小于128个字节。5.2汇编语言入门(9)取高字节运算符HIGH格式:HI5.2汇编语言入门5.2.7常用伪指令1数据定义伪指令格式:变量数据定义伪指令表达式功能:为数据分配存储单元,其类型由使用的数据定义伪指令决定常用的数据定义伪指令5.2汇编语言入门5.2.7常用伪指令1数据定义伪指5.2汇编语言入门数据段DSEG由以下语句组成:DSEGSEGMENTNUM1DB12HNUM2DB34H,56H,78HNUM3DB?DSEGENDS设本段的段基址为1000H,则相应的内存单元分配情况如右图所示。例5-1

“COUNTDW1122H,3344H”的内存单元分配情况如右图所示。例5-25.2汇编语言入门数据段DSEG由以下语句组成:例5-15.2汇编语言入门“DB100DUP(?)”的功能是分配100个字节的内存单元。例5-3“DATADB‘ABCD’”的内存单元分配情况如右图所示。例5-4注意“?”用来定义值不确定的变量,并为变量保留空单元,常用来存放运算结果。对字符串进行定义时可以用DB或DW伪指令,字符串必须用单引号引起来。用DW定义的字符串只允许包含一个或两个字符,当字符多于两个时必须用DB来定义。另外,空格也是一个字符(ASCII码为20H)。5.2汇编语言入门“DB100DUP(?)”5.2汇编语言入门2符号定义伪指令格式:标识符EQU表达式功能:用一个标识符来表示表达式的值,但并不为其分配内存单元。EQU伪指令不能对标识符进行再定义。例如,“COUNTEQU10”表示给COUNT赋值为10;“NUMEQUTAB[BX+3]”表示将表达式TAB[BX+3]的值赋值给NUM。(1)赋值伪指令5.2汇编语言入门2符号定义伪指令格式:标识符EQU5.2汇编语言入门格式:标识符=表达式功能:与EQU的功能相同,并且也不分配内存单元,但“=”可以对同一标识符进行重新定义。例如,可以这样定义变量COUNT:COUNT=10COUNT=COUNT+1(2)等号伪指令格式:变量或标号LABEL类型功能:定义或修改变量或标号的类型。例如,COUNTLABELBYTEDB10功能是定义变量COUNT为字节型变量,值为10。(3)标号定义伪指令5.2汇编语言入门格式:标识符=表达式(2)等号伪指令格5.2汇编语言入门3段定义伪指令格式:段名SEGMENT[定位类型][组合类型][类别]……

段名ENDS功能:对段的结构进行定义,所有的段必须经过定义后才能使用。(1)SEGMENT和ENDS伪指令定位类型表示对段的起始边界的约定,有BYTE(从字节边界开始)、WORD(从字边界开始)、PARA(从一个节的边界开始,16个字节为一个节)和PAGE(从页边界开始,256个字节为一页)4种类型,默认类型为PARA。组合类型用来说明各模块的组合方式,以保证各模块在汇编后连接成一个完整的程序,有NONE,PUBLIC,STACK,COMMON,AT表达式和MEMORY共6种组合类型。类别是用单引号括起来的字符串,连接程序把不同模块中同类型的段存放在连续的存储区域中。5.2汇编语言入门3段定义伪指令格式:段名SEGME5.2汇编语言入门提示NONE:本段与其他段在逻辑上无关,连接后各模块中的各段具有自己的段地址和偏移地址。PUBLIC:连接时,不同模块中属于此类型的同名段连接成一个逻辑段,按顺序排列在同一个物理段中,并具有相同的段地址。STACK:连接方式同PUBLIC,仅用于说明堆栈段。COMMON:连接时,各模块中属于此类型的同名段合并成一个逻辑段,且相互覆盖,具有相同的段地址。AT表达式:连接时,将表达式的值作为段地址。MEMORY:连接时,将本段装在被连接的其他所有段之上。5.2汇编语言入门提示NONE:本段与其他段在逻辑上无关5.2汇编语言入门注意SEGMENT和ENDS必须成对出现,它们前面的段名必须一致。段名一旦定义,就具备了这样5个属性:段基址、偏移地址、定位类型、组合类型和类别。5.2汇编语言入门注意SEGMENT和ENDS必须成对出5.2汇编语言入门格式:ASSUME段寄存器:段名[,…,段寄存器:段名]功能:在各段定义完之后,用于指明段寄存器与各段之间的对应关系,告诉汇编程序源程序中的各段由哪个段寄存器去寻址。例如,语句“ASSUMECS:CSEG,DS:DSEG,SS:SSEG”的功能是将CS,DS和SS分别设定为代码段、数据段和堆栈段寄存器,并指明程序中定义的CSEG段为代码段,DSEG段为数据段,SSEG段为堆栈段。(2)ASSUME伪指令5.2汇编语言入门格式:ASSUME段寄存器:段名5.2汇编语言入门注意ASSUME只是指明各段寄存器中存放哪个段的段地址,但并没有为其设定初值。所以程序中必须通过指令将段基址装入段寄存器。每个段的段地址实际是一个16位的立即数,用其段名来表示(设DATA段为数据段),故先将段地址送入通用寄存器后,再传送给段寄存器,代码为:MOVAX,DATAMOVDS,AXMOVES,AXCS和SS两个段寄存器的值是由系统自动装入的,而DS和ES段寄存器的设置必须由用户通过数据传送指令才能实现。5.2汇编语言入门注意ASSUME只是指明各段寄存器中存5.2汇编语言入门4过程定义伪指令格式:过程名PROC[类型]……RET

过程名ENDP功能:标识一个执行特定功能的代码块(又称子程序),该程序可被其他程序调用。其中,类型可以是NEAR(段内调用)或FAR(段间调用)。需要注意,PROC和ENDP必须成对出现,它们前面的过程名是相同的,最后一条指令是返回指令,使过程结束后可以返回主程序。5结束伪指令格式:END[标号]功能:汇编程序结束。其中,标号是程序开始执行的起始地址标号,表示程序装入内存后要从此处启动程序。5.2汇编语言入门4过程定义伪指令格式:过程名PRO5.2汇编语言入门5.2.8汇编语言源程序的结构汇编语言源程序是由若干个逻辑段组成的,一个汇编语言源程序的基本框架为:在代码段中,①指定每个段分配给哪一个段寄存器;②~④把段地址装入相应的段寄存器中,其中代码段的段地址由系统自动装入;⑤~⑥表示汇编语言程序结束,返回DOS。5.2汇编语言入门5.2.8汇编语言源程序的结构汇编5.2汇编语言入门01数据段DS:定义程序中的数据和变量,分配存储空间。02附加段ES:当用户程序中使用的数据量很大或使用字符串操作指令时,需设置附加段来增加数据段的容量。03堆栈段SS:分配堆栈段的大小或保存子程序调用和程序中断时的断点地址等。02代码段CS:存放程序指令序列的区域。5.2汇编语言入门01数据段DS:定义程序中的数据和变量5.3汇编程序设计的基本方法5.3.1汇编程序设计的一般步骤分析问题,确定算法编写程序之前,应首先对要求解的问题进行仔细分析,明确该问题的条件和任务,找出解决问题的方法和步骤。然后选择合理的算法和数据结构,将一个实际问题转化为计算机可以处理的问题,这是编写一个好程序的基础。画出程序流程图根据设计的算法画出程序流程图,从而直观、形象地描述程序的执行过程,进而检验算法的可行性。编写源程序根据程序流程图采用汇编语言编写程序,实现前面设计的算法,并保存成ASM文件。编写汇编程序时,应先对内存单元和工作寄存器进行合理分配。调试程序上机运行、调试程序,检验程序是否正确,并修改其中的错误。运行时,先对源程序进行汇编,生成OBJ目标文件,再把OBJ文件连接成可执行文件。5.3汇编程序设计的基本方法5.3.1汇编程序设计的5.3汇编程序设计的基本方法流程图是用一些图形框来代表各种操作的示意图,常用的流程图符号有:(1)起止框:框内写上“开始”或“结束”,表示一个过程的开始或结束。其中,起始框有一个出口,终止框有一个入口。(2)处理框:框内写上简要的功能或说明,表示过程中执行的一个操作。它有一个入口和一个出口。(3)判断框:框内写上判断条件,根据一个给定的条件判断如何执行后面的操作。它有一个入口和若干个出口;在出口处标明“Y”或“N”,表示成立或不成立。(4)连接框:框内写上一个标识符,表示将具有相同标识符的过程连接起来。(5)流程线:表示程序执行的方向。5.3汇编程序设计的基本方法流程图是用一些图形框来代表各5.3汇编程序设计的基本方法5.3.2顺序结构程序设计程序设计的基本方法顺序结构程序设计方法分支结构程序设计方法循环结构程序设计方法顺序结构是最简单、最基本的程序结构,它是按照指令在程序中排列的先后顺序逐条执行的。顺序结构程序的流程图中只有一个起始框和一个结束框。5.3汇编程序设计的基本方法5.3.2顺序结构程序设5.3汇编程序设计的基本方法5.3.3分支结构程序设计在解决实际问题时,经常需要对某种条件进行判断,根据不同的情况作出不同的处理,即程序转向不同的目标地址去执行,这就是分支结构程序。实现分支结构中的分支程序,要用到条件测试和转移指令,常用的条件测试指令有CMP(比较指令)、CMPS(串比较指令)、TEST(检测指令)等。典型的分支结构双分支结构多分支结构跳转表5.3汇编程序设计的基本方法5.3.3分支结构程序设IF…THEN…ELSE结构1双分支结构双分支结构有两种结构形式,分别是IF…THEN结构和IF…THEN…ELSE结构。5.3汇编程序设计的基本方法IF…THEN结构IF…THEN…ELSE结构1双分支结构双分支结构有两种结构2多分支结构多分支结构相当于高级语言中的CASE结构。5.3汇编程序设计的基本方法多分支结构3跳转表在内存的一个连续区域中,依次存放完成各功能的分支子程序的首地址,构成一个跳转表。通过计算存储单元的偏移地址,获得对应的分支子程序的首地址,从而转去执行对应的子程序。这种方法的关键是计算存放分支子程序的首地址的存储单元的地址,计算方法为:跳转表基地址+偏移地址。2多分支结构多分支结构相当于高级语言中的CASE结构。5.35.3.4循环结构程序设计5.3汇编程序设计的基本方法1循环结构程序的基本构成FilmMusicAnalysisSocialMediaBusinessModel循环控制部分循环体部分初始化部分修改部分结束部分循环的准备部分,常用于为寄存器、存储单元、地址指针和循环计数器设置初值等。循环程序的主体部分,也就是需要重复执行的程序段。修改地址指针、循环计数器等参数的值,为执行下一次循环做准备。判断循环结束条件,控制循环的继续或终止。循环结束后对结果的处理。5.3.4循环结构程序设计5.3汇编程序设计的基本方5.3汇编程序设计的基本方法2循环程序的结构形式循环程序一般有两种结构形式。先判断循环控制条件,条件满足则执行循环体部分,否则退出循环;先执行一次循环体部分,然后判断循环控制条件是否满足。若不满足,则继续执行循环体部分,直到满足循环控制条件时退出循环。5.3汇编程序设计的基本方法2循环程序的结构形式循环程序5.3汇编程序设计的基本方法3循环结构程序的分类按照循环控制方式(1)计数控制循环用于循环次数已知的循环。方法是:通过设置循环计数器的值来控制循环的次数,每循环一次,计数器的值自动减1,直到值为0时循环结束。(2)条件控制循环用于循环次数未知的循环。方法是:每次循环体执行前或执行后,通过对某个特定条件的判断来决定是否执行下一次循环。按照循环嵌套的层次(1)单重循环循环体内只是由顺序结构程序或分支结构程序构成。(2)多重循环循环体内还包含有循环结构程序。5.3汇编程序设计的基本方法3循环结构程序的分类按照循环5.4.1使用子程序5.4高级汇编程序设计在程序设计中,如果一个具有独立功能的程序段在程序中要多次使用,这时可以将该程序段编成一个独立的程序模块,称为子程序或过程。当程序中需要执行该程序段时,用CALL指令调用相应的子程序即可。调用子程序的程序称为主程序。这种主程序调用子程序的程序设计方法称为子程序设计。在调用子程序时,主程序和子程序之间数据信息的交换称为参数传递,传递的参数包括入口参数和出口参数两类。子程序调用前,将子程序中需要的数据(入口参数)传送给子程序;子程序调用后,将处理结果(出口参数)返回给主程序。5.4.1使用子程序5.4高级汇编程序设计在程序设计5.4高级汇编程序设计(1)通过寄存器传递参数子程序调用前,将入口参数的值存放在指定寄存器中,通过寄存器将所需数据传送给子程序;子程序调用后,将出口参数的值也存放在指定寄存器中,再通过寄存器将结果返回给主程序。该方法的特点是速度快,但只适用于参数较少的情况。(2)通过内存单元传递参数先在主程序中建立存储区域,子程序调用前,将入口参数的值存放在指定内存单元中,通过内存单元将所需数据传送给子程序;子程序调用后,将出口参数的值存放在指定内存单元中,再通过内存单元将结果返回给主程序。该方法适用于参数较多的情况,需要先在内存中建立一个参数表。5.4高级汇编程序设计(1)通过寄存器传递参数子程序调用5.4高级汇编程序设计(3)通过堆栈传递参数子程序调用前,将入口参数的值压入堆栈,通过执行出栈操作将所需数据传送给子程序;子程序调用后,将出口参数的值压入堆栈,再通过执行出栈操作将结果返回给主程序。该方法适用于参数较多且子程序有嵌套、递归调用的情况。将子程序作为调用程序又去调用其他子程序,称为子程序嵌套。在子程序嵌套的情况下,如果一个子程序调用的子程序就是它自身,称为子程序递归调用。子程序嵌套5.4高级汇编程序设计(3)通过堆栈传递参数子程序调用前5.4高级汇编程序设计由于寄存器的数目是有限的,主程序中用到的某些寄存器可能在子程序中还要使用。因此,在子程序调用后,这些寄存器中的内容就发生了变化。如果还想使用原来寄存器中的内容,就必须在子程序调用前,将子程序中可能用到的寄存器中的内容保护起来,这个过程称为现场保护。现场保护最常用的方法是:在子程序开始时,先将要保护的寄存器中的内容压入堆栈,返回主程序之前再将这些值弹出到相应的寄存器中。5.4高级汇编程序设计由于寄存器的数目是有限的,主程序中5.4高级汇编程序设计编写将16位二进制数转换成4位十六进制数的ASCII码子程序。子程序说明如下:子程序名:BTH功能描述:将16位二进制数转换成4位十六进制数的ASCII码形式入口参数:BX中存放待转换的二进制数出口参数:DI中存放转换结果的偏移地址所用寄存器:CH中存放十六进制数位数,CL中存放移位次数。例5-55.4高级汇编程序设计编写将16位二进制数转换成4位十六5.4高级汇编程序设计BTHPROCFARPUSHF ;将标志寄存器的内容压入堆栈

PUSHAX ;将寄存器的内容压入堆栈

PUSHCXMOVCH,4 ;将十六进制数位数存入CHCONV:MOVCL,4 ;将移位次数存入CLROLBX,CL ;将BX中的数循环左移4位,将最高4位移至最低4位

MOVAL,BL ;将BX的低8位存入ALANDAL,0FH ;使AL中保存BX的最低4位

CMPAL,09H ;判断AL是否在0~9之间

JLEASC ;若在0~9之间,则程序转移至ASC5.4高级汇编程序设计BTHPROCFAR5.4高级汇编程序设计ADDAL,37H ;AL在A~F之间时,二进制数与ASCII码相差37HJMPEXITASC:ADDAL,30H ;AL在0~9之间时,二进制数与ASCII码相差30HEXIT:MOV[DI],AL ;将转换结果存入DI所指向的存储单元

INCDIDECCHJNZCONV ;未转换完,继续转换

POPCX ;恢复寄存器中的内容

POPAXRETBTHENDP5.4高级汇编程序设计ADDAL,375.4.2DOS功能调用5.4高级汇编程序设计DOS操作系统为用户提供了丰富的服务程序,用于对文件、设备和内存等进行管理。这些程序构成了一些功能模块,每个模块完成一种特定的功能操作,用户可在程序中使用软中断指令“INTn”调用相应的模块。类型码n=20H~3FH时,调用DOS的中断处理程序;类型码n=05H~1FH时,调用BIOS的中断处理程序。1DOS功能调用方法DOS系统中的功能调用是用软中断指令“INT21H”来实现的。“INT21H”软中断是一个提供了80多个子程序的大型中断服务程序,每个子程序都有一个功能号,对应着一种特定的操作和处理。调用DOS系统功能子程序时,用户不必了解设备的物理特性、接口方式和内存分配等,只需将其入口参数和功能号送入指定寄存器即可。①将入口参数送入指定寄存器中;②将子程序的功能号送入寄存器AH中;③执行“INT21H”;5.4.2DOS功能调用5.4高级汇编程序设计DOS5.4高级汇编程序设计2常用的系统功能调用(1)输入字符格式:MOVAH,01HINT21H功能:接收从键盘输入的字符,在屏幕上显示该字符,并将字符的ASCII码送入寄存器AL中。(2)输入字符串格式:LEADX,内存缓冲区首地址

MOVAH,0AHINT21H功能:接收从键盘输入的字符串,在屏幕上显示该字符串,并将其送入内存缓冲区中。5.4高级汇编程序设计2常用的系统功能调用(1)输入字符注意在调用此功能之前,应先定义一个内存缓冲区,缓冲区的第一个字节指定缓冲区能容纳的字符个数;第二个字节设置实际输入的字符个数;从第三个字节开始存放输入的字符。5.4高级汇编程序设计注意在调用此功能之前,应先定义一个内存缓冲区,缓冲区的第一个5.4高级汇编程序设计(3)显示字符格式:MOVDL,待显示字符的ASCII码

MOVAH,02HINT21H功能:将寄存器DL中的内容在屏幕上显示出来。(4)显示字符串格式:MOVDX,待显示字符串的偏移地址

MOVAH,09HINT21H功能:将字符串在屏幕上显示出来。(5)打印输出格式:MOVDL,'字符'MOVAH,05HINT21H功能:将送入DL中的字符送到打印机接口打印输出。注意待显示的字符串存放的地址为DS:[DX],且以‘$’符号作为结束标志。5.4高级汇编程序设计(3)显示字符格式:MOVDL5.4高级汇编程序设计(6)检查键盘状态格式:MOVAH,0BHINT21H功能:检查是否有按键,若有键按下,则AL=0FFH;否则,AL=00H。(7)程序结束格式:MOVAH,4CHINT21H功能:结束当前程序并返回DOS。5.4高级汇编程序设计(6)检查键盘状态格式:MOV5.4高级汇编程序设计编写程序,在屏幕上显示字符串“HOWAREYOU?”。DSEGSEGMENTSTRDB'HOWAREYOU?',0AH,0DH,'$'DSEGENDSCSEGSEGMENTASSUMECS:CSEG,DS:DSEGSTART:MOVAX,DSEGMOVDS,AXMOVDX,OFFSETSTR ;将字符串STR的偏移地址送入DXMOVAH,09HINT21HMOVAH,4CHINT21HCSEGENDSENDSTART例5-65.4高级汇编程序设计编写程序,在屏幕上显示字符串“HO5.4.3BIOS功能调用5.4高级汇编程序设计BIOS是固化在PC机的ROM中的一系列输入输出服务程序,它存放在内存的高地址区域中,除负责处理系统中的全部内部中断外,还提供对主要I/O接口的控制功能,如键盘、显示器、磁盘、打印、日期与时间等。BIOS功能调用也是通过软中断指令“INTn”来实现的。其调用方法和DOS功能调用相似,但不同类型的功能需要使用不同的软中断类型号。①将入口参数送入指定寄存器中。②将子程序的功能号送入寄存器AH中。③执行“INTn”。5.4.3BIOS功能调用5.4高级汇编程序设计BI5.4高级汇编程序设计(1)从键盘输入字符格式:MOVAH,0INT16H功能:等待从键盘输入一个字符,并将字符的ASCII码送入寄存器AL中。(2)查询键盘缓冲区格式:MOVAH,01HINT16H功能:查询是否有按键,并设置ZF标志位。若有键按下,则ZF=0;否则,ZF=1。(3)打印字符格式:MOVAL,打印字符的ASCII码

MOVDX,打印机号(0~2)

MOVAH,0INT17H功能:打印一个字符,并返回打印机状态到AH中。(4)初始化打印机格式:MOVAH,01HINT17H功能:初始化打印机,并返回打印机状态到AH中。5.4高级汇编程序设计(1)从键盘输入字符格式:MOV微机原理与接口技术微机原理与接口技术第5章汇编语言程序设计第5章目录汇编语言程序的编辑、汇编、连接和调试汇编语言入门汇编程序设计的基本方法CONTENTS65高级汇编程序设计目录汇编语言程序的编辑、汇编、连接和调试汇编语言入门汇编程序引子汇编语言是一种基本的程序设计语言,它更能从原理上体现计算机的工作过程,因此,学习汇编语言是学习计算机原理和接口技术的基础。在掌握了8086指令系统后,本章将学习汇编语言程序设计。首先介绍的是汇编语言的编程环境和基础知识,然后学习三种基本结构的汇编程序设计方法,以及高级汇编程序设计方法。内容提要掌握汇编语言程序的编辑、汇编、连接和调试方法。掌握汇编语言的概念、助记符和语句格式,以及常数、表达式、标号、变量和运算符的定义与用法。掌握汇编语言的常用伪指令的格式和用法,以及源程序的结构。掌握汇编程序设计的基本方法。掌握高级汇编程序设计方法。66引子汇编语言是一种基本的程序设计语言,它更能从原理上体现计算5.1汇编语言程序的编辑、汇编、连接和调试5.1.1源程序编辑器EDIT用户可以在任意一种编辑程序(EDIT,NOTEPAD等)下,用键盘键入或编辑汇编语言的源程序。此时,源程序以ASCII码形式存放于内存中。将源文件以.ASM为扩展名存盘后,在磁盘上就建立了一个汇编语言源程序文件。5.1.2汇编程序MASM要使汇编语言源程序在机器上运行,必须先用汇编程序MASM对ASM文件进行汇编,生成一个扩展名为.OBJ的目标程序文件。这时,源程序中的指令被汇编成了计算机可以识别的二进制代码。在汇编过程中,可生成3个文件,用户可根据需要有选择地建立相应文件。Objectfilename[Filename.OBJ]:目标文件Sourcelisting[NUL.LST]:列表文件Cross-reference[NUL.CRF]:交叉引用文件5.1汇编语言程序的编辑、汇编、连接和调试5.1.15.1汇编语言程序的编辑、汇编、连接和调试5.1.3连接程序LINK汇编产生的目标程序文件虽然是二进制代码文件,但它还不能直接运行,须再经过连接程序LINK进行连接,生成一个扩展名为.EXE的可执行文件。所谓连接过程,就是找到要连接的所有目标模块,将它们装入内存,进而连接在一起形成一个完整的程序。在连接过程中,可生成3个文件,用户可根据需要有选择地建立相应文件。5.1.4程序的运行和调试经过以上三个步骤后,将可执行文件装入内存,就可以在DOS下运行此汇编程序了。RunFile[Filename.EXE]:可执行文件ListFile[NUL.MAP]:映像文件Libraries[.LIB]:库文件5.1汇编语言程序的编辑、汇编、连接和调试5.1.35.2汇编语言入门5.2.1汇编语言概述汇编语言人们采用字母、符号等来表示机器指令的二进制代码用汇编语言编写的程序称为汇编语言源程序。汇编语言中的字母、符号称为助记符。将汇编语言源程序翻译成机器语言的过程称为汇编。汇编语言是面向机器的低级语言,它与机器语言是一一对应的,但它比机器语言更容易理解和掌握。另外,汇编语言与微处理器的类型密切相关,因此,它比高级语言更接近硬件。5.2汇编语言入门5.2.1汇编语言概述汇编语言人们5.2汇编语言入门5.2.2汇编语言中的助记符1指令助记符指令助记符是汇编语言的基本助记符,它在汇编时被转换成二进制的指令代码,每一条指令代码都对应着CPU的一种操作。由指令助记符构成的可执行语句称为指令语句。指令系统中的每条指令都是指令语句。2伪指令助记符伪指令助记符是在汇编过程中用来控制汇编程序的一些特定的助记符,它在汇编时不产生机器码,也不产生任何操作,在汇编语言源程序中可以构成独立的语句。由伪指令助记符构成的语句称为伪指令语句,又称指示性语句。3其他助记符在汇编语言中,还有另外一些常见的助记符,如标号、常量、变量和表达式等,这些助记符是可以由用户自己定义的。5.2汇编语言入门5.2.2汇编语言中的助记符1指令5.2汇编语言入门5.2.3汇编语言的语句格式[标号:]指令助记符[操作数,操作数][;注释]指令语句[名字]伪指令助记符[操作数,…,操作数][;注释]汇编语言语句伪指令语句方括号中的内容可有可无,所以只有助记符是语句中必不可少的部分。5.2汇编语言入门5.2.3汇编语言的语句格式[标号5.2汇编语言入门(1)标号和名字标号可作为指令语句的符号地址,用来代表该指令语句在存储器中的地址。伪指令语句中的名字可以是变量名、段名、过程名、符号名等,用来代表它们在存储器中的地址。指令语句中的标号后面有冒号,而伪指令语句中的名字后面是空格。(2)助记符助记符是汇编语句中必不可少的部分。其中,指令助记符规定了指令语句的操作类型,伪指令助记符规定了伪指令语句的伪操作功能。(3)操作数操作数可以是寄存器、存储器、常数、变量、标号和表达式。指令语句的操作数可能是一个、两个或没有,它们之间用逗号分隔。而伪指令语句的操作数根据伪操作命令的不同而不同,有的伪指令不允许有操作数,有的伪指令允许带多个操作数。(4)注释以分号开头,直到行尾结束,用来对语句或程序的功能加以说明,增加程序的可读性。它不是程序的可执行部分,在汇编时不产生任何代码。5.2汇编语言入门(1)标号和名字标号可作为指令语句的符注意标号和名字都是使用标识符来定义的,标识符的命名规则如下:◆由英文大写字符、英文小写字母、数字和一些特殊符号(?@_.$)组成。◆不能以数字开头。◆“?”不能单独作为一个标识符。◆“.”只能作为首字符。◆最多由31个字符组成。◆不能把保留字作为标识符。5.2汇编语言入门注意标号和名字都是使用标识符来定义的,标识符的命名规则如下:5.2汇编语言入门5.2.4汇编语言的常数和表达式1常数可以是二进制常数、八进制常数、十进制常数和十六进制常数。不同的数制要用后缀表明,例如,6BH,10110111B等。数值常数由单引号括起来的一个或多个字符,例如,'IAMASTUDENT'。常数字符串常数在汇编语言中,数值常数必须以数字开头,如十六进制数B6H要写成0B6H。5.2汇编语言入门5.2.4汇编语言的常数和表达式15.2汇编语言入门2表达式汇编语言中的表达式分为数字表达式和地址表达式两种。汇编时对表达式进行计算,如果表达式的结果是一个数值,则称为数字表达式;如果表达式的结果是一个存储单元的地址,则称为地址表达式。表达式运算符算术运算符逻辑运算符关系运算符操作数可以是常数、标号、变量、寄存器或表达式;5.2汇编语言入门2表达式汇编语言中的表达式分为数字表达5.2汇编语言入门表达式中的运算符(1)算术运算符算术运算符常用于数字表达式或地址表达式中,将其用于地址表达式中时,必须保证运算有意义。例如,若COUNT的偏移地址为1000H,则“LEASI,COUNT+5”等效于“LEASI,[1005H]”。注意两个地址相乘或相除是无意义的,两个不同段的地址相加或相减也是无意义的。经常使用的是地址加减数字量,如上例,COUNT+5表示指向COUNT单元后面的第5个存储单元的地址。5.2汇编语言入门表达式中的运算符(1)算术运算符算术运5.2汇编语言入门(2)逻辑运算符逻辑运算符只能用于数字表达式中,不能用于地址表达式中。运算时是将两个数字操作数分别按位进行运算。例如,“MOVAL,0ABHAND0FH”等效于“MOVAL,0BH”。(3)关系运算符关系运算符连接的两个操作数必须都是数字操作数或者都是地址操作数,运算结果是一个逻辑值:如果关系为真,则结果为0FFFFH;如果关系为假,则结果为0。如“MOVAX,NUMGT100”,若NUM大于100,则等效于“MOVAX,0FFFFH”;否则,将等效于“MOVAX,0”。5.2汇编语言入门(2)逻辑运算符逻辑运算符只能用于数字5.2汇编语言入门5.2.5汇编语言的标号和变量1标号标号是指令语句的标识符,用来表示该指令所在内存单元的地址。在汇编语言程序中,标号常用在第一条指令、转移和循环的目标指令,以及子程序的第一条指令之前,并作为转移指令、循环指令或子程序调用指令的操作数,从而确定程序转移的目标地址。段地址(SEG)定义标号所在段的起始地址。偏移地址(OFFSET)定义标号所在位置与段的起始地址之间的偏移量。类型(TYPE)可以是NEAR(段内转移)或FAR(段间转移),一般默认为NEAR。5.2汇编语言入门5.2.5汇编语言的标号和变量1标5.2汇编语言入门2变量变量主要用来定义存放在存储单元中的数据,一般都在数据段或附加段中定义,并且在程序中可以随时修改其值。每个变量都有一个变量名,作为存储单元的名字或符号地址,通过变量名可以对存储单元中的数据进行访问。变量的定义格式为:变量名DB表达式 ;定义字节变量变量名DW表达式 ;定义字变量变量名DD表达式 ;定义双字变量变量名DQ表达式 ;定义8字节变量变量名DT表达式 ;定义10字节变量提示DB,DW,DD,DQ和DT是专门用于数据定义的伪指令。汇编时,汇编程序为变量分配相应字节数,并把表达式的值存放在指定的内存单元中。5.2汇编语言入门2变量变量主要用来定义存放在存储单元中5.2汇编语言入门变量具有5种属性(1)段地址(SEG)定义变量所在段的起始地址。(2)偏移地址(OFFSET)定义变量的位置与段的起始地址之间的偏移量。(3)类型(TYPE)定义变量所占存储单元的字节数,用DB,DW和DD伪指令定义的变量类型分别是字节(BYTE)、字(WORD)和双字(DWORD)。(4)长度(LENGTH)定义变量的个数。(5)大小(SIZE)分配给变量的总字节数。在编写程序时,变量名是可以直接引用的。在汇编程序为变量分配相应的内存区域后,对变量的引用实际上都转换成了变量的偏移地址。5.2汇编语言入门变量具有5种属性(1)段地址(SEG)5.2汇编语言入门5.2.6汇编语言的属性运算符和表达式用来获取或重新定义变量或标号属性的运算符称为属性运算符。(1)取地址运算符SEG格式:SEG变量或标号功能:返回变量或标号的段地址。例如,“MOVAX,SEGCOUNT”,指的是将变量COUNT的段地址送入AX。5.2汇编语言入门5.2.6汇编语言的属性运算符和表5.2汇编语言入门(2)取偏移地址运算符OFFSET格式:OFFSET变量或标号功能:返回变量或标号的偏移地址。例如,“MOVSI,OFFSETCOUNT”,指的是将变量COUNT的偏移地址送入SI。(3)取类型运算符TYPE格式:TYPE变量或标号功能:返回变量或标号的类型值例如,“MOVAX,TYPECOUNT”,指的是将变量COUNT的类型值送入AX。变量和标号的类型值5.2汇编语言入门(2)取偏移地址运算符OFFSET格式5.2汇编语言入门(4)取变量长度运算符LENGTH格式:LENGTH变量功能:返回变量的长度(即变量中元素的个数),可以以字节、字或双字为单位。例如,若定义“COUNTDW100DUP(1)”,则LENGTHCOUNT的值为100;若

定义“BUFFDD1,2,3”,则LENGTHBUFF的值为1。提示当在变量定义中使用DUP时,该表达式返回分配给变量的单元数,其他情况下返回值为1。5.2汇编语言入门(4)取变量长度运算符LENGTH格式5.2汇编语言入门(5)取变量总字节数运算符SIZE格式:SIZE变量功能:返回变量所包含的总字节数。例如,若定义“COUNTDW100DUP(1)”,则SIZECOUNT的值为200。提示该表达式的值实际上是LENGTH值和TYPE值的乘积,即SIZE=LENGTH×TYPE。5.2汇编语言入门(5)取变量总字节数运算符SIZE格式5.2汇编语言入门(6)类型运算符PTR格式:类型PTR变量、标号或表达式功能:对已定义的变量、标号或表达式,临时转换其类型,类型可以是BYTE,WORD,DWORD,NEAR或FAR。例如,“MOVAX,WORDPTRCOUNT”,指的是将变量COUNT临时转换成字类型。注意该操作符表达式只在本语句中有效,在其他地方不起作用。5.2汇编语言入门(6)类型运算符PTR格式:类型P5.2汇编语言入门(7)类型定义运算符THIS格式:变量或标号EQUTHIS类型功能:指定变量或标号的类型,但不为其分配存储单元,所定义变量的段地址和偏移地址与下一个存储单元地址相同。例如:COUNTEQUTHISBYTERESULTDW100DUP(?)该语句定义COUNT为字节类型,其地址与RESULT完全相同。注意,这里的RESULT是字型类型。(8)段超越前缀格式:段寄存器名:变量、标号或地址表达式功能:给变量、标号或地址表达式临时指定一个段属性。例如,“MOVAX,ES:[1000H]”,指的是将附加段中偏移地址为1000H的内存单元

的内容送入AX。5.2汇编语言入门(7)类型定义运算符THIS格式:变量5.2汇编语言入门(9)取高字节运算符HIGH格式:HIGH变量或标号功能:分离出变量或标号对应的运算对象的高字节。例如,“DATAEQU1234H”,则“MOVAL,HIGHDATA”的结果为(AL)=12H。(10)取低字节运算符LOW格式:LOW变量或标号功能:分离出变量或标号对应的运算对象的低字节。例如,“DATAEQU1234H”,则“MOVAL,LOWDATA”的结果为(AL)=34H。(11)短转移运算符SHORT格式:SHORT标号功能:说明转移指令中的转移为短转移,即目标地址与本指令之间的距离在-128~127字节范围内。例如,“JMPSHORTNEXT”,限制转移范围小于128个字节。5.2汇编语言入门(9)取高字节运算符HIGH格式:HI5.2汇编语言入门5.2.7常用伪指令1数据定义伪指令格式:变量数据定义伪指令表达式功能:为数据分配存储单元,其类型由使用的数据定义伪指令决定常用的数据定义伪指令5.2汇编语言入门5.2.7常用伪指令1数据定义伪指5.2汇编语言入门数据段DSEG由以下语句组成:DSEGSEGMENTNUM1DB12HNUM2DB34H,56H,78HNUM3DB?DSEGENDS设本段的段基址为1000H,则相应的内存单元分配情况如右图所示。例5-1

“COUNTDW1122H,3344H”的内存单元分配情况如右图所示。例5-25.2汇编语言入门数据段DSEG由以下语句组成:例5-15.2汇编语言入门“DB100DUP(?)”的功能是分配100个字节的内存单元。例5-3“DATADB‘ABCD’”的内存单元分配情况如右图所示。例5-4注意“?”用来定义值不确定的变量,并为变量保留空单元,常用来存放运算结果。对字符串进行定义时可以用DB或DW伪指令,字符串必须用单引号引起来。用DW定义的字符串只允许包含一个或两个字符,当字符多于两个时必须用DB来定义。另外,空格也是一个字符(ASCII码为20H)。5.2汇编语言入门“DB100DUP(?)”5.2汇编语言入门2符号定义伪指令格式:标识符EQU表达式功能:用一个标识符来表示表达式的值,但并不为其分配内存单元。EQU伪指令不能对标识符进行再定义。例如,“COUNTEQU10”表示给COUNT赋值为10;“NUMEQUTAB[BX+3]”表示将表达式TAB[BX+3]的值赋值给NUM。(1)赋值伪指令5.2汇编语言入门2符号定义伪指令格式:标识符EQU5.2汇编语言入门格式:标识符=表达式功能:与EQU的功能相同,并且也不分配内存单元,但“=”可以对同一标识符进行重新定义。例如,可以这样定义变量COUNT:COUNT=10COUNT=COUNT+1(2)等号伪指令格式:变量或标号LABEL类型功能:定义或修改变量或标号的类型。例如,COUNTLABELBYTEDB10功能是定义变量COUNT为字节型变量,值为10。(3)标号定义伪指令5.2汇编语言入门格式:标识符=表达式(2)等号伪指令格5.2汇编语言入门3段定义伪指令格式:段名SEGMENT[定位类型][组合类型][类别]……

段名ENDS功能:对段的结构进行定义,所有的段必须经过定义后才能使用。(1)SEGMENT和ENDS伪指令定位类型表示对段的起始边界的约定,有BYTE(从字节边界开始)、WORD(从字边界开始)、PARA(从一个节的边界开始,16个字节为一个节)和PAGE(从页边界开始,256个字节为一页)4种类型,默认类型为PARA。组合类型用来说明各模块的组合方式,以保证各模块在汇编后连接成一个完整的程序,有NONE,PUBLIC,STACK,COMMON,AT表达式和MEMORY共6种组合类型。类别是用单引号括起来的字符串,连接程序把不同模块中同类型的段存放在连续的存储区域中。5.2汇编语言入门3段定义伪指令格式:段名SEGME5.2汇编语言入门提示NONE:本段与其他段在逻辑上无关,连接后各模块中的各段具有自己的段地址和偏移地址。PUBLIC:连接时,不同模块中属于此类型的同名段连接成一个逻辑段,按顺序排列在同一个物理段中,并具有相同的段地址。STACK:连接方式同PUBLIC,仅用于说明堆栈段。COMMON:连接时,各模块中属于此类型的同名段合并成一个逻辑段,且相互覆盖,具有相同的段地址。AT表达式:连接时,将表达式的值作为段地址。MEMORY:连接时,将本段装在被连接的其他所有段之上。5.2汇编语言入门提示NONE:本段与其他段在逻辑上无关5.2汇编语言入门注意SEGMENT和ENDS必须成对出现,它们前面的段名必须一致。段名一旦定义,就具备了这样5个属性:段基址、偏移地址、定位类型、组合类型和类别。5.2汇编语言入门注意SEGMENT和ENDS必须成对出5.2汇编语言入门格式:ASSUME段寄存器:段名[,…,段寄存器:段名]功能:在各段定义完之后,用于指明段寄存器与各段之间的对应关系,告诉汇编程序源程序中的各段由哪个段寄存器去寻址。例如,语句“ASSUMECS:CSEG,DS:DSEG,SS:SSEG”的功能是将CS,DS和SS分别设定为代码段、数据段和堆栈段寄存器,并指明程序中定义的CSEG段为代码段,DSEG段为数据段,SSEG段为堆栈段。(2)ASSUME伪指令5.2汇编语言入门格式:ASSUME段寄存器:段名5.2汇编语言入门注意ASSUME只是指明各段寄存器中存放哪个段的段地址,但并没有为其设定初值。所以程序中必须通过指令将段基址装入段寄存器。每个段的段地址实际是一个16位的立即数,用其段名来表示(设DATA段为数据段),故先将段地址送入通用寄存器后,再传送给段寄存器,代码为:MOVAX,DATAMOVDS,AXMOVES,AXCS和SS两个段寄存器的值是由系统自动装入的,而DS和ES段寄存器的设置必须由用户通过数据传送指令才能实现。5.2汇编语言入门注意ASSUME只是指明各段寄存器中存5.2汇编语言入门4过程定义伪指令格式:过程名PROC[类型]……RET

过程名ENDP功能:标识一个执行特定功能的代码块(又称子程序),该程序可被其他程序调用。其中,类型可以是NEAR(段内调用)或FAR(段间调用)。需要注意,PROC和ENDP必须成对出现,它们前面的过程名是相同的,最后一条指令是返回指令,使过程结束后可以返回主程序。5结束伪指令格式:END[标号]功能:汇编程序结束。其中,标号是程序开始执行的起始地址标号,表示程序装入内存后要从此处启动程序。5.2汇编语言入门4过程定义伪指令格式:过程名PRO5.2汇编语言入门5.2.8汇编语言源程序的结构汇编语言源程序是由若干个逻辑段组成的,一个汇编语言源程序的基本框架为:在代码段中,①指定每个段分配给哪一个段寄存器;②~④把段地址装入相应的段寄存器中,其中代码段的段地址由系统自动装入;⑤~⑥表示汇编语言程序结束,返回DOS。5.2汇编语言入门5.2.8汇编语言源程序的结构汇编5.2汇编语言入门01数据段DS:定义程序中的数据和变量,分配存储空间。02附加段ES:当用户程序中使用的数据量很大或使用字符串操作指令时,需设置附加段来增加数据段的容量。03堆栈段SS:分配堆栈段的大小或保存子程序调用和程序中断时的断点地址等。02代码段CS:存放程序指令序列的区域。5.2汇编语言入门01数据段DS:定义程序中的数据和变量5.3汇编程序设计的基本方法5.3.1汇编程序设计的一般步骤分析问题,确定算法编写程序之前,应首先对要求解的问题进行仔细分析,明确该问题的条件和任务,找出解决问题的方法和步骤。然后选择合理的算法和数据结构,将一个实际问题转化为计算机可以处理的问题,这是编写一个好程序的基础。画出程序流程图根据设计的算法画出程序流程图,从而直观、形象地描述程序的执行过程,进而检验算法的可行性

温馨提示

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

评论

0/150

提交评论