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

付费下载

下载本文档

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

文档简介

1、第4章汇编语言程序设计,教学目的及要求1.掌握汇编源程序的编辑、汇编、连接和调试的开发方法2.掌握常用汇编伪指令的含义和用法3.掌握汇编语言源程序中返回DOS的方法4.理解顺序程序、分支结构、循环程序和子程序的设计方法重点:分支结构、循环程序和子程序的设计方法,4.1汇编语言程序的语句格式,执行性语句由硬指令构成的语句,它通常对应一条机器指令,出现在程序的代码段中:标号:硬指令助记符操作数,操作数;注释说明性语句由伪指令构成的语句,它通常指示汇编程序如何汇编源程序:名字伪指令助记符参数,参数,;注释硬指令使CPU产生动作、并在程序执行时才处理的语句,就是前面学习的处理器指令伪指令(Direct

2、ive)不产生CPU动作、在程序执行前由汇编程序处理的说明性语句,例如,数据说明、变量定义等等伪指令与具体的处理器类型无关,但与汇编程序的版本有关,MOVCX,0;传送指令,具有2个操作数DELAY:NOP;空操作指令,没有操作数,带有标号LOOPDELAY;循环指令,标号DELAY说明转移位置BUFFERDB1,2,3,4,5,6,7;数据定义伪指令,在主存中开辟7个连续的字节单元,初值依次为17,BUFFER表示首地址,汇编语言语句实例,标号、名字与标识符,标号是反映硬指令位置(逻辑地址)的标识符,后跟一个冒号分隔名字是反映伪指令位置(逻辑地址)和属性的标识符,后跟空格或制表符分隔,没有冒

3、号标识符(Identifier)一般最多由31个字母、数字及规定的特殊符号(如_、$、?、)组成,不能以数字开头。默认情况下,汇编程序不区别标识符中的字母大小写一个程序中,每个标识符的定义是唯一的,还不能是汇编语言采用的保留字,保留字,保留字(ReservedWord)是汇编程序已经利用的标识符,主要有:硬指令助记符例如:MOV、ADD伪指令助记符例如:DB、EQU操作符例如:OFFSET、PTR寄存器名例如:AX、CS预定义符号例如:data,4.2伪指令,4.2.1符号定义伪指令等值伪指令EQU格式:EQU功能:把表达式的值赋给符号名。等号伪指令“”EMP=6EMP=EMP+1解除定义伪指

4、令PUREG格式:PUREG符号1,符号2,符号3功能:解除对符号1、符号2、符号3的赋值,4.2.2变量定义伪指令,变量定义(Define)伪指令为变量申请固定长度的存储空间,并可同时将相应的存储单元初始化格式:变量名DB/DW/DD初值表,所有的变量都具有三种属性:(1)段值(SEGMENT),即变量单元所在段的段地址(段的起始地址)的高16位,低4位始终为0;(2)偏移量(OFFSET),即变量单元地址与段的起始地址之间的偏移量(16位);(3)类型(TYPE),变量有三种类型:字节(BYTE)、字(WORD)和双字(DOUBLEWORD)。变量通常是用存储器初始化命令定义的。,初值表,

5、初值表是用逗号分隔的参数主要由数值常数、表达式或?、DUP组成?表示初值不确定,即未赋初值;DUP表示重复初值DUP的格式为:重复次数DUP(重复参数),例如BIGGESTDD12345678H在汇编时就会初始化,如图所示。它定义了一个双字变量,且给了初始值。,例如:DB100DUP(0);100个字节全初始化为0DW100DUP(0);100个字全初始化为0DW10DUP(?);保留10个字例如:ARRAY1DB2DUP(0,1,2,?)汇编后的存储情况如右图一所示例如:DBABDWAB汇编后的存储情况如图1和图2所示.,图2,图3,42,41,42,41,4.2.3属性修改运算符PTR使用

6、格式为:类型PTR地址表达式例如:DA_BYTEDB20HDUP(0)DA_WORDDW30HDUP(0)MOVAX,WORDPTRDA_BYTE10ADDBYTEPTRDA_WORD20,BL,4.2.4分析运算符(1)SEG(2)OFFSET分析运算符SEG,返回的是一个存储单元的段地址(即它所在段的起始地址);OFFSET运算符返回的是每一个存储单元地址的段内偏移量,即它与段地址之间的偏差。例如:BUFFER1DB100DUP(0)MOVAX,SEGBUFFER1MOVDS,AXMOVSI,OFFSETBUFFER1,4.2汇编语言源程序,4.2.18086汇编语言程序的一个例子;完成两

7、个字节数据相加DATASEGMENT;段定义开始BUF1DB34H;第1个加数BUF2DB2AH;第2个加数SUMDB?;准备用来存放和数的单元DATAENDS;段定义结束(DATA)CODESEGMENT;段定义开始(CODE段)ASSUMECS:CODE,DS:DATA;规定DATA、CODE分别为数据段和代码段,START:MOVAX,DATAMOVDS,AX;给数据段寄存器DS赋值MOVAL,BUF1;取第1个加数ADDAL,BUF2;和第2个加数相加MOVSUM,AL;存放结果MOVAH,4CHINT21H;返回DOS状态CODEENDS;段定义结束(CODE段)ENDSTART;整

8、个源程序结束,4.2.28086汇编语言源程序的格式,8086的汇编语言的源程序是分段的,由若干个段形成一个源程序。源程序的一般格式为:NAME1SEGMENT语句语句NAME1ENDSNAME2SEGMENT语句语句NAME2ENDSEND标号,每一个段有一个名称,以符号SEGMENT作为段的开始,以语句ENDS作为段的结束。这两者都必须有名称,而且名称必须相同。由若干个段组成一个源程序,整个源程序以语句END作为结束。总之,8086的源程序是由若干段组成的,而一个段又是由若干个语句行组成的。所以,语句行是汇编语言源程序的基础。,4.2.3段定义语句,8086的存储器是分段的,所以8086必

9、须按段来组织程序和利用存储器,这就需要有段定义语句。段定义的主要命令有:(1)SEGMENT,(2)ENDS,(3)ASSUME,SEGMENT和ENDS语句把汇编语言源程序分成段,这些段就相应于存储器段,在这些存储器段中,存放相应段的目标码。汇编程序必须知道程序的段结构,并知道在各种指令执行时将访问哪一个段由段寄存器所指向。这个信息是由ASSUME语句提供的。,通常在汇编语言的源程序中,至少要定义码段(指令段)、堆栈段和数据段,有时还要定义附加段。每一个段必须有一个名称,如MY_DATA、MY_CODE等。一个段由命令SEGMENT开始,由命令ENDS结束,它们必须成对出现,而且它们的语句中

10、必须有名称,名称必须相同。最后用语句END来结束整个源程序。ASSUME语句,只是使汇编程序知道在程序执行时各个段寄存器的值,而这些段寄存器的实际值(除了代码段寄存器CS以外),还必须在程序执行时,用MOV指令来赋给。,4.3汇编源语言程序设计,分支结构示意图,循环结构示意图,4.3.1分支结构举例,在一个实际的程序中,程序始终是直线执行的情况是不多见的,通常都会有各种分支。例1变量x的符号函数可用下式表示:y=1,当x0y=0,当x=0y=-1,当x0在程序中,要根据x的值给y赋值,如图4-所示。,START:MOVAX,DATAMOVDS,AXCMPAL,0JGEBIGRMOVAL,0FF

11、HJMPEQULBIGR:JEEQULMOVAL,1EQUL:MOVYY,AL,例2编制计算下面函数值的程序(X,Y均为字节符号数)z=1,当x0,y0z=0,当x和y异号z=-1,当x0,y0分析根据题意,先判断X,Y是否异号,异号Z赋值0;若不是异号即是同号,则只需要再判断其中任一数的符号即可得知X,Y是大于等于零还是小于零。另外,本程序采用先赋值后判断的方法可简化程序设计。,DATASEGMENTXDB5YDB-9ZDB0DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAL,XXORAL,YJSBACK

12、MOVZ,1,CMPX,0JNSBACKNEGZMOVDL,ZBACK:MOVAH,4CHINT21HCODEENDSENDSTART,4.3.2循环程序设计,例1在数据区中有一个数据存储区,该存储区中有若干个字节数据。要求编写程序统计这些字节数据中0出现的次数并送到另一个内存单元COUNT中。DATASEGMENTSTRdb1,2,0,0,0,3,45,9,0,0,0,69,0,1,89CNEQU$-STRCOUNTDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX,MOVDI,OFFSETSTRMOVDL,

13、0MOVCX,CNMOVAL,0again:cmpdi,alJNZnextINCDLnext:incdiloopagainMOVCOUNT,DLMOVAH,4CHINT21HCODEENDSENDSTART,例2设从开始存放若干无符号字节数据,找出其中的最小值,将其保存在寄存器中分析因为需要重复进行数据大小的比较,所以可设计为循环程序结构形式,设计要点是:找出循环的规律;确定控制循环的方法,参考程序:DATASEGMENTBUFDB26,78,196,45,16,9CNTEQU$-BUFDATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DA

14、TAMOVDS,AXMOVCX,CNT-1MOVSI,OFFSETBUFMOVBL,SI,M2:INCSICMPBL,SIJBEM1MOVBL,SIM1:DECCXJNZM2MOVDL,BLCODEENDSENDSTART,例3TABLE是一字节数组的首地址,长度为100,统计此数组中正数零及负数的个数。并分别放在COUNT1、COUNT2、COUNT3变量中。分析既存在循环操作,又存在分支。程序的分支一般用条件转移指令来产生,连续使用条件转移指令可使程序产生多个分支。,DATASEGMENTTABLEDB100DUP(?)COUNT1DB0COUNT2DB0COUNT3DB0DATAENDS

15、CODESEGMENTASSUMECS:CODE,DS:DATA,START:MOVAX,DATAMOVDS,AXMOVCX,100MOVBX,0AGAIN:CMPTABLEBX,0JGEM1INCCOUNT3JMPSHORTNEXTM1:JGM2INCCOUNT2JMPSHORTNEXT,M2:INCCOPUNT1NEXT:INCBXLOOPAGAINMOVAH,4CHINT21HCODEENDSENDSTART,4.2.3子程序设计,例1编写一子程序,完成一个2位十六进制数到对应的ASCII码的转换。子程序名:CONHA功能:将2位十六进制数转换成对应的ASCCII码输入参数:AL待转换的

16、数输出参数:BX转换好的ASCII码使用寄存器:AL、AH、BX、CL,CONHAPROCFARMOVAH,AL;保存待转换的数ANDAL,0FH;处理十六进制数低位CMPAL,0AH;是16进制中的字母吗?JBASC1;否,转移ADDAL,07;是,先加7ASC1:ADDAL,30H;转换为ASCII码MOVBL,AL;保存转换好的低位MOVCL,4;移位控制SHRAH,CL;将原数右移,处理高位CMPAH,0AH;是16进制中的字母吗?JBASC2;否,转移ADDAH,07;是,先加7ASC2:ADDAH,30HMOVBH,AH;保存转换好的高位RETCONHAENDP,子程序指令,子程序

17、是完成特定功能的一段程序当主程序(调用程序)需要执行这个功能时,采用CALL调用指令转移到该子程序的起始处执行当运行完子程序功能后,采用RET返回指令回到主程序继续执行,子程序调用和返回指令,1)CALL指令段内直接调用例:CALLNEAR目标地址段内间接调用例:CALLWORDPTRSI段间直接调用例:CALLFAR目标地址段间间接调用例:CALLWORDPTRSI,)RET子程序返回指令和调用指令CALL相对应的是返回指令RET。返回指令通常作为一个子程序或过程的最后一条指令,它用以返回到调用这个子程序的断点处。,过程名procnear/far.过程名endp过程名(子程序名)为符合语法的

18、标识符NEAR属性(段内近调用)的过程只能被相同代码段的其他程序调用FAR属性(段间远调用)的过程可以被不同代码段的程序调用,子程序定义,主程序与子程序,CALLlabel,主程序,RET,子程序,回到CALL指令后的指令处返回地址,4.4DOS功能调用,调用过程为:DOS功能调用号送AH寄存器;如果需要,按要求给定输入参数(有的不需要输入参数);写入中断指令INT21H。调用结束,按功能使用其输出参数。,1、单字符输入1号功能:从键盘输入1个字符输入参数:无输出参数:AL=ASCII码2、单字符输出2号功能:在屏幕上显示1个字符(ASCII码)输入参数:DL=ASCII码输出参数:无,3、多字符输入0AH功能:多个字符输入到缓冲区输入参数:DS

温馨提示

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

评论

0/150

提交评论