汇编语言程序设计1-4章.ppt_第1页
汇编语言程序设计1-4章.ppt_第2页
汇编语言程序设计1-4章.ppt_第3页
汇编语言程序设计1-4章.ppt_第4页
汇编语言程序设计1-4章.ppt_第5页
已阅读5页,还剩101页未读 继续免费阅读

下载本文档

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

文档简介

汇编语言程序设计,吴 向 军,中山大学计算机科学系,第1章 预备知识,1.1 汇编语言的由来及其特点,1.1.1 机器语言,机器指令是CPU能直接识别并执行的指令,它的表现形式是二进制编码。 机器指令通常由操作码和操作数两部分组成:,机器指令与CPU紧密相关,所以,不同种类的CPU所对应的机器指令也就不同。,第1章 预备知识,1.1.2 汇编语言,用通俗易懂、具有一定含义的符号来代表机器指令,这些符号称为助忆符,用指令助忆符、符号地址等组成的符号指令称为汇编格式指令(或汇编指令)。 汇编语言是汇编指令集、伪指令集和使用它们规则的统称。 伪指令是在程序设计时所需要的一些辅助性说明指令,它不对应具体的机器指令。 用汇编语言编写的程序称为汇编语言程序,或汇编语言源程序,在本教材中简称为源程序。汇编语言程序要比用机器指令编写的程序容易理解和维护。,第1章 预备知识,1.1.3 汇编程序,用汇编语言编写的程序大大提高了程序的可读性,但失去了CPU能直接识别的特性。 把汇编语言编写的源程序翻译成CPU能识别的机器指令序列,我们称该翻译程序为汇编程序。图1.1是翻译程序的翻译过程示意图。 目前,常用的汇编程序有:MASM、TASM和DEBUG等。,图1.1 汇编语言指令到机器指令的示意图,第1章 预备知识,1.1.4 汇编语言程序的主要特点,汇编语言程序归纳起来大概有以下几个主要特性。,与机器相关性 执行的高效率 编写程序的复杂性 调试的复杂性 现在在调试方面有所改善,CV(CodeView)、TD(Turbo Debug)等软件可在源程序级进行符号跟踪。,第1章 预备知识,1.1.5 汇编语言的使用领域,根据应用程序的“可移植性”和“执行效率”来确定是否选用汇编语言。 下面简单列举几个领域以示说明,但不要把它们绝对化。,1、适用的领域 要求执行效率高、反应快的领域,如:操作系统内核,实时系统等; 系统性能的瓶颈,或频繁被使用子程序或程序段; 与硬件资源密切相关的软件开发,如:设备驱动程序等; 受存储容量限制的应用领域,如:家用电器的计算机控制功能等; 2、不宜使用的领域 大型软件的整体开发; 没有特殊要求的一般应用系统的开发等。,第1章 预备知识,1.2 数据的表示和类型,1.2.1 数值数据的表示,1、二进制 二进制的表示元素是:0和1。书写时,在数据后面紧跟一个字母B。如:0101B、10101B等。 数据的二进制写起来比较长,通常情况下,程序中不直接用二进制来书写具体的数值,而改用八进制、十进制或十六进制。,用汇编语言进行程序设计时,程序员可以直接访问内存,对数据在存储器内的表示形式要有清晰的认识。有关“数据表示”的详细内容请参阅计算机组成原理中的章节。,第1章 预备知识,3、十进制 十进制是我们最熟悉的一种数据表示形式,其基本元素是:0、1、9。 书写时,在数据后面紧跟一个字母D。如:1234D、7674D、5411D等。,2、八进制 八进制是一种二进制的变形,三位二进制可变为一位八进制,反之也然。 八进制的表示元素是:0、1、7。 书写时,在数据后面紧跟一个字母Q。如:1234Q、7654Q、54Q等。,4、十六进制 十六进制是另一种二进制的变形,四位二进制可变为一位十六进制,反之也然。其基本元素是:09、AF、af,其中:AF依次代表1015。 书写时,数据后面紧跟一个字母H。当十六进制数的第一个字符是字母时,在其之前必须添加一个0。如:100H、56EFH、0FFH、0ABCDH等。,第1章 预备知识,1.2.2 进制在编程环境中的表示,程序员在用汇编语言进行程序设计时,需要知道当前环境的数据表示符号。,(*) 字符Y、O和T是宏汇编MASM系统所增加的进制表示符。,第1章 预备知识,1.2.3 非数值数据的表示,1、ASCII码 在ASCII码表中,对学习本课程有用的主要信息有: 字符09是连续编码的,其ASCII码的低4位就是该字符在十进制中的数值; 小写字母的ASCII码比大写字母的编码大,对应字母的编码之间相差20H。,2、汉字编码 我国在1981年5月对6000多个常用的汉字制定了交换码的国家标准,即:GB2312-80。 该标准给定每个字符的二进制编码,即国标码。,第1章 预备知识,1.2.4 基本的数据类型,1、字节 一个字节有8位二进制组成,其最高位是第7位,最低位是第0位。 通常情况下,存储器按字节编址,读写存储器的最小信息单位就是字节。,2、字 由2个字节组成一个字,其最高位是第15位,最低位是第0位。高8位称为高字节,低8位称为低字节。,3、双字 用2个字(4个字节)来组成一个双字,其高16位称为高字,低16位称为低字。 双字有较大的数据表示范围,它通常是为了满足数据的表示范围而选用的数据类型,也可用于存储远指针。,第1章 预备知识,4、四字 由4个字(8个字节)组成一个四字类型,它总共有64个二进制位,有更大的数据表示范围,但在汇编语言中很少使用该数据类型。,5、十字节 由10个字节组成一个十字节类型,它总共有80个二进制位。在汇编语言中很少使用该数据类型。,6、字符串 字符串是由若干个字节组成的,字节数不定,通常每个字节存储一个字符。该数据形式是汇编语言程序中经常使用的一种数据形式。 汇编语言中没有C语言中的规定:以ASCII码0为字符串的结束符。,第2章 CPU资源和存储器,计算机的硬件资源是用汇编语言编程所必须要了解的重要内容,因为汇编语言允许、也需要程序员直接使用这些硬件资源,只有这样才能编写出高效的目标代码。,4个数据寄存器:AX、BX、CX和DX,每个寄存器又可分为2个8位寄存器 2个变址寄存器:DI和SI 2个指针寄存器:SP和BP 4个段寄存器:ES、CS、SS和DS 1个标志寄存器:FLAG 1个指令指针寄存器:IP,2.1 寄存器组,2.1.1 16位寄存器组,第2章 CPU资源和存储器,32位CPU把通用寄存器、指令指针和标志寄存器从16位扩充成32位,而且还增加了2个16位的段寄存器:FS和GS。如下图所示。 32位CPU有8个32位的通用寄存器EAX、EBX、ECX、EDX、ESI、EDI、ESP和EBP,这些通用寄存器的低16位就是先前CPU中的AX、BX、CX、DX、SI、DI、SP和BP。对其低16位数据的存取,不会影响高16位的数据。,2.1.2 32位寄存器组,第2章 CPU资源和存储器,1. 数据寄存器 数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。 4个32位寄存器:EAX、EBX、ECX和EDX 4个16位寄存器:AX、BX、CX和DX 8个8位寄存器:AH和AL、BH和BL、CH和CL、DH和DL 每个寄存器都有自己的名称,可独立存取。程序员可利用数据寄存器“能分可合”的特性,灵活地处理双字、字和字节等信息。,2.1.3 通用寄存器的作用,第2章 CPU资源和存储器,2. 变址寄存器(Index Register) 寄存器SI和DI称为变址寄存器,它们可作一般的存储器指针使用。在字符串操作指令的执行过程中,对它们有特定的要求,且具有特殊的功能。,3. 指针寄存器(Pointer Register) 寄存器BP和SP称为指针寄存器,它们主要用于访问堆栈内的存储单元,并且规定: BP为基指针(Base Pointer)寄存器,用它可直接存取堆栈中的数据 SP为堆栈指针(Stack Pointer)寄存器,用它只可访问栈顶。,第2章 CPU资源和存储器,表2.1 通用寄存器的主要用途,第2章 CPU资源和存储器,CS代码段寄存器(Code Segment Register) DS数据段寄存器(Data Segment Register) SS堆栈段寄存器(Stack Segment Register) ES附加段寄存器(Extra Segment Register) FS386CPU增加段寄存器(Extra Segment Register) GS386CPU增加段寄存器(Extra Segment Register),2.1.4 段寄存器的作用,有关寄存器的作用详细描述。,第2章 CPU资源和存储器,1、指令指针寄存器(Instruction Pointer) 指令指针IP和EIP是16位和32位的寄存器,它们分别位于16位和32位处理器之中。指令指针寄存器存放着下次将要执行的指令在代码段的偏移量。 在80386及其高档处理器处于保护模式时,其指令指针寄存器是32位的EIP。 在实方式下,由于每个段的最大范围就是64K,所以,EIP中的高16位肯定都为0,相当于只用其低16位来反映程序中指令的执行次序,这样,EIP低16位与先前CPU中的IP作用相同。,2.1.5 专用寄存器的作用,2、标志寄存器(Flags Register) 有关标志位寄存器的详细描述。,第2章 CPU资源和存储器,1. 存储器的分段 计算机的内存单元是以“字节”为最小单位进行线性编址的。为了标识每个存储单元,就给每个存储单元规定一个编号,此编号就是该存储单元的物理地址。 16位微机把内存空间划分成若干个逻辑段,每个逻辑段的要求如下:,2.2 存储器的管理模式,2.2.1 16位微机的内存管理模式,逻辑段的起始地址(通常简称为:段地址)必须是16的倍数,即最低4位二进制必须全为0; 逻辑段的最大容量为64K,这由16位寄存器的寻址空间所决定。,按上述规定,1M内存最多可分成64K个段,即65536个段(段之间相互重叠),至少可分成16个相互不重叠的段。,第2章 CPU资源和存储器,2. 物理地址的形成方式 存储单元的逻辑地址分为两部分:段地址和偏移量。由逻辑地址得到其物理地址(PAPhysical Address)的计算方法如下: 物理地址PA段地址16 + 偏移量,计算存储单元物理地址的公式可用“左移4位”和“加”运算来实现。 对物理地址来说,当其段地址变化时,只要对其偏移量进行相应的调整就可得到同一个物理地址,所以,同一个物理地址可有多个逻辑地址。,第2章 CPU资源和存储器,3、段寄存器的引用 段寄存器是因为对内存的分段管理而设置的。一般情况下,段寄存器及其指针寄存器的引用关系方面有如下规定:,取指令所用的段寄存器和偏移量一定是用CS和IP; 堆栈操作所用的段寄存器和偏移量一定是SS和SP; 串操作的目标操作数所用的段寄存器和偏移量一定是ES和DI; 其它情况,段寄存器除其默认段寄存器外,还可以强行改变为其它段寄存器。,第2章 CPU资源和存储器,表2.3 段寄存器及其指针寄存器的引用关系,第2章 CPU资源和存储器,1. 存储单元的内容 存储单元中所存放的二进制信息称为该存储单元的内容或值,并且规定:,一个字节的内容是该字节单元内存放的二进制信息; 一个字的内容是该字地址所指向的单元及其后继一个单元的内容拼接而成; 一个双字的内容是该字地址所指向的单元及其后三个单元的内容拼接而成。,在拼接“字内容”时,我们按“高高低低”的原则来处理,即:高存储单元(地址大的存储单元)的值是“字内容”的高8位,低存储单元(地址小的存储单元)的值是“字内容”的低8位。 在拼接“双字内容”时也是如此。,第2章 CPU资源和存储器,下图是一段内存单元存放数据的例子。从图中可看出下列存储结果: 字节12340H、12341H的内容分别为:12H和34H 字12340H、12341H的内容分别为:3412H和5634H 双字12340H、12341H的内容分别为:78563412H和90785634H,第3章 操作数的寻址方式,微机系统有七种基本的寻址方式:立即寻址方式、寄存器寻址方式、直接寻址方式、寄存器间接寻址方式、寄存器相对寻址方式、基址加变址寻址方式、相对基址加变址寻址方式等。其中,后五种寻址方式是确定内存单元有效地址的五种不同的计算方法,用它们可方便地实现对数组元素的访问。 另外,在32位微机系统中,为了扩大对存储单元的寻址能力,增加了一种新的寻址方式32位地址的寻址方式。,第3章 操作数的寻址方式,3.1 立即寻址方式,操作数作为指令的一部分而直接写在指令中,这种操作数称为立即数,这种寻址方式也就称为立即数寻址方式。 立即数可以是8位、16位或32位数,该数值紧跟在操作码之后。如果立即数为16位或32位,那么,它将按“高高低低”的原则进行存储。例如: MOV AH, 80H ADD AX, 1234H MOV ECX, 123456H MOV B1, 12H MOV W1, 3456H ADD D1, 32123456H 其中:B1、W1和D1分别是字节、字和双字单元。 立即数寻址方式通常用于对通用寄存器或内存单元赋初值。,第3章 操作数的寻址方式,下图是指令“MOV AX, 4576H”的存储形式和执行情况示意图。,第3章 操作数的寻址方式,3.2 寄存器寻址方式,指令所要的操作数已存储在某寄存器中,或把目标操作数存入寄存器。把在指令中指出所使用寄存器(即:寄存器的助忆符)的寻址方式称为寄存器寻址方式。 指令中可以引用的寄存器及其符号名称如下: 8位寄存器有:AH、AL、BH、BL、CH、CL、DH和DL等; 16位寄存器有:AX、BX、CX、DX、SI、DI、SP、BP和段寄存器等; 32位寄存器有:EAX、EBX、ECX、EDX、ESI、EDI、ESP和EBP等。 寄存器寻址方式是一种简单快捷的寻址方式,源和目的操作数都可以是寄存器。 由于指令所需的操作数已存储在寄存器中,或操作的结果存入寄存器,这样,在指令执行过程中,会减少读/写存储器单元的次数。 通常情况下,我们提倡应尽可能地使用寄存器寻址方式,但也不要绝对化。,第3章 操作数的寻址方式,3.3 直接寻址方式,指令所要的操作数存放在内存中,在指令中直接给出该操作数的有效地址,这种寻址方式为直接寻址方式。 通常情况下,操作数存放在数据段中,所以,其物理地址将由数据段寄存器DS和指令中给出的有效地址直接形成,但如果使用段超越前缀,那么,操作数可存放在其它段。,第3章 操作数的寻址方式,例3.1 假设有指令:MOV BX, 1234H,在执行时,(DS)=2000H,内存单元21234H的值为5213H。问该指令执行后,BX的值是什么? 解:根据直接寻址方式的寻址规则,把该指令的具体执行过程如下图所示。,第3章 操作数的寻址方式,3.4 寄存器间接寻址方式,操作数在存储器中,操作数的有效地址用SI、DI、BX和BP等四个寄存器之一来指定,称这种寻址方式为寄存器间接寻址方式。 该寻址方式物理地址的计算方法如下:,在不使用段超越前缀的情况下,有下列规定: 若有效地址用SI、DI和BX等之一来指定,则其缺省的段寄存器为DS; 若有效地址用BP来指定,则其缺省的段寄存器为SS(即:堆栈段)。,第3章 操作数的寻址方式,例3.2 假设有指令:MOV BX, DI,在执行时,(DS)=1000H,(DI)=2345H,存储单元12345H的内容是4354H。问执行指令后,BX的值是什么?,解:根据寄存器间接寻址方式的规则,在执行本例指令时,寄存器DI的值不是操作数,而是操作数的地址。该操作数的物理地址应由DS和DI的值形成,即: PA=(DS)*16+(DI)=1000H*16+2345H=12345H。,该指令的执行效果:把从物理地址为12345H开始的一个字的值传送给BX。,第3章 操作数的寻址方式,3.5 寄存器相对寻址方式,操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)或变址寄存器(SI、DI)的内容和指令中的8位/16位偏移量之和。 其有效地址的计算公式如下:,在不使用段超越前缀的情况下,有下列规定: 若有效地址用SI、DI和BX等之一来指定,则其缺省的段寄存器为DS; 若有效地址用BP来指定,则其缺省的段寄存器为SS(即:堆栈段)。,第3章 操作数的寻址方式,例3.3 假设指令:MOV BX, SI+100H,在执行它时,(DS)=1000H,(SI)=2345H,内存单元12445H的内容为2715H,问该指令执行后,BX的值是什么?,解:根据寄存器相对寻址方式的规则,在本指令中的源操作数的有效地址EA为: EA=(SI)+100H=2345H+100H=2445H 该操作数的物理地址应由DS和EA的值形成,即: PA=(DS)*16+EA=1000H*16+2445H=12445H。 该指令的执行效果是:把从物理地址为12445H开始的一个字的值传送给BX。,第3章 操作数的寻址方式,3.6 基址加变址寻址方式,操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)和一个变址寄存器(SI、DI)的内容之和。 其有效地址的计算公式如下:,在不使用段超越前缀的情况下,有下列规定: 若有效地址用SI、DI和BX等之一来指定,则其缺省的段寄存器为DS; 若有效地址用BP来指定,则其缺省的段寄存器为SS(即:堆栈段)。,第3章 操作数的寻址方式,例3.4 假设指令:MOV BX, BX+SI,在执行时,(DS)=1000H,(BX)=2100H,(SI)=0011H,内存单元12111H的内容为1234H。问指令执行后,BX的值是什么?,解:根据基址加变址寻址方式的规则,在本指令的源操作数的有效地址EA为: EA=(BX)+(SI)=2100H+0011H=2111H 该操作数的物理地址应由DS和EA的值形成,即: PA=(DS)*16+EA=1000H*16+2111H=12111H 该指令的执行效果是:把从物理地址为12111H开始的一个字的值传送给BX。,第3章 操作数的寻址方式,3.7 相对基址加变址寻址方式,操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)的值、一个变址寄存器(SI、DI)的值和指令中的8位/16位偏移量之和。 其有效地址的计算公式如下:,在不使用段超越前缀的情况下,有下列规定: 若有效地址用SI、DI和BX等之一来指定,则其缺省的段寄存器为DS; 若有效地址用BP来指定,则其缺省的段寄存器为SS(即:堆栈段)。,第3章 操作数的寻址方式,例3.5 假设指令:MOV AX, BX+SI+200H,在执行时,(DS)=1000H,(BX)= 2100H,(SI)=0010H,内存单元12310H的内容为1234H。问指令执行后,AX的值是什么?,解:根据相对基址加变址寻址方式的规则,本指令中源操作数的有效地址EA为: EA=(BX)+(SI)+200H=2100H+0010H+200H=2310H 该操作数的物理地址应由DS和EA的值形成,即: PA=(DS)*16+EA=1000H*16+2310H=12310H 该指令的执行效果是:把从物理地址为12310H开始的一个字的值传送给AX。,第3章 操作数的寻址方式,相对基址加变址寻址方式有多种等价的书写方式,书写格式: BX+SI+1000H、1000HBX+SI、1000HBXSI和1000HSIBX等格式都是正确的,并且其寻址含义也是一致的, 但格式:BX1000H+SI、SI1000H+BX等是错误的,即所用寄存器不能在”“,”之外,该限制对寄存器相对寻址方式的书写也同样起作用。,第3章 操作数的寻址方式,相对基址加变址寻址方式与其它寻址方式之间的变形关系,第3章 操作数的寻址方式,3.8 32位地址的寻址方式,在32位微机系统中,除了支持前面的七种寻址方式外,又提供了一种更灵活、方便,但也更复杂的内存寻址方式。 用16位寄存器来访问存储单元时,只能使用基地址和变址寄存器来作为地址偏移量的一部分,但在用32位寄存器寻址时,不存在上述限制,所有32位寄存器(EAX、EBX、ECX、EDX、ESI、EDI、EBP和ESP)都可以是地址偏移量的一个组成部分。 当用32位地址偏移量进行寻址时,内存地址的偏移量可分为三部分:一个32位基址寄存器,一个可乘1、2、4或8的32位变址寄存器,一个8位/32位的偏移常量,并且这三部分还可进行任意组合,省去其中之一或之二。 基址寄存器是:EAX、EBX、ECX、EDX、ESI、EDI、EBP和ESP; 变址寄存器是:EAX、EBX、ECX、EDX、ESI、EDI和EBP(除ESP之外)。,第3章 操作数的寻址方式,用32位地址偏移量进行寻址的有效地址计算公式归纳如下:,MOV AX, 123456H MOV EAX, EBX MOV EBX, ECX*2 MOV EBX, EAX+100H MOV EDX, EAX*4+200H MOV EBX, EAX+EDX*2 MOV EBX, EAX+EDX*2+300H MOV AX, ESP,第3章 操作数的寻址方式,由于32位寻址方式能使用所有的通用寄存器,和该有效地址相组合的段寄存器也就有新的规定。具体规定如下:,1、地址中寄存器的书写顺序决定该寄存器是基址寄存器,还是变址寄存器;如:EBX+EBP中的EBX是基址寄存器,EBP是变址寄存器,而EBP+EBX中的EBP是基址寄存器,EBX是变址寄存器; 2、默认段寄存器的选用取决于基址寄存器; 3、基址寄存器是EBP或ESP时,默认段寄存器是SS,否则,默认段寄存器是DS; 4、在指令中,如果使用段前缀的方式,那么,显式段寄存器优先。,第3章 操作数的寻址方式,下面列举几个32位地址寻址指令及其内存操作数的段寄存器。 MOV AX, 123456H ;默认段寄存器DS MOV EAX, EBX+EBP ;默认段寄存器DS MOV EBX, EBP+EBX ;默认段寄存器SS MOV EBX, EAX+100H ;默认段寄存器DS MOV EDX, ES:EAX*4+200H ;显式段寄存器ES MOV ESP+EDX*2, AX ;默认段寄存器SS MOV EBX, GS:EAX+EDX*2+300H ;显式段寄存器GS MOV AX, ESP ;默认段寄存器SS,第4章 标识符和表达式,4.1 标识符,标识符和表达式是程序设计经常用到的两个基本概念。,在汇编语言中,标识符最多由31个字母、数字及规定的特殊字符(?、_、$)等组成,但它不能用数字开头。 标号、内存变量名、子程序名和宏名等都是标识符。通常情况下,汇编语言不区分标识符中字母的大小写。 和高级语言的变量名一样,一般要求标识符尽可能取得有点含义,这会有助于对程序的理解。,第4章 标识符和表达式,标识符不能是汇编语言的保留字,汇编语言的保留字主要是指:指令助忆符、伪指令定义符、寄存器名以及一些具有特殊含义的字符串等。 例如:MSG1、ERRMSG2、ASC1、asc2等是合法的标识符,而1a、ah、mov等就不是标识符。 试比较ABCDH和0ABCDH之间的差异。前者是标识符,而后者是十六进制数值。,第4章 标识符和表达式,4.2 简单内存变量的定义,在高级语言程序中,要给存储单元取一个符号名,然后通过引用该符号名来访问其所对应的存储单元。 在汇编语言程序中要灵活一些,它可以给存储单元取符号名,也可以不取符号名。 当给存储单元取符号名时,则可通过该符号名来访问其对应的存储单元; 当不给存储单元取符号名时,则可通过存储单元的偏移量(有效地址)来访问它。,第4章 标识符和表达式,4.2.1 内存变量定义的一般形式,定义内存变量语句是程序中经常使用的伪指令语句,其一般格式如下: 变量名 数据定义符 表达式1, 表达式2, , 表达式n ;注释 该定义格式的主要解释如下:,变量名必须是一个合法的标识符,它可以写,也可以不写; 数据定义符用于确定内存单元的数据类型,常用定义符有:DB、DW和DD等; 表达式是定义内存单元时的初值表达式,一个定义语句可以有多个初值表达式,各表达式之间必须用逗号分开;如果某个存储单元没有初值表达式,则必须用一个问号?来表示; 在定义语句的后面可以书写注释内容,也可以不写。,第4章 标识符和表达式,在定义变量时,虽然可以不写变量名,但我们建议还是要写,因为不写变量名,就意味着只能用内存单元的偏移量来访问它。 这时,一旦内存单元的偏移量发生变化,那么程序中所有引用都要修改。这不仅增加了程序维护的工作量,而且也容易因遗漏修改而出错。,第4章 标识符和表达式,4.2.2 字节变量,字节变量的定义符为DB/BYTE(Define Byte)(*),每个字节变量只占一个字节单元。 例如:,(*) BYTE是MASM 6.0及其以后版本的数据类型说明符,随后的其它类型说明符同此说明。,COUNTER DB 6 DB A, D, 0Dh, $ TABLE DB 1, 3, 5, 7, 9, 11,COUNTER,TABLE,第4章 标识符和表达式,用定义符DB还可定义一种特殊的数据形式字符串。 在定义字符串时,必须用成对的单引号或双引号把所要的字符括起来,括号内字符的ASCII码将依次存放在相应的字节单元内。例如:,MSG1 DB I am a student.,上面的例子也可改写为另一种等价的语句: MSG1 DB I, , a, m, , a, , s, t, u, d, e, n, t, . 显然,前者要比后者方便得多,所以,在程序中都采用前者的书写方式。,第4章 标识符和表达式,4.2.3 字变量,字变量的定义符为DW/WORD(Define Word),每个字变量占两个连续的字节单元。 例如:,Word1 DW 89H, 1909H, -1 DW 0abcdH, ?, 0,由于字变量的数据是按照“高高低低”的原则存于存储单元之中的,而字节数据是按照排列顺序存于存储单元中的,所以,它们的存储方式有所不同。,第4章 标识符和表达式,试比较下面两个定义的存储顺序。 B1 DB AB W1 DW AB 其中:41H和42H分别是A和B的ASCII码。,第4章 标识符和表达式,4.2.4 双字变量,双字变量的定义符为DD/DWORD (Define Double word),每个双字变量占用二个连续的字单元(四个字节)。 例如:,DD1 DD 12345678H, ? DD2 DD 0abcd1243H 上述定义的内存分配如下所示,双字的内容也是按“高高低低”的原则来存储的。,第4章 标识符和表达式,4.2.5 六字节变量,六字节变量的定义符为DF/FWORD (Define Farword)。每个六字节变量占用六个连续的字节。 例如:,DF1 DF 1234567890abH, 0H, -1 DF 1abcd23H 第一个六字节常量1234567890abH在内存中的分配方式如下所示,它也是按“高高低低”的原则来存储的。其它六字节常量的存储方式与此一致。,第4章 标识符和表达式,4.2.6 八字节变量,八字节变量的定义符为DQ/QWORD(Define Quadword)。每个八字节变量占用八个连续的字节。 例如:,DQ1 DQ 12345678H, 0H, -1234H DQ ?, 1238H, ? 第一个八字节常量12345678H在内存中的分配方式如下所示,其存储原则与前面相同。其它八字节常量的存储方式与此一致。,第4章 标识符和表达式,4.2.7 十字节变量,定义十字节变量的定义符为DT/TBYTE (Define Tenbytes)。每个十字节变量占用十个连续的字节。 例如:,DT1 DT 12345678H, ? DT2 DT ?, -1H 第一个十字节常量12345678H在内存中的分配方式如下所示,它同样按“高高低低”的原则来存储。其它十字节常量的存储方式与此一致。,第4章 标识符和表达式,4.3 调整偏移量伪指令,调整偏移量伪指令是在内存变量定义时用来调整内存变量起始偏移量的,它们是在把源程序汇编成目标文件时起作用。 常用的调整偏移量伪指令有:EVEN、ALIGN和ORG。,4.3.1 偶对齐伪指令EVEN,偶对齐伪指令格式: EVEN 伪指令的作用是:告诉汇编程序(Assember),本伪指令下面的内存变量从下一个偶地址单元开始分配。 如果下一个偏移量是偶地址,那么,该伪指令不起作用;否则,汇编程序将空出一个字节,从下一偶地址开始为其后变量分配内存单元。,第4章 标识符和表达式,假设有下列变量定义,并且变量B1的偏移量是偶数。 B1 DB 12H ;为了表示方便,不妨再假设其偏移量为:xxxx0H W1 DW 4567H,可把前面的变量定义改变成下列形式: B1 DB 12H EVEN W1 DW 4567H,第4章 标识符和表达式,4.3.2 对齐伪指令ALIGN,对齐伪指令格式: ALIGN Num 其中:Num必须是2的幂,如:2、4、8和16等。 伪指令的作用是:告诉汇编程序,本伪指令下面的内存变量必须从下一个能被Num整除的地址开始分配。,如果下一个地址正好能被Num整除,那么,该伪指令不起作用; 否则,汇编程序将空出若干个字节,直到下一个地址能被Num整除为止。,试比较下面二组变量定义,它们的对齐效果一致吗? B1 DB 12H B1 DB 12H EVEN ALIGN 2 W1 DW 4567H W1 DW 4567H,第4章 标识符和表达式,4.3.3 调整偏移量伪指令ORG,调整偏移量伪指令格式: ORG 数值表达式 伪指令的作用是:告诉汇编程序,本伪指令下面的内存变量从该“数值表达式”所指定的偏移量开始分配。,假设有下列变量定义,且变量word1的偏移量为0。 word1 DW 1234h byte1 DB 56h word2 DW 0abcdh ORG 1 byte2 DB ? word3 DW ? byte3 DB ?,第4章 标识符和表达式,4.3.4 偏移量计数器的值,汇编语言提供了一个特殊的符号“$”来引用偏移量计数器的值。 例如: W1 DW $, $ ORG $+3 ;从当前地址开始空3个字节 B1 DB 43h 假设:在给变量W1分配内存单元时,当前偏移量计数 器的值为2。,第4章 标识符和表达式,4.4.1 重复说明符DUP,汇编语言提供了变量的重复说明符DUP,其说明的一般形式如下: count DUP (表达式, 表达式, , 表达式) 解释:count是重复次数,(表达式, 表达式, , 表达式)是被重复的部分,“表达式”可以是存储单元的初值,也可以是含义另一个DUP的式子。如果在表达式的括号中有多个表达式,那么,它们之间要用逗号,分开。 例如:,4.4 复合内存变量的定义,BUFFER DB 100 DUP (?) STRING DB 120 DUP (ABCDE), 0 DATA1 DW 50 DUP (10H, 20 DUP(1,2,3), 20H) POINTS DD 12, 30 DUP (0),第4章 标识符和表达式,4.4.2 结构类型的定义,1、结构类型的定义 用STRUC和ENDS可以把一系列数据定义语句括起来作为一种新的、用户定义的结构类型。其一般说明格式如下: 结构名 STRUC Alignment ,NONUNIQUE 数据定义语句序列 结构名 ENDS 解释:结构名是一个合法的标识符,且具有唯一性。结构名代表整个结构类型,前后两个结构名必须一致。结构内被定义的变量为结构字段,变量名即为字段名。 一个结构中允许含有任意多个字段,各字段的类型和所占字节数也都可任意。如果字段有字段名,则字段名必须唯一。每个字段可独立存取。,第4章 标识符和表达式,对齐方式(Alignment):可用1、2或4来指定结构中字段的字节边界(Byte boundary),其缺省值为1。 NONUNIQUE:要求结构中的字段必须用全名才能访问,见本小节中的“结构类型字段的引用”。,例如: COURSE STRUC NO DD ? CNAME DB Assember SCORE DW 0 COURSE ENDS,NO,CNAME,SCORE,第4章 标识符和表达式,结构中的字段可以有字段名,也可以没有字段名。有字段名的字段可直接用该字段名来访问它,没有字段名的字段可以用该字段在结构中的偏移量来访问。 例如: PEASON STRUC NO DD ? ;偏移量为0 NAME DB 10 dup (?) ;偏移量为4 DB 1 ;偏移量为14 PEASON ENDS 在结构PEASON中,有二个字段有字段名,一个字段没有字段名,但不管有无字段名,我们都可用其偏移量来访问它。,第4章 标识符和表达式,2、结构类型变量的定义 在定义某个结构类型后,程序员就可以说明该结构类型的内存变量。它的说明形式与前面介绍的简单数据类型的变量说明基本上相一致。其说明格式如下: 变量名 结构名 解释:,变量名即为该结构类型的变量名,它可省缺。如果省缺,则不能用符号名来访问该内存单元; 字段值表是给字段赋初值,中间用逗号,分开,其字段值的排列顺序及类型应与该结构说明时各字段相一致; 如果结构变量中某字段用其定义时的缺省值,那么,可用逗号来表示;如果所有字段都如此,则可省去字段值表,但必须保留尖括号“”。,第4章 标识符和表达式,例如: COURSE1 COURSE ;使用缺省的初值 COURSE COURSE3 COURSE ;使用缺省的课程名 PEASON1 PEASON 3、结构类型字段的引用 定义了结构类型的变量后,若要访问其结构中的某字段,则可采用如下形式: 结构变量名.字段名 该引用方式与高级语言的字段引用方式完全一致。 我们还可用偏移量来访问其中的某个字段,但此方法不直观,变动性大,所以,一般情况下,不提倡使用此方法。,第4章 标识符和表达式,例如: EXAM1 STRUC F1 DW ? F2 DB ? EVEN ;偶对齐 F3 DW ? EXAM1 ENDS E1 EXAM1 ;定义EXAM1的一个变量E1 下面二种方法都可把结构变量E1中字段F3的内容赋给寄存器AX,但如果在字段F3之前增加或减少了字段,那么,这些引用需要改变吗? (1)、用字段名直接引用 MOV AX, E1.F3 (2)、用字段的偏移量间接引用 LEA SI, E1 MOV AX, SI+4 ;其中4是字段F3的偏移量,第4章 标识符和表达式,4.4.3 联合类型的定义,联合数据类型是一种特殊的数据类型。它可以实现:以一种数据类型存储数据,以另一种数据类型来读取数据。程序员可以根据不同的需要,以不同的数据类型来读取联合类型中的数据。,1、联合类型的说明 联合数据类型其说明格式如下: 联合类型名 UNION Alignment ,NONUNIQUE 数据定义语句序列 联合类型名 ENDS 联合类型中的各字段相互覆盖,即同样的存储单元被多个不同的字段所对应,并且其每个字段的偏移量都为0。 联合类型所占的字节数是其所有字段所占字节数的最大值。,第4章 标识符和表达式,例如: DATATYPE UNION BB1 DB ? ;一个字节类型的字段 WW1 DW ? ;一个字类型的字段 DD1 DD ? ;一个双字类型的字段 DATATYPE ENDS 在联合类型的最外层定义中,在伪指令UNION和ENDS的前面一定要书写该联合类型名,而在其嵌套定义的内层,伪指令UNION和ENDS之前一定不能写联合类型名。 例如: UNION1 UNION BB DB ? WW DW ? UNION ;联合类型的嵌套定义形式 W1 DW ? B1 DB ? ENDS UNION1 ENDS,第4章 标识符和表达式,2、联合类型变量的定义 联合数据类型的变量只能用第一个字段的数据类型来进行初始化。 例如: U1 DATATYPE ;定义一个联合变量,并初始化其值 U2 DATATYPE ;初始化错误,只能用字节数据来初始化 U3 UNION1 3、联合类型字段的引用 定义了联合类型的变量后,就可根据需要,以不同的数据类型或字段名来存取该联合类型中的数据。引用其字段的具体形式如下: 联合类型变量名.字段名 例如: MOV U3.WW, 1234H ;给联合类型变量赋字数据 MOV AL, U3.BB ;AL=34H MOV BX, U3.WW ;BX=1234H MOV U3.BB, A ;U1的值1241H,41H是A的ASCII码,第4章 标识符和表达式,1、记录类型的说明 汇编语言的记录类型与高级语言的记录类型不同,它是为按二进制位存取数据提供方便的。记录类型的说明要用到另一个保留字RECORD,其说明格式如下: 记录名 RECORD 字段 , 字段, 其中“字段”代表:字段名:宽度=初值表达式,4.4.4 记录类型的定义,第4章 标识符和表达式,解释: 记录名代表该记录类型; 记录类型可以由多个字段组成,每个字段之间要用逗号,分开; 字段的属性包括字段名、宽度和初值; 字段的“宽度”表示该字段所占的二进制位数,它必须是一个常数,并且所有字段的宽度之和不能大于16;如果记录的总宽度大于8,则系统为该记录类型分配二个字节,否则,只分配一个字节; 记录的最后一个字段排在所分配空间的最低位,然后对记录中的字段依次“从右向左”分配二进制位,左边没有分完的二进制位补0; 初值表达式给出的是该字段的缺省值。如果初值超过了该字段的表示范围,那么,在汇编时将产生错误提示信息;如果某字段没有初值表达式,则其初值为0。,第4章 标识符和表达式,例如: COLOR RECORD BLINK:1, BACK:3=0, INTENSE:1=1, FORE:3 FLOAT RECORD DSIGN:1, DATA:8, ESIGN:1, EXP:4,第4章 标识符和表达式,2、记录变量的定义 在程序中,必须先说明记录类型,然后才能定义该记录类型的变量。记录变量是把其二进制位分成一个或多个字段的字节或字变量。其定义格式与其它类型变量的定义方式类似,具体如下: 变量名 记录名 解释:,变量名即为该记录类型的变量名,它可省缺。如果省缺,则不能用符号名来访问该内存单元; 字段值表是给字段赋初值,中间用逗号,分开,其字段值的排列顺序及大小应与该记录说明时各字段相一致; 如果记录变量的某字段用其说明时的缺省值,那么,可用逗号来表示;如果所有字段都如此,则可省去字段值表,但必须保留尖括号“”。,第4章 标识符和表达式,例如: COLOR1 COLOR , , FLOAT FLOAT , 3、记录的专用操作符 操作符WIDTH 操作符WIDTH返回记录或其字段的二进制位数,即其宽度。其一般书写格式如下: WIDTH 记录名 或 WIDTH 记录字段名 假设有前面定义的记录类型COLOR,那么,WIDTH COLOR、WIDTH BACK和WIDTH BLINK的值分别为8、3和1。,第4章 标识符和表达式,操作符MASK 操作符MASK返回一个8位或16位二进制数。在该二进制数中,被指定记录或字段使用的对应位的值为1,否则,其值为0。其一般书写格式如下: MASK 记录名 或 MASK 记录字段名 假设有前面定义的记录类型FLOAT,那么,MASK EXP、MASK DATA和MASK DSIGN的值就分别为000FH、1FE0H和2000H。 记录字段 记录字段名是一个特殊的操作符,它本身也是操作数,其返回值是该字段移到所在记录的最低位所需要的位数,即该字段最低位在记录中的位置。 假设有前面定义的记录类型FLOAT,那么,有: MOV CL, EXP 相当于 MOV CL, 0 MOV CL, DATA 相当于 MOV CL, 5,第4章 标识符和表达式,在有了一些数据类型后,程序员还可定义这些数据类型的别名或指针类型。表达这种定义的伪指令是TYPEDEF,其定义形式如下: 新数据类型名 TYPEDEF 位距 PTR 数据类型 其中:“位距”是NEAR、FAR或PROC等。 例如: CHAR TYPEDEF BYTE ;给BYTE定义另一个别名CHAR PCHAR TYPEDEF PTR CHAR ;定义一个字符指针数据类型PCHAR 有了上述定义之后,下面的变量说明就是合法的。 CH1 CHAR ABCDEF ;定义一个字符串常量 PCH1 PCHAR CH1 ;定义一个指向字符串CH1的变量,4.4.5 数据类型的自定义,第4章 标识符和表达式,标号是一种特殊的标识符,它代表代码段中的某个具体位置,它主要用于表明转移的目标位置。其说明形式如下: 标号: 汇编语言指令 ;注释 解释:标号必须是合法标识符,其后面紧跟一个冒号:,冒号与汇编语言指令之间要有分隔符。分隔符是指空格和TAB字符。一般用分隔符使有关内容对齐为宜。,4.5 标号,第4章 标识符和表达式,变量是一个符号地址,其值会根据其数据类型来对应从该地址以后的若干个存储单元中所存的数值。 标号也是一个符号地址,它所对应的存储单元中存放的是指令代码。它们都是一个符号地址,代表一个存储单元的地址,所以,它们都具有存储单元的属性。除此之外,它们还有各自特殊的属性。,4.6 内存变量和标号的属性,第4章 标识符和表达式,4.6.1 段属性操作符,段属性操作符(SEG)返回该标识符所在段的段地址。我们一般只会取内存变量所在段的段地址,而很少取标号所在段的段地址。 假设有下面变量定义: SCORE DW ? NAME DB 10 DUP(10) ;数据段的变量定义 MOV AX, SEG SCORE ;代码段的指令 MOV BX, SEG NAME 由于SCORE和NAME在同一段中定义,所以,寄存器AX和BX的值是相等的。,第4章 标识符和表达式,4.6.2 偏移量属性操作符,偏移量属性操作符(OFFSET)返回该标识符离它所在段的段地址有多少字节。 假设有下面变量定义: FIRST DD 12345678H, 0 ;数据段的变量定义 SCORE DW ?, 12H NAME DB 10 DUP(10) MOV AX, OFFSET SCORE MOV BX, OFFSET NAME 假设FIRST是数据段的第一个被定义的变量名,它的偏移量为0,SCORE的偏移量为8,因为它要跳过二个双字,其它如此类推。 由于NAME在SCORE之后,且SCORE之后有二个字,占四个字节,所以,BX的值要比AX的值大4。,第4章 标识符和表达式,4.6.3 类型属性操作符,类型属性操作符(TYPE)是返回该变量所占字节数,或标号的“远”(FAR)、

温馨提示

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

评论

0/150

提交评论