资源预览内容
第1页 / 共185页
第2页 / 共185页
第3页 / 共185页
第4页 / 共185页
第5页 / 共185页
第6页 / 共185页
第7页 / 共185页
第8页 / 共185页
第9页 / 共185页
第10页 / 共185页
亲,该文档总共185页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第四章 v所谓常用处理技术,是指常用指令、 常用伪指令、变量定义和使用以及编 程应用的技术。v这种编程应用主要是针对一些数值型 数据的运算和非数值型数据的处理, 而这种处理常常是大量的、广泛的和 带有技巧性的。v汇编语言程序的语句除指令语句外, 还有伪指令语句。v伪指令语句又称为说明语句或指示性 语句。它不同于指令语句,它不是直 接命令CPU去执行某一操作,而是命 令汇编程序应当如何生成目标代码。v例如控制汇编以实现数据定义、存储 器分配、源程序开始和指示程序结束 等功能。v伪指令无相应的目标代码,因此也 称为伪操作。伪指令,特别是数据 定义伪指令,在源程序设计中是必 不可少的。v本章主要介绍变量、伪指令和常用 数据处理程序。最后通过大量案例 说明其应用。4.1 变量4.2 常用伪指令4.3 常用数据处理指令4.4 字符串输入输出方法 习 题 4v1变量名v变量的名字是它的外包装,是用来 区分不同的存储区域的标识符号, 是一种标识符。4.1 变量4.1.1 变量定义v不同的语言对标识符命名的规定有 所不同,但大体上都把“以字母开 头的字符数字串” 作为基本规定, 当然也可以用“ _”或“”开头 。v8086的汇编语言还允许用下面的特 殊符号作为标识符的构成符号: ? 、 $、% 和_。v标识符是一个或多个符号构成的符 号串,汇编语言对标识符命名的完 整规定是: v(1)可用符号包括字母、数字和 特殊符号“?”、“”、“$”、 “%”、“ _”。 v(2)不允许用数字作为第一个符 号。 v(3)名字的长度由131个字符组成 ,但一般不超过10个符号。 v(4)最少由一个符号构成,可以是 字母、“_”或“”。v(5)汇编语言不区分字母的大小写 。 v2. 变量定义的方法v变量的实质是存放数据的内存区域, 所谓变量定义就是告诉汇编程序,在 翻译时从某个地址起预留一定数量的 内存空间,并在其中填上初值,还要 建立变量与地址间的对应关系。v所以变量定义是伪指令而不是指令。 v【格式】变量定义的基本格式是: 变量名 类型 初值表 v【说明】v 类型部分只能出现DB、DW、DD 、DQ、DT这几种内部保留字,用以 说明初值表中的每个数据占几个字 节,对应关系如下:v DB 字节型,每个数据项占 1字节; DW 字型,每个数据项占2字 节; DD 双字型,每个数据项占4 字节; DQ与DT很少用,不作说明。 v初值表是用逗号分隔的若干个数 据项,每个数据项的值是变量的一个 初值项,占据“类型”规定的字节数 ,所以初值表一方面说明变量的初值 是多少,另一方面也指明了变量占多 少字节的存储空间。 v 对于DW和DD类型,每个数据项的 存储遵照“高字节在高地址,低字节 在低地址” 的原则。v(4)每个数据项的书写方法可以是 任何数制的整数或者由整数构成的 计算式,也可以是字符,如果用整 数书写,可以是无符号数,也可以 是带符号数。 v(5)当类型是DB时,初值表可以是 任意长度的字符串,而DW类型只允 许长度不超过 2的字符串。 v(6)如果初值表需要填写若干个相 同的值,可以用下面的形式表示把一 个值重复若干次: 重复次数 DUP(数据项) v(7)初值表中可以用问号“?”作 为初值项,含义是用户程序不设定初 值,而由汇编程序安排,对此汇编程 序将在翻译时把这类初值项都以数值0 填充。 v(8)任何段中都可以写变量定义, 也允许把指令与变量定义写在一个段 内,但通常是把程序所用到的所有变 量集中在一个段内进行定义,而把指 令写在另一个段中。v习惯上把定义变量的段称为数据段 ,写指令的段称为代码段或指令段。v【例4-1】 说明data段中定义的各 变量的类型及初值情况,变量占据的 内存字节数。vdata SEGMENTv d1 DB 1v d2 DW 1234Hv d3 DD 12345678Hv d4 DB 1, 2, 3v d5 DB 123v d6 DB 30 DUP(35H)v d7 DB 1,3 DUP(2),3,-3,1001Bv d8 DB 1,2,3,4,5,6v DB 7,8,9,10v d9 DW 12, ABv d10 DW 3-5vdata ENDSv3.变量的三个基本属性v任何变量表面上都以一个标识符的 形式出现,也就是它的名字,每个 变量都有三个数据与之相对应,这 就是变量的三属性。v变量的三属性:段属性、偏移量属 性和类型属性v1)段属性 v 变量的段属性也就是变量所在段的 段地址。变量定义必须写在一个段的 范围之内,每个段在程序进入内存时 都被操作系统安排一个确定的段地址 。v在编写程序时可以用段的名字指出某 处要使用段地址,而这个段中的所有 变量都统一地以这个段地址作为逻辑 地址中的段部分。v如果在编写程序时需要使用某个 变量的段地址,一种方法是用该 变量所在段的段名。比如,对例4 -1中定义的变量d1,如果要把它 的段地址取到寄存器AX中,可以 写作: v MOV AX, data v取段地址的另一种方法是在变量名 的前面加上保留字SEG。比如,下面 的写法与上面指令的功能完全相同 : v MOV AX, SEG d1 v保留字SEG是伪指令,用于告诉汇编 程序,上述指令的源操作数是变量d1 所在段的段地址,而不是变量d1中存 放的数据。这两条指令中的源操作数 都是立即寻址方式,操作数在指令当 中。v这与指令“MOV AX, d1”有着本质差 异,后者的源操作数是直接寻址方式 ,操作数在内存当中,是“MOV AX, d1”的变形。v2)偏移量属性 v变量的偏移量属性也就是变量所 在段的段内偏移地址。在第2章 中已经说明,偏移地址表示段内 某一位置到段起始地址的距离, 偏移地址为0表示就在段的起始 处。v一个段中可以定义多个变量,每个 变量占据一定的内存空间,到段起 点的距离也就不一样,所以一个段 内的各个变量都具有不同的偏移地 址。v在编写程序时,指令中使用某变量 就是按照它的偏移地址到所在段中 取出数据,或把数据存到相应内存 。 v如果在编写程序时需要使用变量的 偏移地址,一种方法是在变量名的 前面加上保留字OFFSET。比如,把 例4-1中的变量d1的偏移地址取到寄 存器BX中,写作: v MOV BX, OFFSET d1v取偏移地址的另一种方法是用汇编语 言中的一条专用指令。 v【指令格式】 LEA D, S v【功能】把源操作数S的偏移地址取 到目的操作数D中。 v【说明】 v(1)这是一条数据传送类指令,不 影响标志位。 v(2)该指令专用于取源操作数的偏 移地址,所以源操作数S一定是内存 型寻址方式,可以是内存型操作数5 种寻址方式中的任何一种。 v(3)当S是变量名形式的直接寻址方 式时,变量名两边的方括号可以省略 。 v(4)目的操作数D一定是寄存器型, 且必须是16位的字型通用寄存器,不 能是段寄存器。 vLEA指令专门用于取偏移地址,而 MOV指令中把变量名字的前面加上伪 指令OFFSET作为源操作数,也可以 取出偏移地址。v这两种取偏移地址的方法在很多时 候可以相互替代,但它们也有一些 不同的地方,有必要把两者进行对 比:v寻址方式不同。用OFFSET后接变 量名的形式出现的操作数是立即寻址 方式,LEA指令中的源操作数是内存 型寻址方式。v下面两条指令都可以把例4-1中的变 量d1的偏移地址取到寄存器BX中,执 行效果是一样的,可以相互代换。v MOV BX, OFFSET d1v LEA BX, d1 vLEA指令在功能上比OFFSET更强。 通过例4-2中的几条语句的语法正误 对比,可以准确地掌握两者的差别 。v【例4-2】设buf是一个变量,偏移 地址是10H,BX1000H,SI200H ,判断下列各语句的正确性,对正 确的指令说明其功能。 v(1)MOV AX, OFFSET bufv(1)正确,常规用法,把buf的偏 移地址10H作为立即数送到AX中。v(2)MOV AX, OFFSET buf+3v(2)正确,把“OFFSET buf”作 为立即数,是10H,与另 一个立即 数3相加,结果13H送到 AX中。v(3)MOV AX, OFFSET BXv(3)错误,应该写作MOV AX, BX。v(4)MOV AX, OFFSET BX+3v(4)错误,应该先用MOV指令把BX的 值送到AX中,再用ADD指令把AX的值 加3。v(5)MOV AX, OFFSET bufBXv(5)正确,把“OFFSET buf”作为 立即数看待,是10H,源操作数是把 BX的值加上立即数10H,得到1010H ,再以1010H为偏移地址,与BX对应 的缺省段寄存器DS一起构成逻辑地 址,到内存中寻找操作数。该指令 汇编的结果相当于MOV AX, BX+10H。v(6)MOV AX, OFFSET bufBXSIv(6)正确,把“OFFSET buf”作为立 即数看待,是10H,该指令相当于:MOV AX, BX+SI+10H。 v(7)LEA AX, bufv(7)正确,常规用法,把buf的偏移 地址10H送到AX中。v(8)LEA AX, bufv(8)正确,与(7)的功能完全相 同,是两种不同的写法。v(9)LEA AX, buf+3v(9)正确,计算出源操作数的偏 移地址13H,送到AX中。v(10)LEA AX, BX+bufv(10)正确,计算出源操作数的偏 移地址1013H,送到AX中。v(11)LEA AX, BX+3v(11)正确,计算出源操作数的偏 移地址1003H,送到AX中。v(12)LEA AX, BX+SIv(12)正确,计算出源操作数的偏 移地址1200H,送到AX中。v(13)LEA AX, BX+SI+bufv(13)正确,计算出源操作数的偏 移地址1210H,送到AX中。v3)类型属性 v类型属性也就是变量的类型,变量在 定义时必须用DB、DW等伪指令说明类 型。v说明变量的类型,一方面告诉汇编程 序在翻译时把该变量定义中的每个数 据项用几个字节存放,另一方面说明 该变量的使用方法。vMOV等双操作数指令中的两个操作数必 须是同一种类型。v汇编程序在翻译时要进行类型检查。当一 个操作数是寄存器,另一个是变量时,两 者的类型一致是正常情况,当两者类型不 同时,汇编程序将以寄存器的类型为准进 行翻译,并提出警告(Warning);当目 的操作数是变量,源操作数是立即数时, 就以变量定义时的类型为准。 v如果有必要,使用变量时可以临时改变类 型,后面将以具体例子说明使用方法。v4.1.2 内存图v内存图表示的内容有两个方面。一方面 是存储器,通常由若干个叠放在一起的 小方框表示,每个方框代表一个字节。 虽然每个字节有自己确定的物理地址, 但是,由于编写程序时使用的是逻辑地 址,而逻辑地址到物理地址的转换由计 算机自动实现,所以画变量分配的内存 图时,一般标以各字节的偏移地址,段 地址部分被省略。v在表示一个字节的小方框内填上数值 ,表示该字节中的内容。填写数值时 可以用各种数制、各种写法,但用十 六进制数会有助于理解。另一方面, 内存图还要表示变量名与偏移地址的 对应关系,把变量的名字写在对应的 方框的边上。v图4.1是一个内存图的实例。 图4-1 变量的内存图v图4.1总体上分为三部分,中间是表 示内存各字节的方框,各方框的右边 标以偏移地址,左边则标出变量的名 字。v从图4-1中无法看出3个变量的类型, 这一点可以通过在变量名的下面标上 类型加以弥补。v从另一个角度看,不标类型还说明 变量是不注重类型的。v换句话说,源程序翻译成机器语言 之后,指令中没有变量而只有偏移 地址,类
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号