汇编语言程序设计第四章课件_第1页
汇编语言程序设计第四章课件_第2页
汇编语言程序设计第四章课件_第3页
汇编语言程序设计第四章课件_第4页
汇编语言程序设计第四章课件_第5页
已阅读5页,还剩75页未读 继续免费阅读

下载本文档

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

文档简介

第四章高级汇编语言的语法4.1.1汇编语言语句格式1、机器指令的形式[标号][指令前缀]助记符[操作数][;注释]例如:EXEC:REPMOVSDEST,SOURCE;(OPS)OPD第四章高级汇编语言的语法4.1.1汇编语言语句格式1构成汇编语言程序的语句主要包括两类:指令与伪指令。它们之间的区别:指令是程序运行期间由CPU执行的,汇编后由对应的机器代码所取代。伪指令是不可执行的。它只是源程序汇编期间由汇编器处理的命令,用来指示汇编器为数据分配内存空间,或者为汇编器提供源程序结束或段定义等。构成汇编语言程序的语句主要包括两类:指令与伪指令。它们之间的22、伪指令语句的形式

[名字]伪操作命令[参数,…参数][;注释]伪操作命令包括:符号定义:EQU,=,LABEL;数据定义:DB,DW,DQ,DT,RECORD,ORG,SEGMENT,ASSUME,ORG模块定义:EXTERN,PUBLIC,NAME,END过程定义:PROC,ENDP2、伪指令语句的形式

[名字]伪操作命令[参数,…参数34.1.2数值表达式数值表达式是常量或运算符与常量的组合。表达式的值是在汇编阶段已经确定或得到的值。(1)整常量MOVEAX,0FA5CH(2)字符串常量MOVAX,’Aa’;AX=4161H(3)符号常量COUNT=60*60MOVECX,COUNT;COUNT=3600ECX4.1.2数值表达式数值表达式是常量或运算符与常量的组合。4算法运算符共7种:+,-,*,/,MOD,SHR,SHL对于语句:MOVAL,2可用下列语句替换:VALEQU5MOVAL,VALSHL1;VAL=5=00000101B逻辑右移1位为:00000010B=2注意:移位运算符只对常量移位。而移位指令SHR,SHL只出现在指令码中,对寄存器或内存操作数进行移位操作。

算法运算符共7种:+,-,*,/,MOD,SHR5实例:VAL=5SHRAL,VALSHL1;若VAL=5,等价于语句SHRAL,10实例:6逻辑运算符4种:AND,OR,XOR,NOT,分别对常量按位进行逻辑与,或,异或和非的运算。运算的结果也是一个已知的常量。注意与指令AND,OR,XOR,NOT的区别。上述指令放在操作码中,而操作符放在操作数中。例:PORTEQU29H; ANDDX,PORTAND0F0H;DX∧表达式的值(20H)→DX逻辑运算符4种:AND,OR,XOR,NOT,7关系运算符共6种:EQ(相等),NE(不等),LT(小于),GT(大于),LE(小于等于),GE(大于等于)对两个常量进行运算,结果是两特殊的常量值。如果关系成立(为真),结果为-1,即0FFFFH,如果关系不成立(为假),结果为0。例:PORTEQU3 MOVBX,((PORTLT5)AND18)OR((PORTGE5)AND69)语句被汇编成:MOVBX,18关系运算符共6种:EQ(相等),NE(不等),LT(小于84.1.3标号变量与地址表达式

标号:在代码段定义的指令的地址。三个属性值:段地址,EA,类型(FAR,NEAR)。变量:是内存中一个数据区的名字,作为指令的存储器操作数引用。三个属性值:段地址,EA,类型。类型由:DB,DW,DD,DQ,DT定义。如:countdw54.1.3标号变量与地址表达式

标号:在代码段定义的指令的9地址表达式地址表达式形成的结果是存储器的地址,用来表标指令中的标号或变量操作数,有3个属性:段地址,EA和类型。而数值表达式的结果只有大小没有属性。地址表达式可由变量、标号、常量、寄存器及一些运算符组成。地址表达式10例1:ARRAYDDD2,0,0,2,6,1,8,9,4,40MOVEAX,ARRAYD+36MOVESI,36SUBESI,4ADDEAX,ARRAYD[ESI]

例1:11例2ARRAYWDW1,2,3,4DW5,6,7,8DW9,10,11,12…MOVAX,ARRAYW[BX][SI]等价于:MOVAX,[ARRAYW+BX+SI]或者MOVAX,ARRAYW[BX+SI]

例2124.1.4特殊运算符

1、属性替换运算符用来取代一个操作数的属性。(1)强制类型运算符PTR如:MOVbyteptr[BX],5JMPFARPTRNEXTLAB[BX](2)段取代运算符:如:MOVDX,ES:[BX+DI]

4.1.4特殊运算符

1、属性替换运算符132.属性分离运算符功能:只是分离变量或标号的属性值,而不取代有关的属性。SEG:取段地址。OFFSET:取偏移地址。如:ARRAYWDW20DUP(0)……start:movax,segARRAYWmovds,axmovbx,offsetARRAYW

2.属性分离运算符14OFFSET与LEA指令的使用区别OFFSET是伪指令,在汇编阶段进行计算。所以OFFSET后面的地址表达式不能带寄存器,因为汇编阶段还不能计算出寄存器的值。如:MOVDX,OFFSETARRAYW[BX+SI];错误LEADX,ARRAYW[BX+SI]OFFSET与LEA指令的使用区别15TYPE运算符功能:取TYPE后面变量或标号的类型值。类型是字节、字、双字,则返回:1,2,4例如:MOVCL,TYPEARRAYW;ARRAYW为字类型,则返回2。TYPE运算符163、返回数值运算符(1)LENGTH取变量数据项个数。如果变量采用DUP定义,则LENGTH取DUP前面的重复系数。如果有多个DUP嵌套,仍取每一个DUP前面的系数.否则LENGTH取值为1.例如:ARRAYDW100dup(?)MOVCX,LENGTHARRAY;CX=100ARRAYDB10dup(1,20dup(20H))MOVCX,LENGTHARRAY;CX=10

3、返回数值运算符17(2)SIZE取变量数据的字节数.用来取变量定义中,有dup项时的字节数.

设变量Y,则SIZEY=LENGTHY×TYPEY例如:YDW100DUP(0)TYPEY=2,LENGTHY=100则SIZEY=2*100=200(2)SIZE18(3)动态求数据项个数的方法对于:STRINGDB“macroassemble”movcx,sizestring;cx=1*1=1所以size在一些场合并不适用.可以考虑动态求取.例如:stringdb‘advancedassembly’countsequ$-string;counts=16varwdw9,8,7,6,5,4,3,2,1,0countwequ($-varw);countw=(10*2/2)=10bufferdb10dup(2dup(8),’A’)countLequ$-buffer;countL=(10*(2+1))=30$符号表示:该条包含有’$’语句之后下一个可用的偏移值。(3)动态求数据项个数的方法19(4)字节分离运算符HIGH,LOW功能:从一个字数值或符号常量中得到高字节或低字节。如:WVAREQU0CA19Hmovah,HIGHWVARmoval,LOWWVAR(4)字节分离运算符HIGH,LOW20表达式运算符的优先级

从高到低排列:LENGTH,SIZE,WIDTH*,MASK*,以及(),[],<>中的项目。.(结构引用操作符);:(段取代运算符)PTR,OFFSET,SEG,TYPE,THIS;HIGH,LOW*,/,MOD,SHL,SHR;+,-EQ,NE,LT,LE,GT,GENOT;AND;OR,XOR;SHORT表达式运算符的优先级

从高到低排列:214.2汇编伪指令语句

方式伪指令包括:.8086,.386,.386P等,用来指定CPU的类型.例如:.386codesegment…codeends.8086codesegment…注意:默认是8086方式。4.2汇编伪指令语句

方式伪指令22数据与符号定义伪指令

1.定义符号伪指令包括EQU,=,LABEL,它们只用来定义名字,不分配存储空间.格式:名字EQU表达式名字=表达式注意(1)EQU的表达式可以是常量,变量名,标号,指令助记符,寄存器名;而=的表达式只能是数字表达式,主要用来定义符号常量.(2)同一个源程序,EQU符号名不能重复定义,=则可以.(3)同一个源程序中同一符号名,不能同时用EQU和=语句定义.数据与符号定义伪指令

1.定义符号伪指令23例如:

NUMBEREQU60;NUMBER=60TIMESEQUNUMBER*24;TIMES=60*24=1440BYTESDB10dup(?)WORDFEQUWORDPTRBYTES;定义新名字,新类型COUNTEQUCX;COUNT为CX寄存器的同义名字DECCOUNT;相当于CX=CX-1VALUE=88VALUE=VALUE+1;VALUE=89MOVCL,VALUE;CL=89COUNT=VALUE+1;COUNT的值=90

例如:24(2)定义名字语句的LABEL格式格式:名字LABEL类型类型包括:byte,word,dword,near,far等功能:它可以把同一数据区的内容既看作字节,也可以作为字或双字等类型参与运算,以适应按不同类型的存取操作.如:BARRAYLABELBYTEWARRAYDW50dup(0)MOVAX,WARRAY[48];取数组的第25个元素到AX.MOVAL,BARRAY[49];取数组的第50个字节值到AL.

最后一条语句也可以用:MOVAL,BYTEPTRWARRAY[49]代替.

(2)定义名字语句的LABEL格式25LABEL还可以定义指向同一条指令NEAR和FAR类型的标号.由其它程序段来调用FAR标号,在同一段内调用NEAR标号.如:FARSUBLABELFARNEARSUB:MOVEBX,ECX……JZNEARSUB在另一个程序段可用:JMPFARSUB来执行MOVEBX,ECXLABEL还可以定义指向同一条指令NEAR和FAR类型的标号262.程序模块名与结束语句

(1)模块命名语句

格式:NAME[模块名]模块语句可以在程序中不写出.(2)源程序模块结束语句END格式:END[表达式]源程序模块的最后一条语句.如果有表达式的值,则为程序开始执行目标代码的地址。程序汇编后,指令指针IP或EIP指向这个入口地址。如:NAMEPentium_MASM61xcodessegmentstart:……codesendsendstart注意:模块是独立的汇编单元,汇编程序只处理到END为止。后面的语句被忽略。

2.程序模块名与结束语句273.数据定义及存储分配语句指令:DB(字节),DW(字),DD(双字),DF(长字),DQ(4字),DT(10字)格式:[变量名]DB初值表达式1,初值表达式2……表达式可以是下列的形式:(1)数值表达式(2)?定义的数据项无法确定初值,即只分配存储存储单元。(3)ASCII字符串多于两个字符的字符串可用DB定义(4)nDUP(?)重复运算符dup用来重复定义n个数据项,内容是未确定的。(5)nDUP(表达式,表达式…)(6)nDUP(mDUP(表达式1),表达式2)多层嵌套DUP项,共有n*(m+1)项,初值由表达式确定。3.数据定义及存储分配语句28例4.1定义单项变量(1)定义单项变量VARNDB88VARMDB60*60STRCDW‘AB’MAXNDD-2147483468STRSDD‘AB’;STRS的逻辑值00004142H,物理存储为42410000HQVARDQ?TVARDT1024D;为变量TVAR分配10个字节,初值为整数,即:00000000000000000400H=1024例4.1定义单项变量29例4.2定义字符串变量STR1DB‘A’,‘B’,‘C’,’D’STR2DB‘ABCDE’ERRORDB‘syndaxerror!’,13,10例4.4定义数组或缓冲区变量BUFDB98dup(?)TABBDB2DUP(3DUP(8),’A’)ARRADW26DUP(41H)例4.2定义字符串变量304.2.3段定义与段管理伪指令

指令包括:SEGMENT,ENDS,ASSUME,GROUP,ORG等。段完整定义格式:段名SEGMENT[使用类型][边界类型][连接类型][‘类别’]……段名ENDS其中,两处段名是相同的。SEGMENT表示段的开始,ENDS表示段的结束。[]表示可选项。4.2.3段定义与段管理伪指令

指令包括:SEGMENT31(1)使用类型只有使用了.386,这个选项才作用。选项值:use16表示该段按16位寻址,与8086方式一样。use32表示该段按32位寻址,地址指针48位,段地址16位,偏移地址32位。注意:在定义段时,如果用了.386等伪指令后,默认使用use32(1)使用类型32(2)边界类型作用:指令段起始地址的类型。参数值:无即省略边界,指系统默认值:节类型PARAPARA段地址是16的倍数,最后4位是0000BYTE段地址从任意地址开始(字节地址)WORD段地址是2的倍数,即偶地址,最低位为0DWORD段地址是4的倍数,最低两位为0PAGE段地址是256的倍数,最低8位都为0(2)边界类型33(3)连接类型作用:告诉LINK程序,本段与其它段的相互关系。参数值:无省略连接符,表示本段有自己的段地址,与其它同名段无联系(独立段)。PUBLIC同名同类型连接,LINK程序将本段与其它具有该类型且段名相同(可包括不同模块)的段连接在一起,组成一个物理段。具有一个段地址。STACK指定堆栈段。LINK程序连接后的段为堆栈段,与PUBLIC处理相同。如果定义堆栈段没有说明STACK类型,LINK程序将发出警告”nostack”此外,还有COMMON,MEMORY,AT表达式的形式。(3)连接类型34例4.7同名段的连接。程序段1DATASSEGMENTPUBLICVAR1DB5DATASENDSCODESSEGMENT…CODESENDS程序段2DATASSEGMENTPUBLICVAR2DB8DATASENDSCODESSEGMENT…CODESENDS汇编后,将生成一个段码段和数据段。数据依序存放。例4.7同名段的连接。程序段2汇编后,将生成一个段码段和数35(4)类别类别是任何合法的名字。连接时,LINK程序将类别相同的段依次放在内存中。(4)类别362.置汇编单元计数器语句ORG

格式:ORG表达式ORG$+表达式表达式的值必须为常量。$表示当前地址。ORG的功能指定该语句后面的程序或数据存放的起始地址。例:ORG400HDATADB20H,30H;DATA的地址为400H2.置汇编单元计数器语句ORG

格式:ORG表达式37例4.10.386DATAS_SEGSEGMENTuse32dwordpublic‘data’……ORGAREAdb?ORG$+100HVARdb128dup(99)DATAS_SEGENDS

CODE_SEGSEGMENTuse32dwordpublic‘code’…….CODE_SEGENDS

例4.10383.指示段寄存器语句ASSUME格式1:ASSUME段寄存器:段名/组名,[,段寄存器:段名/组名]……格式2:ASSUME段寄存器:NOTHING格式3:ASSUMENOTHING后两种方式取消段寄存器与段或组的联系。例4.1codesegmentuse16parapublic‘code’assumecs:codes,ds:datas,es:datas,ss:stackstart:movax,datasmovds,axmoves,ax…….

ASSUMEES:NOTHING;取消ES段寄存器寻址,再用ES就出错了。codeends3.指示段寄存器语句ASSUME394.段组语句GROUP功能:GROUP语句可以把模块中几个不同段合成一个组,并赋于一个组名,使它们都装在同一个物理段(64K)中。格式为:组名GROUP段名[,……]连接时,如果超出64KB,则出错。例:CGROUPGROUPDATA1,DATA2ASSUMEDS:CGROUP,CS:CODESDATA1SEGMENTWORDPUBLIC‘DATA1’VAR1DW10DUP(?)……START:MOVAX,CGROUPMOVDS,AXMOVBX,OFFSETCGROUP:VAR1

4.段组语句GROUP40第四章高级汇编语言的语法4.1.1汇编语言语句格式1、机器指令的形式[标号][指令前缀]助记符[操作数][;注释]例如:EXEC:REPMOVSDEST,SOURCE;(OPS)OPD第四章高级汇编语言的语法4.1.1汇编语言语句格式41构成汇编语言程序的语句主要包括两类:指令与伪指令。它们之间的区别:指令是程序运行期间由CPU执行的,汇编后由对应的机器代码所取代。伪指令是不可执行的。它只是源程序汇编期间由汇编器处理的命令,用来指示汇编器为数据分配内存空间,或者为汇编器提供源程序结束或段定义等。构成汇编语言程序的语句主要包括两类:指令与伪指令。它们之间的422、伪指令语句的形式

[名字]伪操作命令[参数,…参数][;注释]伪操作命令包括:符号定义:EQU,=,LABEL;数据定义:DB,DW,DQ,DT,RECORD,ORG,SEGMENT,ASSUME,ORG模块定义:EXTERN,PUBLIC,NAME,END过程定义:PROC,ENDP2、伪指令语句的形式

[名字]伪操作命令[参数,…参数434.1.2数值表达式数值表达式是常量或运算符与常量的组合。表达式的值是在汇编阶段已经确定或得到的值。(1)整常量MOVEAX,0FA5CH(2)字符串常量MOVAX,’Aa’;AX=4161H(3)符号常量COUNT=60*60MOVECX,COUNT;COUNT=3600ECX4.1.2数值表达式数值表达式是常量或运算符与常量的组合。44算法运算符共7种:+,-,*,/,MOD,SHR,SHL对于语句:MOVAL,2可用下列语句替换:VALEQU5MOVAL,VALSHL1;VAL=5=00000101B逻辑右移1位为:00000010B=2注意:移位运算符只对常量移位。而移位指令SHR,SHL只出现在指令码中,对寄存器或内存操作数进行移位操作。

算法运算符共7种:+,-,*,/,MOD,SHR45实例:VAL=5SHRAL,VALSHL1;若VAL=5,等价于语句SHRAL,10实例:46逻辑运算符4种:AND,OR,XOR,NOT,分别对常量按位进行逻辑与,或,异或和非的运算。运算的结果也是一个已知的常量。注意与指令AND,OR,XOR,NOT的区别。上述指令放在操作码中,而操作符放在操作数中。例:PORTEQU29H; ANDDX,PORTAND0F0H;DX∧表达式的值(20H)→DX逻辑运算符4种:AND,OR,XOR,NOT,47关系运算符共6种:EQ(相等),NE(不等),LT(小于),GT(大于),LE(小于等于),GE(大于等于)对两个常量进行运算,结果是两特殊的常量值。如果关系成立(为真),结果为-1,即0FFFFH,如果关系不成立(为假),结果为0。例:PORTEQU3 MOVBX,((PORTLT5)AND18)OR((PORTGE5)AND69)语句被汇编成:MOVBX,18关系运算符共6种:EQ(相等),NE(不等),LT(小于484.1.3标号变量与地址表达式

标号:在代码段定义的指令的地址。三个属性值:段地址,EA,类型(FAR,NEAR)。变量:是内存中一个数据区的名字,作为指令的存储器操作数引用。三个属性值:段地址,EA,类型。类型由:DB,DW,DD,DQ,DT定义。如:countdw54.1.3标号变量与地址表达式

标号:在代码段定义的指令的49地址表达式地址表达式形成的结果是存储器的地址,用来表标指令中的标号或变量操作数,有3个属性:段地址,EA和类型。而数值表达式的结果只有大小没有属性。地址表达式可由变量、标号、常量、寄存器及一些运算符组成。地址表达式50例1:ARRAYDDD2,0,0,2,6,1,8,9,4,40MOVEAX,ARRAYD+36MOVESI,36SUBESI,4ADDEAX,ARRAYD[ESI]

例1:51例2ARRAYWDW1,2,3,4DW5,6,7,8DW9,10,11,12…MOVAX,ARRAYW[BX][SI]等价于:MOVAX,[ARRAYW+BX+SI]或者MOVAX,ARRAYW[BX+SI]

例2524.1.4特殊运算符

1、属性替换运算符用来取代一个操作数的属性。(1)强制类型运算符PTR如:MOVbyteptr[BX],5JMPFARPTRNEXTLAB[BX](2)段取代运算符:如:MOVDX,ES:[BX+DI]

4.1.4特殊运算符

1、属性替换运算符532.属性分离运算符功能:只是分离变量或标号的属性值,而不取代有关的属性。SEG:取段地址。OFFSET:取偏移地址。如:ARRAYWDW20DUP(0)……start:movax,segARRAYWmovds,axmovbx,offsetARRAYW

2.属性分离运算符54OFFSET与LEA指令的使用区别OFFSET是伪指令,在汇编阶段进行计算。所以OFFSET后面的地址表达式不能带寄存器,因为汇编阶段还不能计算出寄存器的值。如:MOVDX,OFFSETARRAYW[BX+SI];错误LEADX,ARRAYW[BX+SI]OFFSET与LEA指令的使用区别55TYPE运算符功能:取TYPE后面变量或标号的类型值。类型是字节、字、双字,则返回:1,2,4例如:MOVCL,TYPEARRAYW;ARRAYW为字类型,则返回2。TYPE运算符563、返回数值运算符(1)LENGTH取变量数据项个数。如果变量采用DUP定义,则LENGTH取DUP前面的重复系数。如果有多个DUP嵌套,仍取每一个DUP前面的系数.否则LENGTH取值为1.例如:ARRAYDW100dup(?)MOVCX,LENGTHARRAY;CX=100ARRAYDB10dup(1,20dup(20H))MOVCX,LENGTHARRAY;CX=10

3、返回数值运算符57(2)SIZE取变量数据的字节数.用来取变量定义中,有dup项时的字节数.

设变量Y,则SIZEY=LENGTHY×TYPEY例如:YDW100DUP(0)TYPEY=2,LENGTHY=100则SIZEY=2*100=200(2)SIZE58(3)动态求数据项个数的方法对于:STRINGDB“macroassemble”movcx,sizestring;cx=1*1=1所以size在一些场合并不适用.可以考虑动态求取.例如:stringdb‘advancedassembly’countsequ$-string;counts=16varwdw9,8,7,6,5,4,3,2,1,0countwequ($-varw);countw=(10*2/2)=10bufferdb10dup(2dup(8),’A’)countLequ$-buffer;countL=(10*(2+1))=30$符号表示:该条包含有’$’语句之后下一个可用的偏移值。(3)动态求数据项个数的方法59(4)字节分离运算符HIGH,LOW功能:从一个字数值或符号常量中得到高字节或低字节。如:WVAREQU0CA19Hmovah,HIGHWVARmoval,LOWWVAR(4)字节分离运算符HIGH,LOW60表达式运算符的优先级

从高到低排列:LENGTH,SIZE,WIDTH*,MASK*,以及(),[],<>中的项目。.(结构引用操作符);:(段取代运算符)PTR,OFFSET,SEG,TYPE,THIS;HIGH,LOW*,/,MOD,SHL,SHR;+,-EQ,NE,LT,LE,GT,GENOT;AND;OR,XOR;SHORT表达式运算符的优先级

从高到低排列:614.2汇编伪指令语句

方式伪指令包括:.8086,.386,.386P等,用来指定CPU的类型.例如:.386codesegment…codeends.8086codesegment…注意:默认是8086方式。4.2汇编伪指令语句

方式伪指令62数据与符号定义伪指令

1.定义符号伪指令包括EQU,=,LABEL,它们只用来定义名字,不分配存储空间.格式:名字EQU表达式名字=表达式注意(1)EQU的表达式可以是常量,变量名,标号,指令助记符,寄存器名;而=的表达式只能是数字表达式,主要用来定义符号常量.(2)同一个源程序,EQU符号名不能重复定义,=则可以.(3)同一个源程序中同一符号名,不能同时用EQU和=语句定义.数据与符号定义伪指令

1.定义符号伪指令63例如:

NUMBEREQU60;NUMBER=60TIMESEQUNUMBER*24;TIMES=60*24=1440BYTESDB10dup(?)WORDFEQUWORDPTRBYTES;定义新名字,新类型COUNTEQUCX;COUNT为CX寄存器的同义名字DECCOUNT;相当于CX=CX-1VALUE=88VALUE=VALUE+1;VALUE=89MOVCL,VALUE;CL=89COUNT=VALUE+1;COUNT的值=90

例如:64(2)定义名字语句的LABEL格式格式:名字LABEL类型类型包括:byte,word,dword,near,far等功能:它可以把同一数据区的内容既看作字节,也可以作为字或双字等类型参与运算,以适应按不同类型的存取操作.如:BARRAYLABELBYTEWARRAYDW50dup(0)MOVAX,WARRAY[48];取数组的第25个元素到AX.MOVAL,BARRAY[49];取数组的第50个字节值到AL.

最后一条语句也可以用:MOVAL,BYTEPTRWARRAY[49]代替.

(2)定义名字语句的LABEL格式65LABEL还可以定义指向同一条指令NEAR和FAR类型的标号.由其它程序段来调用FAR标号,在同一段内调用NEAR标号.如:FARSUBLABELFARNEARSUB:MOVEBX,ECX……JZNEARSUB在另一个程序段可用:JMPFARSUB来执行MOVEBX,ECXLABEL还可以定义指向同一条指令NEAR和FAR类型的标号662.程序模块名与结束语句

(1)模块命名语句

格式:NAME[模块名]模块语句可以在程序中不写出.(2)源程序模块结束语句END格式:END[表达式]源程序模块的最后一条语句.如果有表达式的值,则为程序开始执行目标代码的地址。程序汇编后,指令指针IP或EIP指向这个入口地址。如:NAMEPentium_MASM61xcodessegmentstart:……codesendsendstart注意:模块是独立的汇编单元,汇编程序只处理到END为止。后面的语句被忽略。

2.程序模块名与结束语句673.数据定义及存储分配语句指令:DB(字节),DW(字),DD(双字),DF(长字),DQ(4字),DT(10字)格式:[变量名]DB初值表达式1,初值表达式2……表达式可以是下列的形式:(1)数值表达式(2)?定义的数据项无法确定初值,即只分配存储存储单元。(3)ASCII字符串多于两个字符的字符串可用DB定义(4)nDUP(?)重复运算符dup用来重复定义n个数据项,内容是未确定的。(5)nDUP(表达式,表达式…)(6)nDUP(mDUP(表达式1),表达式2)多层嵌套DUP项,共有n*(m+1)项,初值由表达式确定。3.数据定义及存储分配语句68例4.1定义单项变量(1)定义单项变量VARNDB88VARMDB60*60STRCDW‘AB’MAXNDD-2147483468STRSDD‘AB’;STRS的逻辑值00004142H,物理存储为42410000HQVARDQ?TVARDT1024D;为变量TVAR分配10个字节,初值为整数,即:00000000000000000400H=1024例4.1定义单项变量69例4.2定义字符串变量STR1DB‘A’,‘B’,‘C’,’D’STR2DB‘ABCDE’ERRORDB‘syndaxerror!’,13,10例4.4定义数组或缓冲区变量BUFDB98dup(?)TABBDB2DUP(3DUP(8),’A’)ARRADW26DUP(41H)例4.2定义字符串变量704.2.3段定义与段管理伪指令

指令包括:SEGMENT,ENDS,ASSUME,GROUP,ORG等。段完整定义格式:段名SEGMENT[使用类型][边界类型][连接类型][‘类别’]……段名ENDS其中,两处段名是相同的。SEGMENT表示段的开始,ENDS表示段的结束。[]表示可选项。4.2.3段定义与段管理伪指令

指令包括:SEGMENT71(1)使用类型只有使用了.386,这个选项才作用。选项值:use16表示该段按16位寻址,与8086方式一样。use32表示该段按32位寻址,地址指针48位,段地址16位,偏移地址32位。注意:在定义段时,如果用了.386等伪指令后,默认使用use32(1)使用类型72(2)边界类型作用:指令段起始地址的类型。参数值:无即省略边界,指系统默认值:节类型PARAPARA段地址是16的倍数,最后4位是0000BYTE段地址从任意地址开始(字节地址)WORD段地址是2的倍数,即偶地址,最低位为0DWORD段地址是4的倍数,最低两位为0PAGE段地址是256的倍数,最低8位都为0(2)边界类型73(3)连接类型作用:告诉LINK程序,本段与其它段的相互关系。参数值:无省略连接符,表示本段有自己的段地址,与其它同名段无联系(独立段)。PUBLIC同名同类型连接,LINK程序将本段与其它具有该类型且段名相同(可包括不同模块)的段连接在一起,组成一个物理段。具有一个段地址。STACK指定堆栈段。LINK程序连接后的段为堆栈段,与PUBLIC处理相同。

温馨提示

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

评论

0/150

提交评论