您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 第04章.-80868088汇编语言程序设计
4.28086/8088汇编语言的基本语法DATASEGMENT;定义数据段,DATA为段名SUMDW0;由符号(叫变量名)SUM指定的内存单元类型定义为一个字,初值为0DATAENDS;定义数据段结束STACKSEGMENTSTACK;定义堆栈段,这是组合类型伪指令,它规定在伪指令后须跟STACK类型名DB200DUP(0);定义堆栈段为200个字节的连续存储区,且每个字节的值为0STACKENDS;定义堆栈段结束CODESEGMENT;定义代码段ASSUMEDS:DATA,SS:STACK,CS:CODE;由ASSUM伪指令定义各段寄存器的内容例:求从1开始连续50个奇数之和,并将结果存放在名字为SUM的字存储单元中。START:MOVAX,DATA;将DS初始化为数据段首址MOVDS,AX的段值DATAMOVCX,50;CX置入循环计数值MOVAX,0;清AX累加器MOVBX,1;BX置常量1NEXT:ADDAX,BX;累加奇数和,计50次INCBX;求下一个奇数INCBXDECCX;循环计数器作减1计数JNZNEXT;未计完50次时,转至NEXT循环MOVSUM,AX;累加和送存SUM单元MOVAH,4CH;DOS功能调用语句,机器将结束本INT21H程序的运行,并返回DOS状态CODEENDS;代码段结束ENDSTART;整个程序汇编结束4.2.28086/8088汇编语言语句4.2.2.1汇编语言语句的种类和格式1语句的种类在8086/8088汇编语言中,有3种基本语句:指令语句伪指令语句宏指令语句2语句的格式(1)指令语句的格式[标号:][前缀]指令助记符[操作数表][;注释]START:REPMOVSB;数据传送1)标号标号代表“:”后面的指令所在的存储地址(这里是逻辑地址),供JMP、CALL和LOOP等指令作操作数使用2)前缀8086/8088中有些特殊指令,它们常作为前缀同其他指令配合使用,例如和“串操作指令”(MOVS、CMPS、SCAS、LODS与STOS)连用的5条“重复指令”(REP、REPE/REPZ、REPNE/REPNZ),以及总线封锁指令LOOK等,都是前缀。3)指令助记符4)操作数表操作数表可以是一个或两个操作数;对宏指令来说,可能有多个操作数。操作数之间用逗号分隔。5)注释以“;”开始,用来简要说明该指令在程序中的作用(2)伪指令语句的格式[名字]伪指令[参数表][;注释]DATASEGMENTBBDB20HAADW20H,-30HDATAENDSAA2000D0FFBB204.2.2.2指令语句1)标号的属性标号表示指令地址,是指令的符号地址,它具有3种属性——段地址、段内偏移量(或相对地址)以及类型。2)在指令的助记符之前,使用标号并紧跟一个冒号“:”,表示该标号被定义为一个类型为NEAR的标号。当然,标号也可单列一行例如:subrout:movax,3000h3)使用过程定义,为过程取的名字也是一个标号RightPROCNEARRightENDP4)通常,“标号”只在循环、转移和调用指令中使用。1.标号1)常量是指那些在汇编过程中已经有确定数值的量2)常量分数值常量和符号常量两种3)符号常量的定义需用伪操作命令(伪指令)“EQU”或“=”4)数值常量加后缀字符H表示十六进制,O或Q表示八进制,B表示二进制,D表示十进制,十进制常省略后缀。例1:ONEEQU1DATA1=2*12HMOVAX,DATA1+ONE即把25H送AX。4、1常量与数值表达式P1315)一个能被计算并产生数值的表达式称为数值表达式算术运算7652H+2000H逻辑运算FFFFHAND1234H关系运算3LT56LT59652H1234HFFFFH0000H4、2变量与地址表达式变量一般都是在数据段或附加段中使用伪指令(即伪操作命令)DB、DW、DD和DT来进行定义[变量名]数据区定义伪指令表达式变量是内存中的一个数据区的名字,即数据所存放地址的符号地址,它可以作为指令中的存储器操作数来引用DATASEGMENTBBDB20HAADW20H,-30HCCDB3DUP(11H)DATAENDSAA2000D0FFBB20111111CCP133例题4.13,4.14DATASEGMENTBBDB20HAADW20H,-30HDATAENDSAA2000D0FFBB20MOVAL,BB;AL=?MOVBL,BYTEPTRAA;BL=?MOVCX,AA;CX=?MOVDX,AA+1;DX=?P133例题4.15数值表达式:在汇编时产生一数值,仅具有大小而无其他属性,可作为执行性指令中的立即操作数和数据区中的初值使用。地址表达式:它表示存储器地址,其值一般都是段内的偏移地址,因此它具有段属性、偏移值属性、类型属性。地址表达式主要用来表示执行性指令中的多种形式的操作数。地址表达式地址表达式由变量、标号、常量、寄存器BX,BP,SI,DI的内容(用寄存器名以及方括号表示)以及一些运算符组成。MOVAL,BBMOVDX,AA+1JMPSTARTMOVAX,[BX+5]地址表达式中可以使用的运算符及使用规则:A加法和减法运算符(+、-)变量或标号可以加上或减去某个结果为整数的数值表达式,其结果仍为变量或标号,类型及段地址属性不变,仅修改偏移值属性。b方括号及寄存器BX,BP,SI,DI如这几个寄存器不用方括号括起来,表示寄存器本身或操作数。例:MOVAX,SI表示将SI中的内容送AX中如这几个寄存器用方括号括起来,则表示地址表达式。例:MOVAX,[SI]表示将SI所指的存储单元中的字数据送AX中c、PTR运算符类型运算符,它用来说明某个变量、标号或地址表达式的类型属性,PTR格式为:数据类型PTR地址表达式数据类型可以是BYTE、WORD、DWORD、NEAR、FAR等。例:ADDBYTEPTR[DI],23HPRT指定地址表达式[DI]的类型为字节,此句表示将23H与内存字节单元[DI]中的字节数据相加,结果送回内存字节单元[DI]。例:INCBYTEPTRES:[BP+3]ES:为跨段前缀,冒号“:”前的ES段寄存器指明了操作数当前所在的段为附加数据段。这时,操作数的物理地址将由ES中的内容左移4位与偏移地址[BP+3]相加而求得。此句表示将附加数据段中偏移地址为[BP+3]的内存单元中的数据加1后仍保留在该单元中。如果没有跨段前缀“ES:”,那么,由[BP+3]地址表达式所表示的偏移地址将被系统默认为是在堆栈段中。(3)运算符综述IBM宏汇编中有5种运算符,即:算术运算符(Arithmeticoperators)逻辑运算符(Logicaloperators)关系运算符(Relationaloperators)分析运算符(Analyticoperators)合成运算符(Syntheticoperators)SEG;OFFSET;TYPE;SIZE;LENGTH;HIGH;LOW4.2.2.3伪指令语句1)DB(定义字节)用于申请一个数据项为字节的数据区2)DW(定义字)数据项为字,允许用地址表达式为数据项赋初值(即偏移量属性),变量类型是WORD。3)DD(定义双字)数据项为双字,允许用地址表达式为数据项赋初值(即段属性及偏移量属性),变量类型为DWORD。4)DQ(定义4字)数据项为4字,变量类型为QBYTE。5)DT(定义10字节)数据项为10个字节,变量类型为TBYTE。1、数据定义伪指令P137DSEGSEGMENTTABLEDW12DW34DATA1DB5TABLE2DW67DW89DW1011DATA2DB12RATESDW1314OTHRATDD1718DSEGENDS这段程序用DB、DW和DD定义了若干变量,根据上述对数据定义命令的约定,则各变量及其属性可列于表4.5中:所有变量的段属性(分量)均为DSEG。DW、DB、DD右边的表达式或数值即相应存储单元中的内容“DW变量”语句表示利用该变量的偏移量来初始化相应的存储字;“DD变量”语句表示利用该变量的段分量和偏移量来初始化相应的两个连续的存储字,低位字中是偏移量,高位字中是段分量。DB、DW、DD可用于初始化存储器。这些伪指令的右边有一表达式,表达式之值即该存储“单位”的初值。FOOSEGMENTAT55HZERODB0ONEDWONE;内容为0001HTWODDTWO;内容为00550003H;即高位字为55H,低位字为3FOURDWFOUR+5;内容为7+5=12SIXDWZERO_TWO;内容为0-3=-3ATEDB5*6;内容为30FOOENDSSTRING1DB′HELLO′STRING2DB′AB′STRING3DW′AB′2、符号定义伪指令P1401)为常量定义一个符号,以便在程序中使用符号来表示常量。格式:符号常量名EQU数值表达式2)给变量或标号定义新的类型属性并起一个新的名字。格式:变量名或标号名EQU[类型PTR]变量或标号BYTESDB4DUP(?)FIRSTWEQUWORDPTRBYTESFIRSTDWEQUDWORDPTRBYTESINCHS:MOVBYTES,AL3)可以给由地址表达式指出的任意存储单元定义一个名字。格式:符号名EQU地址表达式符号名可以是“变量”或“标号”,取决于地址表达式的类型。4)用来为汇编语言中的任何符号定义一个新的名字。格式:新的名字EQU原符号名5)使用EQU伪操作命令时,EQU左端的符号名不能是程序已定义过的符号名。3、段定义伪指令P142汇编源程序一般由若干段组成,以SEGMENT作为段的开始,以ENDS作为段的结束,这两者(伪指令)前面都要冠以相同的名字DATASEGMENTSUMDW0DATAENDSSTACKSEGMENTSTACKDB200DUP(0)STACKENDS代码段与堆栈段是不可少的,数据段与附加段可根据需要设置整个源程序必须以END语句来结束。END后面的标号START表示该程序执行时的起始地址4设定段寄存器伪指令ASSUMEASSUME段寄存器名:段名[,段寄存器名:段名[,...]]告诉汇编程序用SEGMENT伪操作定义过的段的段地址将要存放在哪个段寄存器中。CODESEGMENTASSUMEDS:DATA,SS:STACK,CS:CODE使用ASSUME伪指令,并不能为段寄存器设定初值,仅仅只是告诉汇编程序各段寄存器与内存中各段的关系。通常段地址值是操作系统根据需要装入,或者由用户自己装入DATASEGMENTTABDB10HDATAENDSCODESEGMENTASSUMEDS:DATA,SS:STACK,CS:CODESTART:MOVAX,DATAMOVDS,AX。。。。CODEENDSENDSTART编程模板ORG伪指令用来指出其后的程序段或数据块存放的起始地址的偏移量。其格式为:ORG表达式汇编程序把语句中表达式之值作为起始地址,连续存放程序和数据,直到出现一个新的ORG指令。若省略ORG,则从本段起始地址开始连续存放。5、ORG伪指令P144(1)过程定义伪指令格式:过程名PROC〔类型〕…;指令序列过程名ENDP(2)调用过程调用过程用“CALL过程名”来实现。(4)过程返回通常子程序中包括一至多条返回指令,即当过程运行至某种条件满足时返回至主程序中调用指令的下一条指令继续执行。P146例4.366、过程定义伪指令P144一、顺序结构程序例:对两个8字节无符号数求和,这两个数分别用变量D1及D2表示。将两数之和的最高位进位放在AL中,两数之和的其他位按从高到低顺序依次放在SI,BX,CX,DX中。4.38086/8088汇编语言程序设计基本方法DSEGMENTD1DB12H,34H,56H,78H,9AH,0ABH,0BCH,0CDHD2DB0CDH,0BCH,0ABH,9AH,78H,56H,34H,12HDENDSCSEGMENTASSUMECS:C,DS:D;说明代码段、数
本文标题:第04章.-80868088汇编语言程序设计
链接地址:https://www.777doc.com/doc-4998347 .html