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

下载本文档

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

文档简介

1,第4章汇编语言程序设计,2,本章讲述:4.1汇编语言程序格式4.2伪指令语句4.3DOS系统功能调用和BIOS功能调用4.4程序设计方法4.5宏汇编和条件汇编,3,8086汇编语言程序的一个例子,MY_DATASEGMENT;定义数据段SUMDB?;为符号SUM保留一个字节MY_DATAENDS;定义数据段结束MY_CODESEGMENT;定义码段ASSUMECS:MY_CODE,;规定CS和DS的内容DS:MY_DATAPORT_VALEQU3;端口的符号名GO:MOVAX,MY_DATA;DS初始化为MY_DATAMOVDS,AXMOVSUM,0;清SUM单元CYCLE:CMPSUM,100;SUM单元与100相比较JNANOT_DONE;若未超过,转至NOT_DONEMOVAL,SUM;若超过,把SUM单元的内容OUTPORT_VAL,AL;通过AL输出HLT;然后停机NOTDONE:INAL,PORT_VAL;未超过时,输入下一个字节ADDSUM,AL;与以前的结果累加JMPCYCLE;转至CYCLEMYCODEENDS;码段结束ENDGO;整个程序结束,4,由上例看出8086汇编的一个语句行由以下4个部分组成:标号(或名称)操作码操作数;注释各部分之间至少要用一个空格作为间隔。IBM宏汇编对于语句行的格式是自由的,但如果写成格式化就便于阅读,建议读者按格式化来写语句行。另外,IBM宏汇编并不要求一个语句只能写一行,一个语句可以有后续行,规定以字符“&”作为后续行的标志。,5,4.1汇编语言程序格式,4.1.1指令性语句与伪指令(指示性)语句指令性语句标号:指令助记符操作数,操作数;注释伪指令语句名字伪指令助记符操作数,操作数;注释,6,4.1.2数据项常数、变量和标号,常数没有任何属性的纯数值。在汇编期间,它的值已能完全确定,在程序运行中值也不会发生变化。它可以有以下几种类型:二进制数,八进制数,十进制数,十六进制数实数:它由整数、小数和指数3部分组成,字符串常数:用引号括起来的一个或多个字符。,7,变量代表存放在某些存储单元的数据,这些数据在程序运行期间随时可以修改。变量的属性段属性(SEG):表示变量存放在哪一个逻辑段中(即变量所在段的段基值);偏移量属性(OFFSET):表示变量在逻辑段中离段起始点的字节数;类型属性(TYPE):表示变量占用存储单元的字节数。,8,标号标号是一条指令目标代码的符号地址,它常作为转移指令(含子程序调用指令)的操作数。段属性(SEG)、偏移量(OFFSET)、距离属性(NEAR、FAR),9,4.1.3表达式,表达式(Expressions)是由运算对象及运算符成。粗略地说,一个表达式是一个由操作数和运算符组合的序列,在汇编时它能产生一个值。,10,2.运算符(Operators)IBM宏汇编通常有以下几种运算符:算术运算符(ArithmeticOperators);逻辑运算符(LogicalOperators);关系运算符(RelationalOperators);数值返回运算符(AnalyticOperators);修改属性运算符(SyntheticOperators);其它运算符,11,(1)算术运算符这是读者十分熟悉的运算符-+(加)、-(减)、*(乘)、/(除)运算符。另一个算术运算符是MOD(求余),它产生除法以后的余数。因此19/7是2(商是2),而19MOD7是5(余数是5)。算术运算符应用于数字操作数,结果也是数字的。当算术运算符应用于存储器即地址操作数时其规则就更加严格:只有当结果有明确的、有意义的物理解释时,这些运算才是有效的。,12,(2)逻辑运算符按位操作的逻辑运算符有:AND(与)、OR(或)、XOR(异或)和NOT(非)。逻辑运算的操作数只能是数字的,而且结果是数字的。存储器地址操作数不能进行逻辑运算。注意:AND、OR、XOR和NOT,也是8086指令的助记符。但是,作为IBM宏汇编的运算符是在程序汇编时计算的。而作为指令的助记符,则是在程序执行时计算的。,13,(3)关系运算符在IBM宏汇编中有以下关系运算符:相等EQ(Equal);不等NE(NotEqual);小于LT(LessThan);大于GT(GreaterThan);小于或等于LE(LessThanorEqual);大于或等于GE(GreaterThanorEqual)。,14,(4)数值返回运算符分析运算符可以把存储器操作数分解为它的组成部分,如它的段值SEG、段内偏移量OFFSET、类型TYPE、长度LENGTH和大小SIZE。(5)属性修改运算符属性修改运算符可以由已经存在的存储器操作数生成一个段值与偏移量相同、而类型不同的新的存储器操作数。如段前缀、PTR、THIS、SHORT、HIGH/LOW等。,15,(6)其它运算符()、,MASK及WIDTH,16,4.2伪指令语句(指示性语句),在IBM宏汇编中有以下几种指示性语句(Directivestatements):(1)数据定义语句(Datadefinition);(2)标号定义语句(Symboldefinition);(3)段定义语句(Segmentationdefinition);(4)过程定义语句(Proceduredefinition);(5)程序开始、结束语句(Termination)。此外,还有段分配、群定义、结构定义、记录定义等语句。,17,4.2.1数据定义语句,格式:变量名助记符操作数,操作数;注释变量名助记符nDUP(操作数,操作数);注释(1)字节定义伪指令名字DB(表达式或数据项表)(2)字定义伪指令名字DW(表达式或数据项表)(3)4字节定义伪指令名字DD(表达式或数据项表)(4)8字节定义伪指令名字DQ(表达式或数据项表)(5)10字节定义伪指令名字DT(表达式或数据项表),18,4.2.2标号定义语句,等值语句:(符号名)EQU(表达式)等号语句:(符号名)(表达式)注意:用EQU语句赋值的符号名不能被重新赋值,“”可以。,19,4.2.3段定义语句,8086的存储器是分段的,所以8086必须按段来组织程序和利用存储器,这就需要有段定义语句。段定义的主要命令有:(1)SEGMENT,(2)ENDS,(3)ASSUME,(4)ORG。SEGMENT和ENDS语句把汇编语言源程序分成段,这些段就相应于存储器段,在这些存储器段中,存放相应段的目标码。汇编程序必须知道程序的段结构,并知道在各种指令执行时将访问哪一个段由段寄存器所指向。这个信息是由ASSUME语句提供的。,20,通常在汇编语言的源程序中,至少要定义码段(指令段)、堆栈段和数据段,有时还要定义附加段。每一个段必须有一个名称,如MY_DATA、MY_CODE等。一个段由命令SEGMENT开始,由命令ENDS结束,它们必须成对出现,而且它们的语句中必须有名称,名称必须相同。最后用语句END来结束整个源程序。ASSUME语句,只是使汇编程序知道在程序执行时各个段寄存器的值,而这些段寄存器的实际值(除了码段寄存器CS以外),还必须在程序执行时,用MOV指令来赋给。,21,一般来说,存储器段具体在哪儿是不重要的,可由汇编程序来选择。但是,在有些情况下,可能要给汇编程序一些约束,例如:“不要使这个段与别的段搭接”,保证这个段所用的第一个字节在偶数地址,这样对于一个字的访问可以在一个存储器读写周期完成。或“在下列地址开始这个段”。可以把这些约束写入到源程序中。另一个语句ORG(origin),它规定了段内的起始地址。伪指令ORG的一般格式为:ORG表达式此语句指定了段内在它以后的程序或数据块存放的起始地址,即以语句中的表达式的值作为起始地址,连续存放,除非遇到一个新的ORG语句。,22,4.2.4过程定义语句,过程是程序的一部分,它们可被程序调用。每次可以调用一个过程。当过程中的指令执行完后,控制返回调用它的地方。在8086中调用过程和从过程返回的指令是CALL和RET。这些指令可以有两种情况:段内的和段交叉的。段交叉指令把过程应该返回处的段地址和段内偏移量这两者都入栈保护(CALL指令)和退栈(RET指令)。段内的调用与返回指令只入栈和退栈段内的地址偏移量。,23,过程定义语句的格式为:PROCEDURE_NAMEPROCNEAR或PROCEDURE_NAMEPROCFARRETPROCEDURE_NAMEENDP伪指令PROC与ENDP都必须有名称,两者必须成对出现,名称必须相同。利用过程调用语句可以把程序分段,以便于阅读、理解、调试和修改。,24,若整个程序由主程序和若干个子程序组成,则主程序和这些子程序必须一起包含在码段中(除非用段交叉调用)。主程序和各个子程序都作为一个过程,用上述的过程定义语句来定义。用段内CALL指令调用的过程,必须用段内的RET指令返回,这样的过程是NEAR过程;用段交叉CALL指令调用的过程,必须用段交叉RET指令返回,这样的过程是FAR过程。过程定义语句PROC和ENDP(EndProcedure)限定了一个过程且指出它是一个NEAR或FAR过程。这在两方面帮助了汇编程序。,25,4.2.5程序开始和结束语句,除了一个例外(END结束语句)以外,每一个结束语句(TerminationStatements)都与某个开始语句成对出现。例如,SEGMENT和ENDS,PROC和ENDP。惟一的例外就是END语句,它标志着整个源程序的结束,它告诉汇编程序,没有更多的指令要汇编了。END语句的格式是:END表达式其中,表达式必须产生一个存储器地址值,这个地址是当程序执行时,第一条要执行的指令的地址。,26,4.3DOS系统功能调用和BIOS中断调用,为了在程序运行过程中了解运行的情况,应该设法把结果在显示器CRT上显示出来。要在程序中显示结果,方便的方法是调用操作系统中的I/O子程序。操作系统的核心是由许多有关I/O驱动、磁盘读写以及文件管理等子程序构成。这些子程序都编了号,可由汇编语言的源程序调用。在调用时,把子程序的号(或称系统功能调用号)送至AH,把子程序规定的入口参数,送至指定的寄存器,然后由中断指令INT21H来实现调用。在这里通过几个程序例子介绍少量的有关I/O的功能调用,便于读者在程序中使用。,27,28,4.3.3BIOS中断调用,驻留在ROM中的BIOS提供了系统加电自检、引导装入IO设备的处理程序及接口控制等功能模块来处理所有的系统中断。与DOS功能调用相同,用户可以直接用指令设置参数,然后中断调用BIOS中的程序,给用带来了极大的方便。,29,4.4程序设计方法,一、汇编语言程序设计基本步骤分析问题,确定模型确定算法绘制流程图编写程序检查和调试,30,二、汇编语言程序的基本结构顺序结构分支结构循环结构子程序,31,4.4.1顺序结构,32,4.4.2分支结构,33,实现,34,4.4.3循环结构,35,4.4.4子程序结构,Callproc1,ret,主程序,子程序proc1,36,实现方法主程序有调用指令call子程序有返回指令ret特点Call指令与ret缺一不可现场保护入口出口参数设置,37,4.5宏汇编与条件汇编,在前面举例中,若一个程序段要多次使用,为了简化程序采用了子程序的办法。因此,常常把一些经常使用的典型的程序编为子程序,一方面简化了程序的编制,另外也可以提高程序的质量和可靠性。这样的目的也可以用宏指令和宏汇编来实现。,38,4.5.1宏定义,宏指令名MACRO形式参数,形式参数,宏体ENDM,39,宏指令与子程序的区别宏指令是用一条宏指令来代替一段程序,以简化源程序。子程序也有类似的功能,那么,这两者之间有什么区别呢?(1)宏指令是为了简化源程序的书写,在汇编时,汇编程序处理宏指令,把宏定义体插入到宏调用处。所以,宏指令并没有简化目标程序。有多少次宏调用,在目标程序中仍需要有同样多次的目标代码插入。所以,宏指令没有能节省目标程序所占的内存单元。子程序是在执行时由CPU处理的。若在一个主程序中多次调用同一个子程序,在目标程序的代码中,主程序中仍只有调用指令的目标代码,子程序的代码仍是一个。,40,(2)根据上述比较,可以看出:若在一个源程序中多次调用一个程序段,则可用子程序,也可以用宏指令来简化源程序。用子程序的方法,汇编后产生的目标代码少,也即目标程序占用的内存空间少,节约了内存空间。但是,子程序在执行时,每调用一次都要先保护断点,通常在程序中还要保护现场;在返回时,先要恢复现场,然后恢复断点(返回)。这些操作都额外增加了时间,因而执行时间长,速度慢。而宏指令恰好相反,它的目标程序长,占用的内存单元多;但是执行时不需要保护断点、保护现场以及恢复、返回等这些额外的操

温馨提示

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

评论

0/150

提交评论