




已阅读5页,还剩138页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第四章8086汇编语言程序设计,几个概念8086汇编语言的语句8086汇编中的伪指令8086汇编中的运算符汇编语言程序设计宏定义与宏调用汇编语言系统程序设计实例与上机调试,几个概念,程序是一组为完成某种功能而按一定顺序(由算法确定)编排的指令序列。本章将首先介绍8086宏汇编语言的基本语法及常用伪指令,然后用实例说明8086宏汇编语言源程序的设计方法。,1.3种语言,机器语言:当指令和数据都用二进制代码表示时,计算机能够直接识别与执行,因而称之为机器语言。高级语言:是完全独立于机器的通用语言,效率低。面向过程、面向对象,必须译成机器语言。汇编语言:汇编语言是一种用符号表示的、面向CPU指令系统的程序设计语言。是用指令的助记符、符号地址、标号等编写程序的语言。,汇编语言程序是机器语言程序的符号表示,用汇编语言编写程序能够:,程序目标代码占用内存少,执行速度快,效率高,具有实时性.,直接利用硬件系统的特性(如寄存器、标志、中断系统等),直接对位、字节、字、寄存器或存储单元、I/O端口进行处理,同时也能直接使用CPU指令系统提供的各种寻址方式,编制出高质量的程序。,从源程序获得目标程序的过程,为了能顺利完成汇编,用户必须为汇编程序提供一些额外的、与硬件有关的信息.如:程序使用的变量应分别存放在内存的哪个单元、堆栈应从内存的什么地址开始等等。,2.汇编程序的作用,将源程序翻译成机器语言程序。按用户要求自动分配存储区域(如程序区、数据区等)。自动地把各种进制数二进制数。把字符ASCII码。计算表达式的值。自动对源程序进行检查,指出语法错误(如非法格式、未定义的助记符、标号、漏掉操作数等)。,3.汇编语言程序的上机与处理过程,汇编语言上机过程D:EDITABC.asmD:MASMABC有语法错,回EDIT下改该程序D:LINKABC有错,回在EDIT下改程序D:ABC运行结果错,回EDIT下改程序或在DEBUG下调试,找原因。D:DEBUGABC.exe,4.1汇编语言的程序结构与语句格式,语法语句和程序结构必须遵循的规则。源程序按其编译器能够理解的语法编写方可。,4.1.1汇编语言源程序的框架结构,1.源程序由若干个逻辑段组成每段由伪指令SEGMENT开始、由ENDS结束。通常有:代码段(必不可少)堆栈段建立一个堆栈区,以存放中断时的断点地址,子程序调用时断点地址及子程序间传递参数。数据段和附加数据段用来在内存中建立一个适当容量的工作区用以存放数据。,一、源程序的结构特点按逻辑段组织源程序。包括代码段、堆栈段、数据段等。,【例题4.1】实现:123+456sum的源程序,CODESEGMENT;语句6ASSUMECS:CODE,DS:DATAMAINPROCFAR;语句8START:PUSHDS;语句9.;RET;语句17MAINENDP;语句18CODEENDS;语句19,数据段,代码段,DATASEGMENT;语句1ADW123;语句2BDW456;语句3SUMDW?;语句4DATAENDS;语句5,ENDSTART;语句20,汇编语言语法,3.每段由若干语句行组成,每行只有一条语句且不能超过128个字符,允许有后续行。整个源程序以END结束,它通知汇编程序停止汇编。END后的START标号为程序运行时的起始地址。,2.在代码段起始处,用ASSUME伪指令说明各个段Reg与逻辑段的关系,并在程序起始处设置段Reg的初值(代码段CS除外)。,4.每条语句由4个字段构成。各字段间用空格分开。,5.源程序中设有返回DOS的指令语句,使程序执行完后返回DOS系统的命令接受状态。,二、源程序与PCDOS的接口汇编语言源程序(.ASM)经过汇编转变为目标程序(.OBJ),当用链接程序对其进行链接和定位时,操作系统为每个用户程序建立:,一个256字节的程序段前缀区(PSP),存放用户程序信息。在PSP的开始处(偏移地址0000H)安排一条INT20H软中断指令。INT20H功能是使系统返回到DOS管理状态。因此,用户执行程序完后,必须能够转到PSP起始处执行INT20H指令。,定位用户程序设置DS和ES的值使之指向PSP的开始处,即PSP的段地址DS和ES。将用户程序的段基址、第一条指令的偏移地址设置CS、IP;同时设置SS、SP。运行用户程序,保证用户程序执行完后返回DOS的方法第一种方法:标准序法将用户程序中的主程序定义为FAR过程,其最后一条指令为RET(当程序执行到RET时,会将栈顶的两个字分别送IP、CS)在主程序的开始处将PSP的段地址和偏移地址(DS、ES和0000H)进栈保护:PUSHDS;保护PSP段地址MOVAX,0;保护偏移0地址PUSHAX;用户程序开始当用户程序返回时,会返回到DOS(执行INT20H)。,注:由于DS、ES由DOS设置,所以在用户程序开始处应重新设置DS、ES。,第二种方法:非标准方法不定义主程序为FAR过程,并去掉标准序。在代码段结束之前(即CODEENDS之前)增加两句:MOVAH,4CHINT21H;4CH号的DOS系统功能调用,4.1.28086汇编语言的语句,源程序是一个语句序列,每条语句规定一个基本操作,语句序列完成某个特定的操作任务。,一、语句的种类与格式1.语句的种类(1)指令语句_可执行语句,对应CPU指令系统规定的一条指令。,汇编时,汇编程序为之产生一一对应的机器目标代码。例:MOVAH,4CHINCBX,(2)伪指令语句_汇编时给汇编程序提供与硬件有关的汇编信息,本身并不产生目标代码,CPU不执行。是指示汇编程序进行汇编的操作。,例:MESSAGEDBTHISISASAMPLEPROGRAM.;定义变量MESSAGE在数据段DATA中的存放形式汇编时,汇编程序将MESSAGE定义为一个字节类型数据区的首地址,并按字节存储字符串。,2.语句格式,指令语句的一般格式:标号:前缀指令助记符操作数;注释伪指令语句的格式:名字伪指令定义符操作数;注释,标识符字段标识符字段由各种有效字符组成,一般表示符号地址,具有段基址、偏移量、类型三种属性。很多情况下标识符字段是语句中的可选部分,主要为便于程序的读写方便而使用。标识符字段通常有:标号后跟冒号,在程序中作为JMP、LOOP指令的转移目标,与具体的指令地址相联系。名字用于定义常量名、变量名、过程名、段名等。,(1)标号和名字,标号和名字必须符合汇编语言对标识符的规定:以字母开头,由字母(不分大小写)、数字(09)及部分特殊字符(?$和下划线_等)组成,字符串长度不超过31个。标识符不能是汇编语言中有特定意义的保留字、助记符、Reg等,如:CPU的内部寄存器名AH、AL、AX等。,(2)助记符、定义符规定指令或伪指令的操作功能,是语句中唯一不可缺少的部分。,对于指令,汇编程序将其翻译成机器语言指令。MOVAX,100B80001对于伪指令,汇编程序据其要求的功能进行处理。dataSEGMENTdata与一段地址对应stringDBTsinghuastring与一内存地址对应,前缀仅可出现在指令助记符前。,(3)操作数指令语句中提供给指令的操作对象、存放位置。操作数可以是1个、2个或0个,2个时用逗号,分开。(INCBX;MOVAX,DATA;RET)伪指令语句中操作数的格式和含义随伪操作指令不同而不同。,(4)注释以“;”开始,给以编程说明。汇编程序对“;”后的内容不做处理。注释对汇编不起任何作用,不对应于任何机器码,仅增强源程序的可读性。,操作数可能为以下几种情况:常量操作数:如34等。寄存器操作数:如AX等。存储器操作数:如0100H等。表达式操作数:如AX+2、SEGNUM1等。,4.28086汇编中的伪指令,指示汇编、链接程序如何进行汇编和链接,影响目标代码生成,本身不产生目标代码。有符号定义语句、数据定义语句、程序结构语句、模块链接语句、有关宏的语句、条件汇编语句等。,给表达式赋予一种符号名,以便在程序中用它替代表达式1、等值语句格式:符号名EQU表达式例:PORTEQU40H;用PORT代替40H号端口COUNTEQUCX;用COUNT代替CX寄存器MEQUMOV;用M代替MOV指令助记符,注:EQU语句不能重新定义,即在同一源程序中,用EQU定义过的符号不能赋予不同的值。,例:BEQUbp+8BEQU20H不行!,4.2.1符号定义语句,2、等号语句格式:符号名表达式功能与EQU类似。例:PP=89FAH;赋值PP=PP+1;PP=89FBH,注:等号语句与EQU语句的相同点:符号不是变量,所以用EQU、=定义的符号不占用存储器单元。区别:等号语句可以在同一源程序中重复定义符号。,4.2.2变量定义语句用于定义变量(程序中所用的存储器操作数),指定变量的类型和名称,并为其分配存储单元和预置初值。,1.格式变量名数据定义符操作数,操作数,操作数变量名指示存储器操作数的地址(符号地址)数据定义符指示存储器操作数的类型(字节、字、双字等)操作数指示存储器操作数的内容,是赋给变量的初值。多个相同类型的变量可在一条语句中定义表示可选,汇编程序将定义的操作数,按其类型分配内存单元数,并顺序存入变量名指向的内存单元中。常用的数据定义符有:DB变量为字节数据类型DW变量为字数据类型,存放时低对低高对高。DD变量为双字数据类型,存放时低对低高对高。,经过定义的变量有3种属性:段值、段内偏移量和类型。若某个变量表示的是一个数组,则其类型属性为变量的单个元素所占用的字节数。,其它的数据定义符有:DQ变量为4字数据类型(64位)DT变量为10字节数据类型(80位),2.具体形式和功能(1)为数据项分配存储单元,用变量名作为该存储单元的名称。例:XDB25HYDW4142HZDD12345678H存储形式如图:,初始值也可以是表达式如:IN_PORTDBPORT_VALOUT_PORTDBPORT_VAL+1其中,PORT_VAL已由EQU语句赋了值。,(2)预留内存单元,但不赋值,以存放运算结果.例:ADB?BDB?,(3)定义一个数组例:W_TABLEDW1122H,3344HB_TABLEDB1,2,4,9,16当表中的操作数相同时,可用重复操作符DUP来缩写:格式:重复次数DUP(操作数)例:ALL_ZERODB0,0,0,0,0,0ALL_ZERODB6DUP(0),(4)定义字符串(只能用DB定义)例:MESSAGEDBHELLO每个字符的值为它的ASCII码值,所以用DB来定义。,例:str1DBTsingHuastr2DBINPUT:,0dH,0aH,$,dataSEGMENTxxDB1,-1,0FCHyyDW1,-1,0FCHzzDD1,-1,0FCHstrDBTsingHuabufDB4,?,4DUP(?)DBdataenddataENDScodeSEGMENTASSUMECS:codeASSUMEDS:datastart:MOVAX,dataMOVDS,AXLEABX,xxLEASI,yyLEADI,zzMOVAH,4CHINT21HcodeENDSENDstart,例:在DEBUG下查看变量存放情况。,例:XXDWCYCLEYYDDCYCLECYCLE:MOVBX,AX;CYCLE是程序的一个NEAR标号,例:VAR3DWVAR+1;将VAR+1的的偏移地址存入VAR3开始的两个字节或VAR3DDVAR+1;将VAR+1的的全地址存入VAR3开始的两个字,(5)将已定义的地址存放内存单元当操作数是标号或变量时,可用DW或DD将标号或变量操作数的偏移地址或全地址来初始化存储器。,例:TABLEDB12H,34HTAL_PSDDTABLE,4.2.3段定义伪指令(将程序分成若干逻辑段)用于告诉汇编程序和链接程序如何按逻辑段来组织程序和利用存储器。,1.段定义语句SEGMENT/ENDS用于对DS、ES、SS、CS段的定义格式:段名SEGMENT定位类型组合属性类别名(段体)段名ENDS,功能:指出段名和段的各种属性,并表示段的开始和结束位置。,段定义由伪操作SEGMENT开始、ENDS结束。SEGMENT和ENDS必须成对出现,且段名必须相同。SEGMENT和ENDS语句之间可以有指令和其他伪指令,表示存放在该段内存中的变量、指令或其他伪指令对该段内存的处理程序中可以定义多个段程序经汇编、连接及装入内存后,段名为一具体的段值(常量值)。,(1)定位类型告诉链接程序链接时段的起始边界,有4种选择:PAGE:段起始地址必须是256的倍数(XXX00H),最低8位为0。PARA:段起始地址必须是16的倍数(XXXX0H),最低4位必须为0。WORD:段起始地址必须是偶数(XX0B),最低1位必须为0。BYTE:段起始地址为任意值,即从任何地址开始都行。缺省类型为PARA。,(2)组合类型在多模块(每个模块有自己的代码段、数据段、堆栈段)组合时,告诉链接程序本段与其他模块中同名段的链接关系,有6种选择:NONE:本段与其它同名段逻辑上不发生关系,有自己的段基地址(缺省选择)。PUBLIC:在满足定位类型的前提下,链接程序将其与其他模块中的同名段邻接在一起,共用一个段地址。链接的先后次序由链接命令指定。,段定义的相关约定,STACK:与PUBLIC同样处理,链接后作为堆栈段,并自动初始化SS、SP,SS指向第一个STACK段。若程序中不说明STACK,则必须由用户在程序的开始处,自己通过语句设置SS、SP。COMMON:各模块中同名段重叠覆盖,有着相同的起始地址。段的长度取决于最长的COMMON段。段的内容为所链接的最后一个模块中COMMON段的内容。AT表达式:链接程序把本段装在表达式值所指定的段地址(此方式不能指定代码段)。例:AT0903H;本段从09030H开始存放。MEMORY:链接在其他所有段的后面(高端存储区)。若有多个MEMERY段,则只认第一个,其余按COMMON处理。,段定义的相关约定,(3)类别名给各段的名字信息,表示段的类别。类别必须用单引号括起来,典型类别名如:STACK、CODE和DATA等。若缺省类别名,则表明该段类别为空。同名同类别的段在内存中依序连续存放。,2.段寄存器说明伪指令格式:ASSUME段寄存器:段名,段寄存器:段名,(1)设定特定的Sreg指向特点的段,说明源程序中定义的段应由哪一个Sreg去寻址。否则,汇编程序无法生成机器代码程序。(2)ASSUME并未真正的将段地址装入相应的Sreg。Sreg的初值还必须由用户在程序的开始处用MOV指令来设置(CS除外)。,3.指定地址伪指令ORG在汇编程序中,有一个软件计数器(LC)地址计数器。在每个段定义开始处,它被复位为0。当汇编程序逐行扫描语句时,用LC保存当前指令的地址。格式1:ORG表达;将表达式的值(065535)LC格式2:ORG$+表达式;将LC的当前值$表达式的值LC功能:强行指定地址计数器LC的当前值,在段内改变它以后的代码或数据存放的偏移地址。,ORG语句之后段内所有的代码或数据均以表达式(常量)的值为起始偏移量连续存放,除非遇到另一个ORG语句。此语句本身并不占内存。,4.模块的定义和通信MASM宏汇编语言提供了模块化编程伪指令,用以实现模块的定义与通信。一个任务的源程序由若干模块组成,每个模块有代码段、数据段等,对应一个.ASM,是个独立的编译单位。当各个模块编译完毕,可用LINK连接各模块形成一个完整的可执行程序(.exe)。,1).模块定义伪指令NAME/ENDNAME模块名;为模块命名;语句END标号;结束模块模块名的作用是指示给连接程序进行连接用。源程序中可无模块定义,此时源文件名作为模块名。主模块的END后要跟标号,子模块不跟标号。部分可省略。,2).模块间通信伪指令实现模块间数据或过程的互访和共享。格式:PUBLIC名字,名字,EXTRN名字:类型,名字:类型,,PUBLIC和EXTRN配对使用。由PUBLIC说明的名字是全局的,可以在其他模块中使用,EXTRN表明本模块中使用的名字在别的模块中定义过,且类型一致。,其中,名字可以是标号、变量名、过程名或由EQU(或)伪指令定义的符号名。,类型可以是BYTE、WORD、DWORD、NEAR、FAR和ABS(常量属性)等。,格式:过程名PROCNEAR/FARRET过程名ENDP,4.2.4过程和宏定义伪指令过程和宏是模块化程序设计的基础。汇编语言中常用定义过程和宏的方法来实现按模块管理程序代码的功能。,1.过程定义伪指令过程:一段可以由CALL指令调用,用RET返回的程序。当整个源程序由主、子程序构成时,主、子程序都在代码段,且都可用过程来表示(即定义为过程)。,功能:定义一个过程,并指出过程名及过程的属性。过程定义由伪指令PROC开始、ENDP结束。PROC和ENDP之间为过程的指令序列。程序中可以定义多个过程。程序经汇编、连接及装入内存后,过程名为一具体的内存地址,指示子程序入口。,过程的属性有NEAR和FARNEAR过程只能被定义该过程的段中的其他程序调用(段内调用)FAR过程可由任何段中的程序调用(段间调用)缺省时为NEAR根据过程的属性,汇编程序自动对CALL、RET翻译成段内(段间)调用及段内(段间)返回的目标代码。,COD1SEGMENTASSUMECS:COD1,;代码段中的其它语句(主程序)SUB1PROCFAR;名为SUB1的FAR过程开始RET;返回SUB1ENDP;SUB1结束SUB2PROC;名为SUB2的NEAR过程开始RET;返回SUB2ENDP;SUB2结束;可能定义的其它过程COD1ENDS;代码段结束,例,(1)宏定义格式:宏指令名MACRO形参,形参:;指令序列ENDM,宏扩展:汇编时,将相应的程序段中的每条语句前冠以“”,代替宏指令以产生目标代码。,宏调用在源程序中用宏指令代替所定义的程序段。格式:宏指令名实参,实参,2.宏定义伪指令为减少重复编写相同语句段的工作,我们可以使用“宏”功能。宏定义是指用一个标识符(宏名)来代替一组指令序列(可同时包含指令性语句和指示性语句)宏功能的使用过程是:宏定义、宏调用、宏展开。,【例】完成2个压缩BCD数加法的宏定义,DECADDMACROOP1,OP2MOVAL,OP1ADDAL,OP2DAAMOVOPR1,ALENDM,DECADDDL,BUFFERDECADDAREA1,AREA2,宏调用,宏定义,加号表示该语句由宏展开得到。,DECADDDL,BUFFER扩展成:+MOVAL,DL+ADDAL,BUFFER+DAA+MOVDL,AL,注:当宏调用中实参数个数和形式参数个数不等时,若实参数个数大于形式参数个数,在替换时多余的实参数不予考虑。若实参数个数小于形式参数个数,则多余的形式参数作为空(字符)或零(数字)处理。,宏展开,3.过程与宏的区别对需重复使用的模块既可定义为过程,也可定义为宏。(1)宏:由汇编程序识别,并将宏体代码插入。过程:汇编时仅产生CALL指令代码,该代码在程序执行时完成。(2)宏可以直接传递参数。但过程传递参数的编程困难。(3)汇编成机器代码时:宏扩展增加空间开销。过程调用却能缩短源程序目标代码的长度,无论过程被调用多少次,仅增加CALL、RET代码。(4)宏体执行时并不增加时间开销。过程调用时,CALL、RET指令需保护、恢复现场和断点,增加时间开销。,4.2.5结束语句,END伪指令:格式END启动地址作用:指示源程序到此结束。(汇编程序对END之后的语句不进行处理。源程序中必须有END结束语句。启动地址可是一个标号或过程名,指示程序的入口。程序装入内存后,系统跳转到入口处,开始执行程序。,常用:数值常量2(B)、10(D)、8(Q)、16(H)的整型常量。对16:必须以数字打头,若最高位为字母AF,必须加前缀0,以与H结尾的标识符区别(如:AH,abcdH)。字符串常量1234是用单引号括起来的一个或多个字符,值为字符的ASCII码值。例:A=41HAB=4142H123431H,32H,33H,34H31323334HMOVAL,G,2.Reg操作数操作数部分是寄存器名,如:AX、SI和DS等。,4.38086汇编中的运算符,1.常量操作数在运行期间不变化的量:立即数、端口地址。,(3)标号和变量都与存储器地址相关联,都具有以下三种属性:段属性(SEGMENT)段基址,标号或变量所在段的段地址。偏移量属性(OFFSET)段内偏移地址,标号或变量所在地址与所在段的段起始地址之差。类型属性(TYPE)对变量,指变量存取单位的字节数大小。有字节(BYTE)、字(WORD)、双字(DWORD)、4字、10字节5种。对标号,指标号与使用它的指令之间的距离远近。(如:对转移指令来说,有NEAR标号或FAR标号),3.存贮器操作数有标号与变量两种(1)标号:在代码段内与指令地址相关联。(或某个过程起点位置相关联)(2)变量:在数据段或堆栈段内是存放数据的存贮单元的符号地址,与各种存储器操作数寻址方式有关。常以变量名的形式出现在程序中。,4.表达式操作数表达式由各种操作数、运算符和操作符组成,可出现于源程序的任何地方,在汇编时计算(而不是在程序执行过程中).汇编程序对表达式进行运算后,得到一个确定的数值,再把这个数值汇编到指令中。,(1)有两类表达式根据表达式所表示的内容而分。数值表达式:由常量及算术逻辑运算符、或关系运算符连接而成。在汇编时产生一个数值。地址表达式:由常量、变量、标号、寄存器的内容及一些运算符组成。其值表示存储器地址,有以上三种属性。,例:MOVAX,12-4;MOVAX,8;数字表达式LEABX,string+4;地址表达式ES:SI+4;地址表达式,(2)运算符和操作符MASM宏汇编中有三种运算符:算术、逻辑和关系运算符两种操作符:分析和合成操作符运算符:实现对操作数的相关运算。操作符:完成对操作数属性的定义、调用和修改。,主要有:1.算术运算符(+、/、MOD)2.逻辑运算符(AND、OR、NOT、XOR)3.关系运算符(EQ、NE、GT、GE、LT、LE)真:FFFFH;假:04.分析操作符(SEG、OFFSET、TYPE、SIZE、LENGTH、HIGH、LOW)5.合成操作符(PTR、DS:、THIS、SHORT),数值表达式中可使用所有算术运算符地址表达式仅使用+、两种算术运算符常用:标号或变量常量形式运算后仍为标号或变量,其3个属性中的类型及段基址属性不变,仅修改了偏移量属性。例:PLACE23;若PLACE与某存贮单元地址相关,则PLACE+23仍与某存贮单元相关。,算术运算符不影响标志位例:完成80H+90H解:MOVAL,80H+90H;使用数值表达式;(AL)=10H、CF=不变MOVAL,80H;使用加法指令ADDAL,90H;(AL)=10H、CF=1,算术运算符(+、/、MOD(取余数)MOVAX,68MOVAX,48,作为运算符时,是在程序汇编时由汇编程序计算的,计算结果充当指令的某一个操作数或构成操作数的部分,作为指令助记符时,是在程序运行时被执行,操作对象可以是寄存器或存储器操作数。,注:逻辑运算符与逻辑指令助记符形同意不同,逻辑运算符AND、OR、XOR和NOT实现操作数按位逻辑操作,只适用于数值表达式。MOVAX,80hOR70hMOVAX,0F0h,关系运算符EQ、NE、LT、GT、LE和GE。在两个无符号操作数之间进行大小关系比较两个操作数必须同是数值或同是一个段内的两个存储器地址。关系不成立(为假)则结果为“0”(假:0);若关系成立(为真)则结果为全“1”(真:FFFFH)。结果值在汇编时获得。例:MOVBX,PORTLT5汇编为:MOVBX,0FFFFH(条件成立)或MOVBX,0000H(条件不成立),分析操作符与合成操作符分析操作符(数值返回运算符)运算对象是存储器操作数,它返回变量或标号的属性值。合成操作符(修改属性运算符)作用于存储器操作数时可以改变它们的属性。用分析或合成操作符,可以返回或修改存储器操作数的3种属性.,例:ARRAYDB100DUP(0)MOVAX,SEGARRAYMOVDS,AX;对DS初始化MOVBX,OFFSETARRAYMOVAL,BX,(1)分析操作符(SEG、OFFSET、TYPE、SIZE、LENGTH)使用格式:操作符标号或变量SEG、OFFSET返回标号或变量的段地址和偏移地址,TYPELENGTHSIZETYPE返回存储器操作数(标号或变量)的类型值。LENGTH返回变量用DUP定义的重复次数。SIZE返回TYPE和LENGTH的乘积,表示为变量所分配的字节存储单元总数。,例:BUFFER1DB100DUP(0)BUFFER2DW200DUP(20H)BUFFER3DD100DUP(13)则LENGTHBUFFER1=100LENGTHBUFFER2=200LENGTHBUFFER3=100,注:用LENGTH返回的存储区必须用DUP来定义,否则返回1。,使用格式:类型PTR标号或变量,例:ARRAY1DB0,1,2,3,4ARRAY2DW0,1,2,3,4MOVBX,WORDPTRARRAY13MOVCL,BYTEPTRARRAY26MOVWORDPTRSI,4,配合EQU伪指令,还可以为原变量定义新的变量名,如:ARRAY1DB0,1,2,3,4ARRAY2DW0,1,2,3,4WBYTEEQUWORDPTRARRAY1BWORDEQUBYTEPTRARRAT2MOVBX,WBYTE3MOVCL,BWORD6,例:ABCDW?A1EQUBYTEPTRABC;A1是ABC的第一个字节A2EQUBYTEPTRABC1或A2EQUA11MOVAL,A1MOVAH,A2,例,可以如下处置:MOVAX,WORDPTROPER1+1;AX=3402HMOVAL,BYTEPTROPER2;AL=34HMOVAL,BYTEPTROPER2+1;AL=12H,THIS与EQU配合使用,具有LABLE的同样作用。使用格式:标号或变量名EQUTHIS类型例:BWORDEQUTHISBYTE;定义字节ARRAYDW100DUP(?);定义字将原定义的字缓冲区ARRAY按字节区BWORD使用。,LABLE为当前存储单元定义一个指定类型的标号或变量。常用于定义一个数据块或标号,使它们具有多重名字和属性。使用格式:标号或变量名LABLE类型,例:WBYTELABLEWORD;为变量WBYTE定义;一个字类型的数据区ARRAYDB1,2,3,4MOVAL,ARRAY;01HALMOVAX,WBYTE;0201HAXWBYTE、ARRAY指向同一个数据区,但有不同的类型属性。,DATASEGMENT;定义数据段D1DB5DUP(?);连续的字节单元CCEQU$D1;对单元计数SUMDW0;为结果保留一个字DATAENDS;数据段定义结束STACKSEGMENTPARASTACKSTACK;定义堆栈段DB100DUP(?);100字节的栈空间STACKENDS;堆栈段定义结束CODESEGMENT;定义代码段ASSUMEDS:DATA,SS:STACK,CS:CODE;对各段进行说明BEGIN:MOVAX,DATA;DS初始化为DATAMOVDS,AXLEASI,D1;预置源数据的指针,例多个连续字节单元的累加,MOVCX,CC;预置次数LODSBYTEPTRSI;取一个数并修改指针MOVAH,0;清AX的高字节CLC;清CF位AGAN:ADCSUM,AX;累加LODSBYTEPTRSI;再取数并修改指针LOOPAGAN;控制循环MOVAH,4CH;完成,返回DOSINT21HCODEENDS;代码段结束ENDBEGIN;整个程序结束,4.4汇编语言程序设计,介绍汇编语言程序设计的常用结构与方法,与大多数高级语言相同的是:汇编语言是结构化的语言。一个大的汇编源程序可由多个“模块”组成,而每个模块则由一个或多个“段”构成。与高级语言不同,使用汇编语言编程时需同时使用指令和伪指令。,汇编源程序的基本结构形式模块和段一个汇编“模块”可以包含一个或几个长度小于64KB的“段”8086只有4个段寄存器(CS、DS、SS和ES)CS:程序段DS:数据段SS:堆栈段ES:附加段(可选),特点程序分段语句由指令性和指示性语句组成两种程序框架,框架一:DATASEGMENT;定义数据段VAL1DB12H,8EH;定义变量DATAENDS;数据段结束CODESEGMENT;定义代码段ASSUMEDS:DATA,CS:CODE;段属性说明START:MOVAX,DATA;初始化DSMOVDS,AX;填写代码MOVAX,4C00H;返回DOSINT21HCODEENDS;代码段结束ENDSTART;源程序结束,框架二:DATASEGMENT;定义数据段VAL1DB12H,8EH;定义变量DATAENDS;数据段结束CODESEGMENT;定义代码段MAINPROCFARASSUMEDS:DATA,CS:CODE;段属性说明START:PUSHDSMOVAX,0PUSHAXMOVAX,DATAMOVDS,AX;填写代码RETMAINENDPCODEENDS;代码段结束ENDSTART;源程序结束,4.4.1汇编语言程序设计基本步骤,1分析问题并抽象出数学模型。2确定最佳算法。3画出程序结构框图和流程图。4合理分配内存工作单元和寄存器,并了解I/O接口地址。5编程并调试。(有时需要用注释行说明程序,便于阅读和修改。),评价程序质量的标准1合理组织数据,发挥存贮器、Reg的作用。2程序逻辑结构好,便于二次开发。3可读性强。4高可靠性和可维护性。5效率高(代码少)。,4.4.2程序的基本结构,一、顺序结构对应简单程序,顺序执行,无转移、无循环。指令指针IP值线性增加。二、分支结构依据不同条件分支到各程序段,有双分支和多分支两种。IP值受标志位的影响而跳变。,三种基本结构奠定了实现任何复杂程序的基础。,三、循环结构实现那些需要重复做的工作。IP值因计数器CX中的值不为零而循环。,循环结构,1、顺序结构程序设计按事件发展的先后,选择合适的指令有序地加以组合。DATASEGMENTBLOCKDW0ABCDHBUFFDD?DATDENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVDX,BLOCKMOVAX,DXANDAX,0F0FHANDDX,0F0F0HMOVCL,4SHRDX,CLLEABX,BUFMOVBX+0,ALMOVBX+1,DLMOVBX+2,AHMOVBX+3,DHMOVAX,4C00HINT21HCODEENDSENDSTART,例:编程计算表达式Z=X2Y/5的值,其中X、Y为带符号字节整数,Z为带符号字整数。,PUSHDSSUBAX,AXPUSHAXMOVAX,DATMOVDS,AX,MOVAL,XIMULALMOVBX,AX,MOVAL,YCBWMOVCL,5IDIVCLCBW,SUBBX,AXMOVZ,BX,RET,例:将某段中的字符串“Hello!”传送到另一段中(内存数据块的传送)。,利用变量定义字符串和缓冲区,思考题:压缩BCD码分解为非压缩BCD码。,aaSEGMENT;数据段1xxDBHello!;定义源串aaENDSbbSEGMENT;数据段2yyDB6dup(?);定义目的缓冲区bbENDSccSEGMENT;代码段ASSUMECS:cc,DS:aa,ES:bb;指示指令中标号、变量所在段start:CLD;设置传送方向MOVAX,aa;DS:SI源串首地址MOVDS,AXLEASI,xxMOVAX,SEGyy;ES:DI目的首地址MOVES,AXMOVDI,OFFSETyyMOVCX,6;CX串的长度REPMOVSB;串传送MOVAH,4CH;调用4CH系统功能,返回DOSINT21HccENDSENDstart;指示程序结束和程序入口,2、分支结构程序设计,设计分支程序的关键:如何判断分支的条件如何实现分支结构,1.利用比较和转移指令实现分支方法:在需要分支的地方用比较指令CMP、串比较指令CMPS或串搜索指令SCAS等,进行分支条件的比较判断,再利用各种条件转移指令实现分支。,例1:编程实现下列函数的功能,其中X、Y为无符号字节数。,流程图,(AL)=(BL)?,PUSHDSSUBAX,AXPUSHAXMOVAX,DATMOVDS,AX,CMPAL,BLJEC1JAC2,EXT:MOVZ,ALRET,MOVAL,XMOVBL,Y,C1:MOVAL,0JMPEXT,C2:MOVAL,1JMPEXT,MOVAL,-1,2.利用跳转表实现分支多用于多路分支,根据表内地址分支将需要分支的各子程序入口地址按照一定的顺序存放在内存区域中,在主程序中根据一定的算法计算出某子程序地址在跳转表中的位置,从而得到相应子程序的入口地址,然后用JMP指令转去执行。,若是段内分支,每个地址在表内占2个单元(IP的值),若是段间分支,每个地址占4个单元(CS:IP的值)。,例:设有8种产品的产品编号分别为0、1、2、7,各产品的加工子程序名分别为SBR0,SBR1,SBR7。试编写由已知编号转至相应加工子程序处理的程序。子程序入口地址的地址=表基地址(BASE)+偏移量(产品编号)2,JMPBASE产品编号2;EA=BASE+产品编号2;EA=各子程序入口地址,DATASEGMENTBASEDWSBR0,SBR1,SBR2,SBR3,SBR4,DWSBR5,SBR6,SBR7;定义跳转表BNDB?;BN中存放某一产品编号DATAENDSSTACKSEGMENTPARASTACKSTACKDB100DUP(0)STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATASTARTPROCFARPUSHDSMOVAX,0PUSHAX,3、循环结构程序设计,循环程序是在满足某些条件时对一段程序的重复执行,一般由四部分组成。,基本结构形式(1)先执行后判断(dowhile)至少进入一次循环体。常用于循环次数已知时。,(2)先判断后执行循环体可一次都不执行。常用于循环次数未知,根据具体情况找出控制循环体结束的条件时常用。,(1)先执行后判断(dowhile),DATASEGMENTBUFDB-1,-3,5,6,9,;定义若干字节带符号数CUNTEQU$BUF;计算数据块长度RESULTDW?;定义存放结果单元DATAENDS对应的代码段程序:MOVBX,OFFSETBUF;建立数据指针MOVCX,CUNT;设置循环次数MOVDX,0;置结果初值LP1:MOVAL,BX;取数据ADDAL,0JNSPLUS;是正数,转去PLUSINCDX;是负数,负数个数1PLUS:INCBX;调整数据指针LOOPLP1;(CX1)0,继续循环MOVRESULT,DX;存入负数个数,例:2AX寄存器中有一个16位的二进制数,编程统计其中1的个数,结果存放在CX寄存器中。控制循环体的条件是:当AX内容为全0,不必再继续统计。,(2)先判断后执行循环体可一次都不执行。在循环次数未知,需根据具体情况找出控制循环体结束的条件时常用。,程序如下:MOVCX,0;置结果计数器初值LP:ANDAX,AX;AX=0否JZEXIT;是,退出循环SALAX,1;否,AX的最高位移至CF中JNCZERO;CF0,转ZERO继续循环INCCX;CF1,结果计数器加1ZERO:JMPLPEXIT:,方法二:每位和1“与”,不等0则为1。MOVCX,16MOVDX,0001HAA:TESTAX,DXJZLOP:;Di1LOP:SHRAX,1LOOPAA,方法三:LOP:TESTAX,0FFFFHJZSTOPJNSSHIFT;查SFINCCXSHIFT:SHLAX,1JMPLOPSTOP:HLT,3.循环控制方法每个循环程序必须选择一个循环控制条件,来控制循环的运行和结束。常用循环控制条件(方法):(1)计数控制循环次数已知,每循环一次加/减1。例1。(2)条件控制循环次数未知,须根据条件控制循环。例2。(3)状态控制根据事先设置或实时检测的状态来控制循环。,例3:在BLOCK内存区中有一串字符,试编程统计“%”之前的字符个数。DATASEGMENTBLOCKDBANDEPO%WRCOUNTEQU$-BLOCKMEMDB0DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVSI,OFFSETBLOCKMOVCX,COUNTLOOP1:MOVAL,SICMPAL,%JZDONEINCBYTEPTRMEMINCSILOOPLOOP1DONE:MOVAX,4C00HINT21HCODEENDSENDSTART,4、子程序设计,子程序不是一种基本的程序结构,但在程序设计时合理使用子程序是实现模块化程序设计的重要技巧。有两种子程序:重复使用的程序段或具有通用性便于共享的程序段(键盘处理、代码转换);中断处理子程序:中断处理随机产生,对其处理只能采用子程序的形式。,与子程序有关的术语(1)子程序嵌套:子程序中调用别的子程序称为嵌套只要堆栈空间允许,嵌套层次不限。(3)可重入子程序:能够被中断并可再次被中断程序调用的子程序。,子程序设计中的问题1.主程序与子程序的连接主、子程序都存放在代码段:,CALL:断点保护,转子程序。RET:断点恢复。,若主、子程序在同一代码段,为段内调用;若主、子程序各在不同的代码段,为段间调用。,NEAR子程序书写形式,CODESEGMENTASSUMEMAINPROCFARCALLSUB1RETSUB1PROCNEARCALLSUB2RETSUB2PROCNEARRETSUB2ENDPSUB1ENDPMAINENDPCODEENDS,FAR子程序书写形式,CODE1SEGMENTASSUMEMAINPROCFARCALLSUBRETMAINENDPCODE1ENDSCODE2SEGMENTASSUMESUBPROCFARRETSUBENDPCODE2ENDS,CALL指令-段内调用,直接寻址,间接寻址,CALLproc-name,CALLdisp16,IP入栈;IPIP+偏移量,例:CALLSUB1,寻址方式,格式,操作,注:段内调用,CS不变,CALLr16/m16,IP入栈;IP(r16)/(m16),例:CALLBXCALLWORDPTRBX,CALL指令-段间调用,直接寻址,间接寻址,CALLFARproc-name,CS入栈;IP入栈;CS过程的段地址;IP过程的偏移地址。,例:CALLSUB1,寻址方式,格式,操作,注:DWORDPTR表明内存操作数属性为双字,用于段间调用,CALLmem32,CS入栈;IP入栈;IP(EA+1,EA)CS(EA+3,EA+2),例:CALLDWORDPTRBX,远过程名,RET指令,段内:,RET,RETexp,IP出栈,IP出栈SPSP+exp,段间:,RET,RETexp,IP出栈CS出栈,IP出栈CS出栈SPSP+exp,返回类型,格式,操作,注:返回类型由调用类型定,2.现场的保护与恢复,方法一:PUSHBXPUSHCXCALLPROC-1POPCXPOPBX,常用第二种方法保护和恢复现场。对中断子程序必须用第二种方法。,“现场”,指转向子过程执行时主过程的状态,主要包括当时标志寄存器、段寄存器、通用寄存器及指令指针的内容。为保证主、子过程各自的数据信息和工作状态不会互相干扰,设计程序时应尽量使主、子过程有属于自己的工作空间。用成对的PUSH、POP指令保护主程序与子程序中都要用到的Reg及mem。,3.主、子程序之间的参数传递入、出口参数传给子程序的参数及从子程序出来的参数。参数传递通常有3种方法:(1)使用约定的寄存器传递(2)使用约定的存储单元(参数表、变量)传递(3)使用堆栈传递,子程序应用举例使用约定的寄存器传递参数。首先考虑如何编制一个子程序(确定算法);在主、子程序中使用相同的寄存器。,SUM1PROCNEARCMPCX,0JZEXITMOVAX,0;数组和通过AX回送到主程序AGAIN:ADDAL,SIADCAH,0INCSILOOPAGAINEXIT:RETSUM1ENDP,;子程序名:SUM1。程序功能:求字节数组和。;入口参数:SI=数组首址,CX=数组长度;出口参数:AX=数组和。使用寄存器:AX,CX,SI。,例:求数组ARRAY中所有元素之和并存于SUM单元中。,SUM1PROCNEARCMPCX,0JZEXITMOVAX,0;数组和通过AX寄存器回送到主程序AGAIN:ADDAL,SIADCAH,0INCSILOOPAGAINEXIT:RETSUM1ENDPCODEENDSENDSTART请注意子程序与主程序都放在同一个代码段!,4.6汇编语言程序设计与上机调试,分类:算术运算、逻辑处理、代码转换、表格的处理、串指令题、数据排序1.算术运算举例,4.6.1实用程序设计举例,【例4-4】P103,【例4-5】P104,DATASEGMENTX1DWXXXXH,XXXXHX2DWXXXXH,XXXXHX3DW0000H,0000HDATAENDSSTACKSEGMENTPARASTACKDW20HDUP(?)STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATAMAINPROCFARSTART:PUSHDSMOVAX,0PUSHAXMOVAX,DATAMOVDS,AX,CLCMOVCX,02HLEASI,X1LEADI,X2LEABX,X3E20:MOVAX,SIADCAX,DIMOVBX,AXADDSI,2
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 金融租赁行业业务模式创新与客户满意度提升报告
- 绿色建筑材料市场推广与政策支持下的绿色建筑市场消费升级趋势与策略报告
- 露营经济背景下户外露营装备行业政策环境分析报告
- 2025年食品饮料电商运营中的移动端营销效果评估报告
- 2025年产120万吨锂矿石高效选矿与综合利用项目可行性研究报告
- 2025租房合同协议范本
- 数字货币对证券市场流动性影响的实证研究2025报告
- 高一英语教研组教学工作方案
- 2025年中国恒速整经机行业市场发展前景及发展趋势与投资战略研究报告
- 化妆品彩妆促销方案模板
- 食品营养与健康(第三版)教学大纲教案
- 《2025年危险化学品企业安全生产执法检查重点事项指导目录》解读与培训
- 英语四级单词表4500
- 职业技术学院《农产品质量管理与认证》
- 2025年职工职业技能竞赛(管道工赛项)参考试指导题库(含答案)
- 名著《红岩》三年中考真题及典型模拟题训练(原卷版)
- 湖州市妇幼保健院消除艾滋病、梅毒和乙肝母婴传播工作应知应会及工作制度(医护篇)
- 电力行业安全生产法律法规及标准规范培训
- 特征值估计技术-洞察分析
- 唐山燕阳冷轧有限公司介绍企业发展分析报告模板
- Unit3 Weather B let's learn(说课稿)-2023-2024学年人教PEP版英语四年级下册
评论
0/150
提交评论