汇编第4章-常用数据处理技术.ppt

上传人:wuy****n92 文档编号:73451952 上传时间:2023-02-19 格式:PPT 页数:185 大小:1.54MB
返回 下载 相关 举报
汇编第4章-常用数据处理技术.ppt_第1页
第1页 / 共185页
汇编第4章-常用数据处理技术.ppt_第2页
第2页 / 共185页
点击查看更多>>
资源描述

《汇编第4章-常用数据处理技术.ppt》由会员分享,可在线阅读,更多相关《汇编第4章-常用数据处理技术.ppt(185页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第四章第四章 v所谓常用处理技术,是指常用指令、所谓常用处理技术,是指常用指令、常用伪指令、变量定义和使用以及编程常用伪指令、变量定义和使用以及编程应用的技术。应用的技术。v这种编程应用主要是针对一些数值型这种编程应用主要是针对一些数值型数据的运算和非数值型数据的处理,而数据的运算和非数值型数据的处理,而这种处理常常是大量的、广泛的和带有这种处理常常是大量的、广泛的和带有技巧性的。技巧性的。v汇编语言程序的语句除指令语句外,汇编语言程序的语句除指令语句外,还有伪指令语句。还有伪指令语句。v伪指令语句又称为说明语句或指示性伪指令语句又称为说明语句或指示性语句。它不同于指令语句,它不是直接语句。它

2、不同于指令语句,它不是直接命令命令CPUCPU去执行某一操作,而是命令汇去执行某一操作,而是命令汇编程序应当如何生成目标代码编程序应当如何生成目标代码。v例如控制汇编以实现数据定义、存储例如控制汇编以实现数据定义、存储器分配、源程序开始和指示程序结束等器分配、源程序开始和指示程序结束等功能。功能。v伪指令无相应的目标代码,因此也称伪指令无相应的目标代码,因此也称为伪操作。伪指令,特别是数据定义为伪操作。伪指令,特别是数据定义伪指令,在源程序设计中是必不可少伪指令,在源程序设计中是必不可少的。的。v本章主要介绍变量、伪指令和常用数本章主要介绍变量、伪指令和常用数据处理程序。最后通过大量案例说明据

3、处理程序。最后通过大量案例说明其应用。其应用。4.14.1 变量变量4.2 4.2 常用伪指令常用伪指令4.3 4.3 常用数据处理指令常用数据处理指令4.4 4.4 字符串输入输出方法字符串输入输出方法习习 题题 4 4v1 1变量名变量名v变量的名字是它的外包装,是用来区变量的名字是它的外包装,是用来区分不同的存储区域的标识符号,是一分不同的存储区域的标识符号,是一种标识符。种标识符。4.1 4.1 变量变量4.1.1 4.1.1 变量定义变量定义v不同的语言对标识符命名的规定有所不同的语言对标识符命名的规定有所不同,但大体上都把不同,但大体上都把“以字母开头的以字母开头的字符数字串字符数

4、字串”作为基本规定,当然也作为基本规定,当然也可以用可以用“_”“_”或或“”“”开头开头 。v80868086的汇编语言还允许用下面的特殊的汇编语言还允许用下面的特殊符号作为标识符的构成符号:符号作为标识符的构成符号:?、$、%和和_ _。v标识符是一个或多个符号构成的符标识符是一个或多个符号构成的符号串,汇编语言对标识符命名的完号串,汇编语言对标识符命名的完整规定是:整规定是:v(1 1)可用符号包括字母、数字和特)可用符号包括字母、数字和特殊符号殊符号“?”“?”、“”“”、“$”“$”、“%”“%”、“_”“_”。v(2 2)不允许用数字作为第一个符号。)不允许用数字作为第一个符号。v

5、(3 3)名字的长度由)名字的长度由1 13131个字符组成,个字符组成,但一般不超过但一般不超过1010个符号。个符号。v(4 4)最少由一个符号构成,可以是字)最少由一个符号构成,可以是字母、母、“_”“_”或或“”“”。v(5 5)汇编语言不区分字母的大小写。)汇编语言不区分字母的大小写。v2.2.变量定义的方法变量定义的方法v变量的实质是存放数据的内存区域,变量的实质是存放数据的内存区域,所谓变量定义就是告诉汇编程序,在所谓变量定义就是告诉汇编程序,在翻译时从某个地址起预留一定数量的翻译时从某个地址起预留一定数量的内存空间,并在其中填上初值,还要内存空间,并在其中填上初值,还要建立变量

6、与地址间的对应关系。建立变量与地址间的对应关系。v所以变量定义是伪指令而不是指令。所以变量定义是伪指令而不是指令。v【格式】变量定义的基本格式是:【格式】变量定义的基本格式是:变量名变量名 类型类型 初值表初值表 v【说明】【说明】v 类型部分只能出现类型部分只能出现DBDB、DWDW、DDDD、DQDQ、DTDT这几种内部保留字,用以说明这几种内部保留字,用以说明初值表中的每个数据占几个字节,对初值表中的每个数据占几个字节,对应关系如下:应关系如下:v DB DB 字节型字节型,每个数据项占,每个数据项占1 1字节;字节;DW DW 字型字型,每个数据项占,每个数据项占2 2字字节;节;DD

7、 DD 双字型双字型,每个数据项占,每个数据项占4 4字节;字节;DQ DQ与与DTDT很少用,不作说明。很少用,不作说明。v初值表是用逗号分隔的若干个数据初值表是用逗号分隔的若干个数据项,每个数据项的值是变量的一个初项,每个数据项的值是变量的一个初值项,占据值项,占据“类型类型”规定的字节数,规定的字节数,所以初值表一方面说明变量的初值是所以初值表一方面说明变量的初值是多少,另一方面也指明了变量占多少多少,另一方面也指明了变量占多少字节的存储空间。字节的存储空间。v 对于对于DWDW和和DDDD类型,每个数据项的存类型,每个数据项的存储遵照储遵照“高字节在高地址,低字节在高字节在高地址,低字

8、节在低地址低地址”的原则。的原则。v(4 4)每个数据项的书写方法可以是)每个数据项的书写方法可以是任何数制的整数或者由整数构成的计任何数制的整数或者由整数构成的计算式,也可以是字符,如果用整数书算式,也可以是字符,如果用整数书写,可以是无符号数,也可以是带符写,可以是无符号数,也可以是带符号数。号数。v(5 5)当类型是)当类型是DBDB时,初值表可以是时,初值表可以是任意长度的字符串,而任意长度的字符串,而DWDW类型只允许类型只允许长度不超过长度不超过 2 2的字符串。的字符串。v(6 6)如果初值表需要填写若干个相同)如果初值表需要填写若干个相同的值,可以用下面的形式表示把一个值的值,

9、可以用下面的形式表示把一个值重复若干次:重复若干次:重复次数重复次数 DUP(DUP(数据项数据项)v(7 7)初值表中可以用问号)初值表中可以用问号“?”作为作为初值项,含义是用户程序不设定初值,初值项,含义是用户程序不设定初值,而由汇编程序安排,对此汇编程序将在而由汇编程序安排,对此汇编程序将在翻译时把这类初值项都以数值翻译时把这类初值项都以数值0 0填充。填充。v(8 8)任何段中都可以写变量定义,也)任何段中都可以写变量定义,也允许把指令与变量定义写在一个段内,允许把指令与变量定义写在一个段内,但通常是把程序所用到的所有变量集但通常是把程序所用到的所有变量集中在一个段内进行定义,而把指

10、令写中在一个段内进行定义,而把指令写在另一个段中。在另一个段中。v习惯上把定义变量的段称为数据段,习惯上把定义变量的段称为数据段,写指令的段称为代码段或指令段。写指令的段称为代码段或指令段。v【例【例4-14-1】说明说明datadata段中定义的各变段中定义的各变量的类型及初值情况量的类型及初值情况,变量占据的内变量占据的内存字节数。存字节数。vdata SEGMENTdata SEGMENTv d1 DB 1 d1 DB 1v d2 DW 1234H d2 DW 1234Hv d3 DD 12345678H d3 DD 12345678Hv d4 DB 1,2,3 d4 DB 1,2,3

11、v d5 DB 123 d5 DB 123v d6 DB 30 DUP(35H)d6 DB 30 DUP(35H)v d7 DB 1,3 DUP(2),3,-3,1001B d7 DB 1,3 DUP(2),3,-3,1001Bv d8 DB 1,2,3,4,5,6 d8 DB 1,2,3,4,5,6v DB 7,8,9,10 DB 7,8,9,10v d9 DW 12,AB d9 DW 12,ABv d10 DW 3-5 d10 DW 3-5vdata ENDSdata ENDSv3.3.变量的三个基本属性变量的三个基本属性v任何变量表面上都以一个标识符的任何变量表面上都以一个标识符的形式出

12、现,也就是它的名字,每个形式出现,也就是它的名字,每个变量都有三个数据与之相对应,这变量都有三个数据与之相对应,这就是变量的三属性。就是变量的三属性。v变量的三属性变量的三属性:段属性、偏移量属性段属性、偏移量属性和类型属性和类型属性v1 1)段属性)段属性 v 变量的段属性也就是变量所在段的段变量的段属性也就是变量所在段的段地址。变量定义必须写在一个段的范地址。变量定义必须写在一个段的范围之内,每个段在程序进入内存时都围之内,每个段在程序进入内存时都被操作系统安排一个确定的段地址。被操作系统安排一个确定的段地址。v在编写程序时可以用段的名字指出某在编写程序时可以用段的名字指出某处要使用段地址

13、,而这个段中的所有处要使用段地址,而这个段中的所有变量都统一地以这个段地址作为逻辑变量都统一地以这个段地址作为逻辑地址中的段部分。地址中的段部分。v如果在编写程序时需要使用某个变如果在编写程序时需要使用某个变量的段地址,一种方法是用该变量量的段地址,一种方法是用该变量所在段的段名。比如,对例所在段的段名。比如,对例4-14-1中中定义的变量定义的变量d1d1,如果要把它的段地,如果要把它的段地址取到寄存器址取到寄存器AXAX中,可以写作:中,可以写作:v MOV AX,dataMOV AX,data v取段地址的另一种方法是在变量名的取段地址的另一种方法是在变量名的前面加上保留字前面加上保留字

14、SEGSEG。比如,下面的。比如,下面的写法与上面指令的功能完全相同:写法与上面指令的功能完全相同:v MOV AX,SEG d1MOV AX,SEG d1 v保留字保留字SEGSEG是伪指令,用于告诉汇编程是伪指令,用于告诉汇编程序,上述指令的源操作数是变量序,上述指令的源操作数是变量d1d1所在所在段的段地址,而不是变量段的段地址,而不是变量d1d1中存放的数中存放的数据。这两条指令中的源操作数都是立即据。这两条指令中的源操作数都是立即寻址方式,操作数在指令当中。寻址方式,操作数在指令当中。v这与指令这与指令“MOV AX,d1”“MOV AX,d1”有着本质差异,有着本质差异,后者的源操

15、作数是直接寻址方式,操作后者的源操作数是直接寻址方式,操作数在内存当中,是数在内存当中,是“MOV AX,d1”“MOV AX,d1”的的变形。变形。v2 2)偏移量属性)偏移量属性 v变量的偏移量属性也就是变量所变量的偏移量属性也就是变量所在段的段内偏移地址。在第在段的段内偏移地址。在第2 2章中章中已经说明,偏移地址表示段内某一已经说明,偏移地址表示段内某一位置到段起始地址的距离,偏移地位置到段起始地址的距离,偏移地址为址为0 0表示就在段的起始处。表示就在段的起始处。v一个段中可以定义多个变量,每个一个段中可以定义多个变量,每个变量占据一定的内存空间,到段起变量占据一定的内存空间,到段起

16、点的距离也就不一样,所以一个段点的距离也就不一样,所以一个段内的各个变量都具有不同的偏移地内的各个变量都具有不同的偏移地址。址。v在编写程序时,指令中使用某变量在编写程序时,指令中使用某变量就是按照它的偏移地址到所在段中就是按照它的偏移地址到所在段中取出数据,或把数据存到相应内存。取出数据,或把数据存到相应内存。v如果在编写程序时需要使用变量的偏如果在编写程序时需要使用变量的偏移地址,一种方法是在变量名的前面移地址,一种方法是在变量名的前面加上保留字加上保留字OFFSETOFFSET。比如,把例。比如,把例4-14-1中中的变量的变量d1d1的偏移地址取到寄存器的偏移地址取到寄存器BXBX中,

17、中,写作:写作:v MOV BX,OFFSET d1MOV BX,OFFSET d1v取偏移地址的另一种方法是用汇编语取偏移地址的另一种方法是用汇编语言中的一条专用指令。言中的一条专用指令。v【指令格式】【指令格式】LEA D,S LEA D,S v【功能】把源操作数【功能】把源操作数S S的偏移地址取到的偏移地址取到目的操作数目的操作数D D中。中。v【说明】【说明】v(1 1)这是一条数据传送类指令,不影)这是一条数据传送类指令,不影响标志位。响标志位。v(2 2)该指令专用于取源操作数的偏移)该指令专用于取源操作数的偏移地址,所以源操作数地址,所以源操作数S S一定是内存型寻一定是内存型

18、寻址方式,可以是内存型操作数址方式,可以是内存型操作数5 5种寻址种寻址方式中的任何一种。方式中的任何一种。v(3 3)当)当S S是变量名形式的直接寻址方是变量名形式的直接寻址方式时,变量名两边的方括号可以省略。式时,变量名两边的方括号可以省略。v(4 4)目的操作数)目的操作数D D一定是寄存器型,一定是寄存器型,且必须是且必须是1616位的字型通用寄存器,不能位的字型通用寄存器,不能是段寄存器。是段寄存器。vLEALEA指令专门用于取偏移地址,而指令专门用于取偏移地址,而MOVMOV指令中把变量名字的前面加上伪指令指令中把变量名字的前面加上伪指令OFFSETOFFSET作为源操作数,也可

19、以取出偏作为源操作数,也可以取出偏移地址。移地址。v这两种取偏移地址的方法在很多时候这两种取偏移地址的方法在很多时候可以相互替代,但它们也有一些不同可以相互替代,但它们也有一些不同的地方,有必要把两者进行对比:的地方,有必要把两者进行对比:v寻址方式不同。用寻址方式不同。用OFFSETOFFSET后接变量后接变量名的形式出现的操作数是立即寻址方名的形式出现的操作数是立即寻址方式,式,LEALEA指令中的源操作数是内存型寻指令中的源操作数是内存型寻址方式。址方式。v下面两条指令都可以把例下面两条指令都可以把例4-14-1中的变量中的变量d1d1的偏移地址取到寄存器的偏移地址取到寄存器BXBX中,

20、执行中,执行效果是一样的,可以相互代换。效果是一样的,可以相互代换。v MOV BX,OFFSET d1MOV BX,OFFSET d1v LEA BX,d1 LEA BX,d1 vLEALEA指令在功能上比指令在功能上比OFFSETOFFSET更强。更强。通过例通过例4-24-2中的几条语句的语法正误中的几条语句的语法正误对比,可以准确地掌握两者的差别。对比,可以准确地掌握两者的差别。v【例【例4-24-2】设】设bufbuf是一个变量,偏移地是一个变量,偏移地址是址是10H10H,BXBX1000H1000H,SISI200H200H,判,判断下列各语句的正确性,对正确的指断下列各语句的正

21、确性,对正确的指令说明其功能。令说明其功能。v(1 1)MOV AX,OFFSET bufMOV AX,OFFSET bufv(1 1)正确,常规用法,把)正确,常规用法,把bufbuf的偏移的偏移地址地址10H10H作为立即数送到作为立即数送到AXAX中。中。v(2 2)MOV AX,OFFSET buf+3MOV AX,OFFSET buf+3v(2 2)正确,把)正确,把“OFFSET buf”“OFFSET buf”作为作为立即数,是立即数,是10H10H,与另,与另 一个立即数一个立即数3 3相相加,结果加,结果13H13H送到送到 AX AX中。中。v(3 3)MOV AX,OFF

22、SET BXMOV AX,OFFSET BXv(3 3)错误,应该写作)错误,应该写作MOV AX,BXMOV AX,BX。v(4 4)MOV AX,OFFSET BX+3MOV AX,OFFSET BX+3v(4 4)错误,应该先用)错误,应该先用MOVMOV指令把指令把BXBX的的值送到值送到AXAX中,再用中,再用ADDADD指令把指令把AXAX的值加的值加3 3。v(5 5)MOV AX,OFFSET bufBXMOV AX,OFFSET bufBXv(5 5)正确,把)正确,把“OFFSET buf”“OFFSET buf”作为作为立即数看待,是立即数看待,是10H10H,源操作数是

23、把,源操作数是把BXBX的值加上立即数的值加上立即数10H10H,得到,得到1010H1010H,再,再以以1010H1010H为偏移地址,与为偏移地址,与BXBX对应的缺省对应的缺省段寄存器段寄存器DSDS一起构成逻辑地址,到内一起构成逻辑地址,到内存中寻找操作数。该指令汇编的结果存中寻找操作数。该指令汇编的结果相当于相当于MOV AX,BX+10HMOV AX,BX+10H。v(6 6)MOV AX,OFFSET MOV AX,OFFSET bufBXSIbufBXSIv(6 6)正确,把)正确,把“OFFSET buf”“OFFSET buf”作为立作为立即数看待,是即数看待,是10H1

24、0H,该指令相当于:,该指令相当于:MOV AX,BX+SI+10HMOV AX,BX+SI+10H。v(7 7)LEA AX,bufLEA AX,bufv(7 7)正确,常规用法,把)正确,常规用法,把bufbuf的偏移地的偏移地址址10H10H送到送到AXAX中。中。v(8 8)LEA AX,bufLEA AX,bufv(8 8)正确,与()正确,与(7 7)的功能完全相)的功能完全相同,是两种不同的写法。同,是两种不同的写法。v(9 9)LEA AX,buf+3LEA AX,buf+3v(9 9)正确,计算出源操作数的偏移)正确,计算出源操作数的偏移地址地址13H13H,送到,送到AXA

25、X中。中。v(1010)LEA AX,BX+bufLEA AX,BX+bufv(1010)正确,计算出源操作数的偏移)正确,计算出源操作数的偏移地址地址1013H1013H,送到,送到AXAX中。中。v(1111)LEA AX,BX+3LEA AX,BX+3v(1111)正确,计算出源操作数的偏移)正确,计算出源操作数的偏移地址地址1003H1003H,送到,送到AXAX中。中。v(1212)LEA AX,BX+SILEA AX,BX+SIv(1212)正确,计算出源操作数的偏移)正确,计算出源操作数的偏移地址地址1200H1200H,送到,送到AXAX中。中。v(1313)LEA AX,BX

26、+SI+bufLEA AX,BX+SI+bufv(1313)正确,计算出源操作数的偏移)正确,计算出源操作数的偏移地址地址1210H1210H,送到,送到AXAX中。中。v3 3)类型属性)类型属性 v类型属性也就是变量的类型,变量在定类型属性也就是变量的类型,变量在定义时必须用义时必须用DBDB、DWDW等伪指令说明类型。等伪指令说明类型。v说明变量的类型,一方面告诉汇编程序说明变量的类型,一方面告诉汇编程序在翻译时把该变量定义中的每个数据项在翻译时把该变量定义中的每个数据项用几个字节存放,另一方面说明该变量用几个字节存放,另一方面说明该变量的使用方法。的使用方法。vMOVMOV等双操作数指

27、令中的两个操作数必等双操作数指令中的两个操作数必须是同一种类型。须是同一种类型。v汇编程序在翻译时要进行类型检查。当一汇编程序在翻译时要进行类型检查。当一个操作数是寄存器,另一个是变量时,两个操作数是寄存器,另一个是变量时,两者的类型一致是正常情况,当两者类型不者的类型一致是正常情况,当两者类型不同时,汇编程序将以寄存器的类型为准进同时,汇编程序将以寄存器的类型为准进行翻译,并提出警告(行翻译,并提出警告(WarningWarning);当目的);当目的操作数是变量,源操作数是立即数时,就操作数是变量,源操作数是立即数时,就以变量定义时的类型为准。以变量定义时的类型为准。v如果有必要,使用变量

28、时可以临时改变类如果有必要,使用变量时可以临时改变类型,后面将以具体例子说明使用方法。型,后面将以具体例子说明使用方法。v4.1.2 4.1.2 内存图内存图v内存图表示的内容有两个方面。一方面是内存图表示的内容有两个方面。一方面是存储器,通常由若干个叠放在一起的小方存储器,通常由若干个叠放在一起的小方框表示,每个方框代表一个字节。虽然每框表示,每个方框代表一个字节。虽然每个字节有自己确定的物理地址,但是,由个字节有自己确定的物理地址,但是,由于编写程序时使用的是逻辑地址,而逻辑于编写程序时使用的是逻辑地址,而逻辑地址到物理地址的转换由计算机自动实现,地址到物理地址的转换由计算机自动实现,所以

29、画变量分配的内存图时,一般标以各所以画变量分配的内存图时,一般标以各字节的偏移地址,段地址部分被省略。字节的偏移地址,段地址部分被省略。v在表示一个字节的小方框内填上数值,在表示一个字节的小方框内填上数值,表示该字节中的内容。填写数值时可以表示该字节中的内容。填写数值时可以用各种数制、各种写法,但用十六进制用各种数制、各种写法,但用十六进制数会有助于理解。另一方面,内存图还数会有助于理解。另一方面,内存图还要表示变量名与偏移地址的对应关系,要表示变量名与偏移地址的对应关系,把变量的名字写在对应的方框的边上。把变量的名字写在对应的方框的边上。v图图4.14.1是一个内存图的实例。是一个内存图的实

30、例。图图4-1 4-1 变量的内存图变量的内存图v图图4.14.1总体上分为三部分,中间是表示总体上分为三部分,中间是表示内存各字节的方框,各方框的右边标内存各字节的方框,各方框的右边标以偏移地址,左边则标出变量的名字。以偏移地址,左边则标出变量的名字。v从图从图4-14-1中无法看出中无法看出3 3个变量的类型,个变量的类型,这一点可以通过在变量名的下面标上这一点可以通过在变量名的下面标上类型加以弥补。类型加以弥补。v从另一个角度看,不标类型还说明变从另一个角度看,不标类型还说明变量是不注重类型的。量是不注重类型的。v换句话说,源程序翻译成机器语言之换句话说,源程序翻译成机器语言之后,指令中

31、没有变量而只有偏移地址,后,指令中没有变量而只有偏移地址,类型是通过寄存器的位数或者指令本类型是通过寄存器的位数或者指令本身所带有的机器语言形式的身所带有的机器语言形式的BYTEBYTE或或WORDWORD类型指示加以区分的。类型指示加以区分的。v【例【例4-34-3】对于图】对于图4-14-1的各变量,确定的各变量,确定下列指令中赋值操作的操作数是什么下列指令中赋值操作的操作数是什么类型。类型。(1 1)MOV AX,var1MOV AX,var1(2 2)MOV AL,var1MOV AL,var1(3 3)MOV WORD PTR var2,3MOV WORD PTR var2,3(4

32、4)MOV BYTE PTR var2+1,3MOV BYTE PTR var2+1,3(5 5)MOV var2+3,3MOV var2+3,3v【解解】v(1 1)字型,由寄存器)字型,由寄存器AXAX是是1616位可知位可知v(2 2)字节型,由寄存器)字节型,由寄存器ALAL是是8 8位可知位可知v(3 3)字型,由伪指令)字型,由伪指令WORD PTRWORD PTR指示指示v(4 4)字节型,由伪指令)字节型,由伪指令BYTE PTRBYTE PTR指示指示v(5 5)是变量)是变量var2var2定义时的类型,由图定义时的类型,由图4-14-1不能分辨究竟是哪一种类型。不能分辨究

33、竟是哪一种类型。v4.1.3 4.1.3 变量定义与内存分配的关系变量定义与内存分配的关系v汇编程序在为变量安排内存时遵照下面的汇编程序在为变量安排内存时遵照下面的规则:规则:v(1 1)同一段内的变量具有相同的段地址。)同一段内的变量具有相同的段地址。v(2 2)按照段中变量定义的次序,依次对)按照段中变量定义的次序,依次对各变量分配偏移地址。各变量分配偏移地址。v(3 3)除非有其它伪指令说明,段内的第)除非有其它伪指令说明,段内的第一个变量被分配在偏移地址为一个变量被分配在偏移地址为0 0处。处。v(4 4)一个变量占据内存的字节数由其)一个变量占据内存的字节数由其类型和初值表中的项数决

34、定。类型和初值表中的项数决定。v(5 5)除非有其它伪指令说明,一个变)除非有其它伪指令说明,一个变量分配完后,紧接着分配下一变量。量分配完后,紧接着分配下一变量。v【例【例4-44-4】说明下面的数据段中各变量】说明下面的数据段中各变量的内存分配情况,画出相应的内存图。的内存分配情况,画出相应的内存图。v data SEGMENT data SEGMENT v x1 DB 012 x1 DB 012v x2 DW ab x2 DW abv x3 DB 2 DUP(32),13,10 x3 DB 2 DUP(32),13,10v x4 DD 1017H x4 DD 1017Hv data EN

35、DS data ENDS 图图4-2 4-2 例例4-44-4的的datadata段的内存分配情况段的内存分配情况4.2 4.2 常用伪指令常用伪指令v1.OFFSET1.OFFSET操作符操作符v 变量是数据的存放地,对变量最常见变量是数据的存放地,对变量最常见的操作是从变量中取出数据和把数据放的操作是从变量中取出数据和把数据放入变量中,实现这些操作有两种方法:入变量中,实现这些操作有两种方法:直接法和间接法。直接法和间接法。4.2.1 OFFSET4.2.1 OFFSET和和SEGSEGv 直接法是在程序中直接使用变量的名字直接法是在程序中直接使用变量的名字以表明对哪个变量进行操作。比如,

36、设以表明对哪个变量进行操作。比如,设varvar是一个字型变量,则指令是一个字型变量,则指令 v MOV AX,varMOV AX,var v是从变量中取出数据,送到是从变量中取出数据,送到AXAX中,而指令中,而指令 v MOV var,AX MOV var,AX v完成反方向的数据传递。上述两条指令中,完成反方向的数据传递。上述两条指令中,varvar都是直接指明使用的变量,是直接都是直接指明使用的变量,是直接寻址方式。寻址方式。v而间接法是先用而间接法是先用OFFSETOFFSET伪指令,把变伪指令,把变量的偏移地址取到某个地址寄存器中,量的偏移地址取到某个地址寄存器中,如如BXBX、S

37、ISI、DIDI、BPBP等,然后再用寄存等,然后再用寄存器间接寻址方式对原变量中的操作数器间接寻址方式对原变量中的操作数进行操作。进行操作。v如:如:MOV SIMOV SI,OFFSET varOFFSET varv MOV AX,SI MOV AX,SIv 或或 MOV ALMOV AL,SISIv这种间接法方便对变量数组进行操作。这种间接法方便对变量数组进行操作。v2.2.SEGSEG操作符操作符 v无论按直接法还是间接法使用变量,都无论按直接法还是间接法使用变量,都会涉及变量的段地址问题,需要把段地会涉及变量的段地址问题,需要把段地址放在某个段寄存器中,一般是放在址放在某个段寄存器中

38、,一般是放在DSDS或或ESES中。取变量的段地址也有两种方法:中。取变量的段地址也有两种方法:一是用变量所在段的段名,比如在例一是用变量所在段的段名,比如在例4-4-1 1中,如果用指令中,如果用指令 MOV AX,data MOV AX,data就是就是取取datadata段的段地址送到段的段地址送到AXAX中。中。v另一种方法是用另一种方法是用SEGSEG伪指令放在某变量伪指令放在某变量的前面,表示取该变量所在段的段地址,的前面,表示取该变量所在段的段地址,比如在例比如在例4-14-1中,变量中,变量d1d1是在是在datadata段中段中定义的,所以把上述指令换成定义的,所以把上述指令

39、换成MOV AX,MOV AX,SEG d1SEG d1也是可以的。也是可以的。v不论是用段名还是用不论是用段名还是用“SEG“SEG 变量名变量名”的形式,汇编程序都是把它作为常量处的形式,汇编程序都是把它作为常量处理。理。v4.2.2 ASSUME4.2.2 ASSUME和和PTRPTRv1.ASSUME1.ASSUME伪指令伪指令vASSUMEASSUME伪指令占一行,用于指出后续伪指令占一行,用于指出后续程序中所使用的变量、标号等标识符在程序中所使用的变量、标号等标识符在涉及到逻辑地址的段地址部分时,用哪涉及到逻辑地址的段地址部分时,用哪个段寄存器作为缺省段地址。个段寄存器作为缺省段地

40、址。【格式】【格式】ASSUME R1:S1,R2:S2,.ASSUME R1:S1,R2:S2,.v【说明】【说明】v(1 1)格式中的)格式中的RiRi代表段寄存器名。代表段寄存器名。必须是必须是DSDS、ESES、SSSS、CSCS四个之一,四个之一,SiSi是段地址,只能是一个段名或者是段地址,只能是一个段名或者“SEG“SEG 变量名变量名”的形式。的形式。v(2 2)Ri:SiRi:Si是一组对应关系,表示是一组对应关系,表示SiSi段中的标识符都使用段中的标识符都使用RiRi作为缺省段寄作为缺省段寄存器。存器。v(3 3)ASSUMEASSUME可以一次指定多个对应可以一次指定多

41、个对应关系,其间用逗号分隔。这种写法实关系,其间用逗号分隔。这种写法实际上是多个际上是多个ASSUMEASSUME的简写形式,等效的简写形式,等效写法是:写法是:v ASSUME ASSUME R1:S1 R1:S1 v ASSUME ASSUME R2:S2R2:S2v(4 4)在一个完整程序中,)在一个完整程序中,ASSUMEASSUME伪指伪指令在程序中最少出现一次,用于指明令在程序中最少出现一次,用于指明CSCS与哪一个段相对应。此时,与哪一个段相对应。此时,CSCS对应的段对应的段必须是结束伪指令必须是结束伪指令“END“END 标号标号”中标号中标号所在段,从而确定程序的第一条指令

42、在所在段,从而确定程序的第一条指令在哪个段的哪个位置,称作程序的入口地哪个段的哪个位置,称作程序的入口地址。址。v(5 5)可以用)可以用ASSUMEASSUME伪指令指定两个或伪指令指定两个或两个以上的段寄存器作为同一个段中标两个以上的段寄存器作为同一个段中标识符的缺省段寄存器。当数据定义与指识符的缺省段寄存器。当数据定义与指令写在同一个段中时,就会出现以令写在同一个段中时,就会出现以CSCS、DSDS甚至甚至ESES一起作为一个段的缺省段寄存一起作为一个段的缺省段寄存器的情况。此时,有关数据的操作(取器的情况。此时,有关数据的操作(取值、存数等)优先以值、存数等)优先以DSDS作为段寄存器

43、。作为段寄存器。v2.PTR2.PTR操作符操作符vPTRPTR是用于指定操作数类型的伪指是用于指定操作数类型的伪指令,它需要与类型保留字配合使令,它需要与类型保留字配合使用,其基本用法如下:用,其基本用法如下:v类型类型 PTR PTR 操作数操作数 v程序中有两种情况需要用到指定类型程序中有两种情况需要用到指定类型伪操作:一是操作数本身没有类型,需伪操作:一是操作数本身没有类型,需要明确该操作数的类型时使用这种用法,要明确该操作数的类型时使用这种用法,比如寄存器间接寻址方式的比如寄存器间接寻址方式的BXBX。v另一种情况是已定义的变量本身有一另一种情况是已定义的变量本身有一定的类型,程序需

44、要临时当作另一种类定的类型,程序需要临时当作另一种类型来处理。当操作数是内存型时,其类型来处理。当操作数是内存型时,其类型常有型常有BYTEBYTE和和WORDWORD两种。两种。v BYTE PTR BYTE PTR 内存操作数;该内内存操作数;该内存操作数为字节类型存操作数为字节类型.v WORD PTR WORD PTR 内存操作数;该内内存操作数;该内存操作数为字类型存操作数为字类型.v另外,当另外,当PTRPTR后的操作数是标号或过后的操作数是标号或过程名时,则类型包括两种:即程名时,则类型包括两种:即NEARNEAR类型和类型和FARFAR类型。类型。v过程名即子程序名后面第过程名

45、即子程序名后面第5 5章将作详章将作详细讲解,在此不再作阐述。细讲解,在此不再作阐述。v4.2.3 ORG4.2.3 ORG和和v1.ORG1.ORG伪指令伪指令vORGORG伪指令单独占一行,基本格式是:伪指令单独占一行,基本格式是:vORG ORG 地址表达式地址表达式 v功能:把地址表达式的值赋给后功能:把地址表达式的值赋给后面的变量或标号作偏移地址。面的变量或标号作偏移地址。即接即接在在ORGORG伪指令后面的内容就从该地址开伪指令后面的内容就从该地址开始安排。始安排。v【例【例4-54-5】分析下面数据段定义中各变量】分析下面数据段定义中各变量的偏移地址。的偏移地址。vdata SE

46、GMENTdata SEGMENTv v1 DB 5 v1 DB 5v ORG 6 ORG 6v v2 DW 6 v2 DW 6v ORG 2 ORG 2v v3 DB 8 v3 DB 8v v4 DW 9 v4 DW 9vdata ENDSdata ENDS ORGORG伪指令可以改变段中各变量定义伪指令可以改变段中各变量定义时原有的次序,按指定情况安排各变时原有的次序,按指定情况安排各变量的偏移地址。量的偏移地址。段定义中各变量的次序是段定义中各变量的次序是v1v1、v2v2、v3v3、v4v4,而内存图上按地址由小到大依次,而内存图上按地址由小到大依次是是v1v1、v3v3、v4v4、v

47、2v2。图图4-34-3中的两个空格表示数据段中没中的两个空格表示数据段中没有对此进行定义,但实际上汇编程序有对此进行定义,但实际上汇编程序会填上会填上0 0。图图4-3 4-3 例例4-54-5中数据段的内存分配情况中数据段的内存分配情况v2.$2.$操作符操作符 v$是汇编语言中的一个特殊符号,代表是汇编语言中的一个特殊符号,代表汇编程序在处理到汇编程序在处理到$所在的位置时当前所在的位置时当前安排的偏移地址值。安排的偏移地址值。v程序中出现的程序中出现的$可以作为常量看待,但可以作为常量看待,但是不同位置上的是不同位置上的$,其代表的值是不同,其代表的值是不同的。与一般的数据不同的是,通

48、常所说的。与一般的数据不同的是,通常所说的常量的常量(数值数值)是没有类型的,但是没有类型的,但$所表所表示的数据一定是字型。示的数据一定是字型。$一般作为字型一般作为字型变量定义时的一个初值使用。变量定义时的一个初值使用。v【例【例4-64-6】分析下面数据段中各】分析下面数据段中各$符所符所表示的值。表示的值。v data SEGMENT data SEGMENTv a DB$a DB$v b DW$,$b DW$,$v c DB$-a c DB$-av data ENDS data ENDS 【解】变量【解】变量a a的定义中出现的的定义中出现的$是表示是表示ASCIIASCII码值为码

49、值为24H24H的符号;定义变量的符号;定义变量b b时时用的两个用的两个$没有加引号,第一个没有加引号,第一个$代表代表0001H0001H,第二个,第二个$代表代表0003H0003H;在变量;在变量c c的定义中,的定义中,$出现在数值表达式中,两出现在数值表达式中,两者相减的结果是者相减的结果是5 5,并且不再有类型,并且不再有类型,因此可以作为字节型变量的一项初值。因此可以作为字节型变量的一项初值。图图4-44-4是该数据段对应的内存图。是该数据段对应的内存图。图图4-4 4-4 例例4-64-6中数据段的内存分配情况中数据段的内存分配情况4.2.4 4.2.4 和和 EQU EQU

50、v1 1、伪指令、伪指令v对于程序中经常使用的一个特定的数值,对于程序中经常使用的一个特定的数值,很多程序员喜欢把它定义成一个常量标很多程序员喜欢把它定义成一个常量标识符,在书写后面的程序时若遇到该数识符,在书写后面的程序时若遇到该数值,就写相应的常量标识符而不写数值值,就写相应的常量标识符而不写数值本身。本身。v这种做法的最大好处在于方便程序的修这种做法的最大好处在于方便程序的修改,如果需要把一个程序中使用到的某改,如果需要把一个程序中使用到的某一数据统一改为另一数据,在使用常量一数据统一改为另一数据,在使用常量定义时就只要在定义处修改一次即可。定义时就只要在定义处修改一次即可。v常量定义的

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁