汇编语言程序设计1-4章.ppt

上传人:wuy****n92 文档编号:88526688 上传时间:2023-04-26 格式:PPT 页数:106 大小:765.50KB
返回 下载 相关 举报
汇编语言程序设计1-4章.ppt_第1页
第1页 / 共106页
汇编语言程序设计1-4章.ppt_第2页
第2页 / 共106页
点击查看更多>>
资源描述

《汇编语言程序设计1-4章.ppt》由会员分享,可在线阅读,更多相关《汇编语言程序设计1-4章.ppt(106页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、汇编语言程序设计汇编语言程序设计 吴吴 向向 军军中山大学计算机科学系中山大学计算机科学系第第1章章 预备知识预备知识1.1 汇编语言的由来及其特点汇编语言的由来及其特点1.1.1 机器语言机器语言 机器指令是CPU能直接识别并执行的指令,它的表现形式是二进制编码。机器指令通常由操作码和操作数两部分组成:l操作码指出该指令所要完成的操作,即指令的功能;l操作数指出参与运算的对象,以及运算结果所存放的位置等。机器指令与CPU紧密相关,所以,不同种类的CPU所对应的机器指令也就不同。第第1章章 预备知识预备知识1.1.2 汇编语言汇编语言 用通俗易懂、具有一定含义的符号来代表机器指令,这些符号称为

2、助忆符,用指令助忆符、符号地址等组成的符号指令称为汇编格式指令(或汇编指令)。汇编语言是汇编指令集、伪指令集和使用它们规则的统称。伪指令是在程序设计时所需要的一些辅助性说明指令,它不对应具体的机器指令。用汇编语言编写的程序称为汇编语言程序,或汇编语言源程序,在本教材中简称为源程序。汇编语言程序要比用机器指令编写的程序容易理解和维护。第第1章章 预备知识预备知识1.1.3 汇编程序汇编程序 用汇编语言编写的程序大大提高了程序的可读性,但失去了CPU能直接识别的特性。把汇编语言编写的源程序翻译成CPU能识别的机器指令序列,我们称该翻译程序为汇编程序。图1.1是翻译程序的翻译过程示意图。目前,常用的

3、汇编程序有:MASM、TASM和DEBUG等。图1.1 汇编语言指令到机器指令的示意图第第1章章 预备知识预备知识1.1.4 汇编语言程序的主要特点汇编语言程序的主要特点 汇编语言程序归纳起来大概有以下几个主要特性。u与机器相关性u执行的高效率u编写程序的复杂性u调试的复杂性 现在在调试方面有所改善,CV(CodeView)、TD(Turbo Debug)等软件可在源程序级进行符号跟踪。第第1章章 预备知识预备知识1.1.5 汇编语言的使用领域汇编语言的使用领域 根据应用程序的“可移植性”和“执行效率”来确定是否选用汇编语言。下面简单列举几个领域以示说明,但不要把它们绝对化。1、适用的领域l要

4、求执行效率高、反应快的领域,如:操作系统内核,实时系统等;l系统性能的瓶颈,或频繁被使用子程序或程序段;l与硬件资源密切相关的软件开发,如:设备驱动程序等;l受存储容量限制的应用领域,如:家用电器的计算机控制功能等;2、不宜使用的领域n大型软件的整体开发;n没有特殊要求的一般应用系统的开发等。第第1章章 预备知识预备知识1.2 数据的表示和类型数据的表示和类型1.2.1 数值数据的表示数值数据的表示1、二进制 二进制的表示元素是:0和1。书写时,在数据后面紧跟一个字母B。如:0101B、10101B等。数据的二进制写起来比较长,通常情况下,程序中不直接用二进制来书写具体的数值,而改用八进制、十

5、进制或十六进制。用汇编语言进行程序设计时,程序员可以直接访问内存,对数据在存储器内的表示形式要有清晰的认识。有关“数据表示”的详细内容请参阅计算机组成原理中的章节。第第1章章 预备知识预备知识3、十进制 十进制是我们最熟悉的一种数据表示形式,其基本元素是:0、1、9。书写时,在数据后面紧跟一个字母D。如:1234D、7674D、5411D等。2、八进制 八进制是一种二进制的变形,三位二进制可变为一位八进制,反之也然。八进制的表示元素是:0、1、7。书写时,在数据后面紧跟一个字母Q。如:1234Q、7654Q、54Q等。4、十六进制 十六进制是另一种二进制的变形,四位二进制可变为一位十六进制,反

6、之也然。其基本元素是:09、AF、af,其中:AF依次代表1015。书写时,数据后面紧跟一个字母H。当十六进制数的第一个字符是字母时,在其之前必须添加一个0。如:100H、56EFH、0FFH、0ABCDH等。第第1章章 预备知识预备知识1.2.2 进制在编程环境中的表示进制在编程环境中的表示 程序员在用汇编语言进行程序设计时,需要知道当前环境的数据表示符号。(*)字符Y、O和T是宏汇编MASM系统所增加的进制表示符。进 制字 符例 子二进制 B/Y(*)1010B、1011B 八进制 Q/O 1234Q、311Q 十进制 D/T 1234D、512D 十六进制H1234H、1011H第第1章

7、章 预备知识预备知识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位。通常情况下,存储器按字节编址,读写存储

8、器的最小信息单位就是字节。2、字 由2个字节组成一个字,其最高位是第15位,最低位是第0位。高8位称为高字节,低8位称为低字节。3、双字 用2个字(4个字节)来组成一个双字,其高16位称为高字,低16位称为低字。双字有较大的数据表示范围,它通常是为了满足数据的表示范围而选用的数据类型,也可用于存储远指针。第第1章章 预备知识预备知识4、四字 由4个字(8个字节)组成一个四字类型,它总共有64个二进制位,有更大的数据表示范围,但在汇编语言中很少使用该数据类型。5、十字节 由10个字节组成一个十字节类型,它总共有80个二进制位。在汇编语言中很少使用该数据类型。6、字符串 字符串是由若干个字节组成的

9、,字节数不定,通常每个字节存储一个字符。该数据形式是汇编语言程序中经常使用的一种数据形式。汇编语言中没有C语言中的规定:以ASCII码0为字符串的结束符。第第2章章 CPU资源和存储器资源和存储器 计算机的硬件资源是用汇编语言编程所必须要了解的重要内容,因为汇编语言允许、也需要程序员直接使用这些硬件资源,只有这样才能编写出高效的目标代码。u4个数据寄存器:AX、BX、CX和DX,每个寄存器又可分为2个8位寄存器u2个变址寄存器:DI和SIu2个指针寄存器:SP和BPu4个段寄存器:ES、CS、SS和DSu1个标志寄存器:FLAGu1个指令指针寄存器:IP2.1 寄存器组寄存器组2.1.1 16

10、位寄存器组位寄存器组第第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.数据寄存器 数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和

11、访问存储器的时间。u4个32位寄存器:EAX、EBX、ECX和EDXu4个16位寄存器:AX、BX、CX和DXu8个8位寄存器:AH和AL、BH和BL、CH和CL、DH和DL 每个寄存器都有自己的名称,可独立存取。程序员可利用数据寄存器“能分可合”的特性,灵活地处理双字、字和字节等信息。2.1.3 通用寄存器的作用通用寄存器的作用 第第2章章 CPU资源和存储器资源和存储器2.变址寄存器(Index Register)寄存器SI和DI称为变址寄存器,它们可作一般的存储器指针使用。在字符串操作指令的执行过程中,对它们有特定的要求,且具有特殊的功能。3.指针寄存器(Pointer Register

12、)寄存器BP和SP称为指针寄存器,它们主要用于访问堆栈内的存储单元,并且规定:uBP为基指针(Base Pointer)寄存器,用它可直接存取堆栈中的数据uSP为堆栈指针(Stack Pointer)寄存器,用它只可访问栈顶。第第2章章 CPU资源和存储器资源和存储器表2.1 通用寄存器的主要用途寄存器名称寄存器符号主要用途累加器EAX、AX、AL乘、除、I/O、快速的算术运算,中间结果的缓存基地址寄存器EBX、BX在数据段中作基地址指针计数器ECX、CX、CL循环计数器、重复操作计算器、移位操作计数器数据寄存器EDX、DX字的乘、除运算,间接的输入输出源变址寄存器ESI、SI存储器指针、串指

13、令中的源操作数指针源目标变址寄存器EDI、DI存储器指针、串指令中的目的操作数指针基地址指针EBP、BP存储器指针、存取堆栈的指针栈顶指针ESP、SP堆栈的栈顶指针第第2章章 CPU资源和存储器资源和存储器uCS代码段寄存器(Code Segment Register)uDS数据段寄存器(Data Segment Register)uSS堆栈段寄存器(Stack Segment Register)uES附加段寄存器(Extra Segment Register)uFS386CPU增加段寄存器(Extra Segment Register)uGS386CPU增加段寄存器(Extra Segmen

14、t 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 专

15、用寄存器的作用专用寄存器的作用2、标志寄存器(Flags Register)有关标志位寄存器的详细描述。第第2章章 CPU资源和存储器资源和存储器1.存储器的分段 计算机的内存单元是以“字节”为最小单位进行线性编址的。为了标识每个存储单元,就给每个存储单元规定一个编号,此编号就是该存储单元的物理地址。16位微机把内存空间划分成若干个逻辑段,每个逻辑段的要求如下:2.2 存储器的管理模式存储器的管理模式2.2.1 16位微机的内存管理模式位微机的内存管理模式n逻辑段的起始地址(通常简称为:段地址)必须是16的倍数,即最低4位二进制必须全为0;n逻辑段的最大容量为64K,这由16位寄存器的寻址空间

16、所决定。按上述规定,1M内存最多可分成64K个段,即65536个段(段之间相互重叠),至少可分成16个相互不重叠的段。第第2章章 CPU资源和存储器资源和存储器2.物理地址的形成方式 存储单元的逻辑地址分为两部分:段地址和偏移量。由逻辑地址得到其物理地址(PAPhysical Address)的计算方法如下:物理地址物理地址PA段地址段地址16+偏移量偏移量计算存储单元物理地址的公式可用“左移4位”和“加”运算来实现。对物理地址来说,当其段地址变化时,只要对其偏移量进行相应的调整就可得到同一个物理地址,所以,同一个物理地址可有多个逻辑地址。第第2章章 CPU资源和存储器资源和存储器3、段寄存器

17、的引用 段寄存器是因为对内存的分段管理而设置的。一般情况下,段寄存器及其指针寄存器的引用关系方面有如下规定:u取指令所用的段寄存器和偏移量一定是用CS和IP;u堆栈操作所用的段寄存器和偏移量一定是SS和SP;u串操作的目标操作数所用的段寄存器和偏移量一定是ES和DI;u其它情况,段寄存器除其默认段寄存器外,还可以强行改变为其它段寄存器。第第2章章 CPU资源和存储器资源和存储器表2.3 段寄存器及其指针寄存器的引用关系访问存储器方式缺省的段寄存器可选用的段寄存器偏 移 量取指令CSIP堆栈操作SSSP一般取操作数DSCS、ES、SS有效地址串操作源操作数DSSI目标操作数ESDI使用指针寄存器

18、BPSSCS、DS、ES有效地址第第2章章 CPU资源和存储器资源和存储器1.存储单元的内容 存储单元中所存放的二进制信息称为该存储单元的内容或值,并且规定:u一个字节的内容是该字节单元内存放的二进制信息;u一个字的内容是该字地址所指向的单元及其后继一个单元的内容拼接而成;u一个双字的内容是该字地址所指向的单元及其后三个单元的内容拼接而成。在拼接“字内容”时,我们按“高高低低”的原则来处理,即:高存储单元(地址大的存储单元)的值是“字内容”的高8位,低存储单元(地址小的存储单元)的值是“字内容”的低8位。在拼接“双字内容”时也是如此。第第2章章 CPU资源和存储器资源和存储器 下图是一段内存单

19、元存放数据的例子。从图中可看出下列存储结果:l字节12340H、12341H的内容分别为:12H和34Hl字12340H、12341H的内容分别为:3412H和5634Hl双字12340H、12341H的内容分别为:78563412H和90785634H第第3章章 操作数的寻址方式操作数的寻址方式 微机系统有七种基本的寻址方式:立即寻址方式、寄存器寻址方式、直接寻址方式、寄存器间接寻址方式、寄存器相对寻址方式、基址加变址寻址方式、相对基址加变址寻址方式等。其中,后五种寻址方式是确定内存单元有效地址的五种不同的计算方法,用它们可方便地实现对数组元素的访问。另外,在32位微机系统中,为了扩大对存储

20、单元的寻址能力,增加了一种新的寻址方式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分别是字节、字和双字单元。立即数寻址方式通常用

21、于对通用寄存器或内存单元赋初值。第第3章章 操作数的寻址方式操作数的寻址方式 下图是指令“MOV AX,4576H”的存储形式和执行情况示意图。第第3章章 操作数的寻址方式操作数的寻址方式3.2 寄存器寻址方式寄存器寻址方式 指令所要的操作数已存储在某寄存器中,或把目标操作数存入寄存器。把在指令中指出所使用寄存器(即:寄存器的助忆符)的寻址方式称为寄存器寻址方式。指令中可以引用的寄存器及其符号名称如下:u8位寄存器有:AH、AL、BH、BL、CH、CL、DH和DL等;u16位寄存器有:AX、BX、CX、DX、SI、DI、SP、BP和段寄存器等;u32位寄存器有:EAX、EBX、ECX、EDX、

22、ESI、EDI、ESP和EBP等。寄存器寻址方式是一种简单快捷的寻址方式,源和目的操作数都可以是寄存器。由于指令所需的操作数已存储在寄存器中,或操作的结果存入寄存器,这样,在指令执行过程中,会减少读/写存储器单元的次数。通常情况下,我们提倡应尽可能地使用寄存器寻址方式,但也不要绝对化。第第3章章 操作数的寻址方式操作数的寻址方式3.3 直接寻址方式直接寻址方式 指令所要的操作数存放在内存中,在指令中直接给出该操作数的有效地址,这种寻址方式为直接寻址方式。通常情况下,操作数存放在数据段中,所以,其物理地址将由数据段寄存器DS和指令中给出的有效地址直接形成,但如果使用段超越前缀,那么,操作数可存放

23、在其它段。第第3章章 操作数的寻址方式操作数的寻址方式例3.1 假设有指令:MOV BX,1234H,在执行时,(DS)=2000H,内存单元21234H的值为5213H。问该指令执行后,BX的值是什么?解:根据直接寻址方式的寻址规则,把该指令的具体执行过程如下图所示。第第3章章 操作数的寻址方式操作数的寻址方式3.4 寄存器间接寻址方式寄存器间接寻址方式 操作数在存储器中,操作数的有效地址用SI、DI、BX和BP等四个寄存器之一来指定,称这种寻址方式为寄存器间接寻址方式。该寻址方式物理地址的计算方法如下:在不使用段超越前缀的情况下,有下列规定:u若有效地址用SI、DI和BX等之一来指定,则其

24、缺省的段寄存器为DS;u若有效地址用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章章

25、操作数的寻址方式操作数的寻址方式3.5 寄存器相对寻址方式寄存器相对寻址方式 操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)或变址寄存器(SI、DI)的内容和指令中的8位/16位偏移量之和。其有效地址的计算公式如下:在不使用段超越前缀的情况下,有下列规定:u若有效地址用SI、DI和BX等之一来指定,则其缺省的段寄存器为DS;u若有效地址用BP来指定,则其缺省的段寄存器为SS(即:堆栈段)。第第3章章 操作数的寻址方式操作数的寻址方式例 3.3 假 设 指 令:MOV BX,SI+100H,在 执 行 它 时,(DS)=1000H,(SI)=2345H,内存单元12445H的内容为2

26、715H,问该指令执行后,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)的内容之和。其有效地址的计算公式如下:在不使用段超越前缀

27、的情况下,有下列规定:u若有效地址用SI、DI和BX等之一来指定,则其缺省的段寄存器为DS;u若有效地址用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=

28、1000H*16+2111H=12111H 该指令的执行效果是:把从物理地址为12111H开始的一个字的值传送给BX。第第3章章 操作数的寻址方式操作数的寻址方式3.7 相对基址加变址寻址方式相对基址加变址寻址方式 操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)的值、一个变址寄存器(SI、DI)的值和指令中的8位/16位偏移量之和。其有效地址的计算公式如下:在不使用段超越前缀的情况下,有下列规定:u若有效地址用SI、DI和BX等之一来指定,则其缺省的段寄存器为DS;u若有效地址用BP来指定,则其缺省的段寄存器为SS(即:堆栈段)。第第3章章 操作数的寻址方式操作数的寻址方式例3.5

29、 假设指令: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章章 操作数的寻址方式操作数的寻址方式 相对基址加变址

30、寻址方式有多种等价的书写方式,书写格式:BX+SI+1000H、1000HBX+SI、1000HBXSI和1000HSIBX等格式都是正确的,并且其寻址含义也是一致的,但格式:BX1000H+SI、SI1000H+BX等是错误的,即所用寄存器不能在”“,”之外,该限制对寄存器相对寻址方式的书写也同样起作用。第第3章章 操作数的寻址方式操作数的寻址方式相对基址加变址寻址方式与其它寻址方式之间的变形关系源操作数指令的变形源操作数的寻址方式只有一个偏移量MOV AX,100H直接寻址方式只有一个寄存器MOV AX,BX 或MOV AX,SI寄存器间接寻址方式有一个寄存器和偏移量MOV AX,BX+1

31、00H 或MOV AX,SI+100H寄存器相对寻址方式有二个寄存器MOV AX,BX+SI基址加变址寻址方式有二个寄存器和常数项MOV AX,BX+SI+100H相对基址加变址寻址方式第第3章章 操作数的寻址方式操作数的寻址方式3.8 32位地址的寻址方式位地址的寻址方式 在32位微机系统中,除了支持前面的七种寻址方式外,又提供了一种更灵活、方便,但也更复杂的内存寻址方式。用16位寄存器来访问存储单元时,只能使用基地址和变址寄存器来作为地址偏移量的一部分,但在用32位寄存器寻址时,不存在上述限制,所有32位寄存器(EAX、EBX、ECX、EDX、ESI、EDI、EBP和ESP)都可以是地址偏

32、移量的一个组成部分。当用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,123456HMOV EAX,EBXMOV EBX,ECX*2MOV EBX,EAX+100HMO

33、V EDX,EAX*4+200HMOV EBX,EAX+EDX*2MOV EBX,EAX+EDX*2+300HMOV AX,ESP第第3章章 操作数的寻址方式操作数的寻址方式 由于32位寻址方式能使用所有的通用寄存器,和该有效地址相组合的段寄存器也就有新的规定。具体规定如下:1、地址中寄存器的书写顺序决定该寄存器是基址寄存器,还是变址寄存器;如:EBX+EBP中的EBX是基址寄存器,EBP是变址寄存器,而EBP+EBX中的EBP是基址寄存器,EBX是变址寄存器;2、默认段寄存器的选用取决于基址寄存器;3、基址寄存器是EBP或ESP时,默认段寄存器是SS,否则,默认段寄存器是DS;4、在指令中,

34、如果使用段前缀的方式,那么,显式段寄存器优先。第第3章章 操作数的寻址方式操作数的寻址方式下面列举几个32位地址寻址指令及其内存操作数的段寄存器。MOV AX,123456H;默认段寄存器DSMOV EAX,EBX+EBP;默认段寄存器DSMOV EBX,EBP+EBX;默认段寄存器SSMOV EBX,EAX+100H;默认段寄存器DSMOV EDX,ES:EAX*4+200H;显式段寄存器ESMOV ESP+EDX*2,AX;默认段寄存器SSMOV EBX,GS:EAX+EDX*2+300H;显式段寄存器GSMOV AX,ESP;默认段寄存器SS第第4章章 标识符和表达式标识符和表达式4.1

35、 标识符标识符 标识符和表达式是程序设计经常用到的两个基本概念。在汇编语言中,标识符最多由31个字母、数字及规定的特殊字符(?、_、$)等组成,但它不能用数字开头。标号、内存变量名、子程序名和宏名等都是标识符。通常情况下,汇编语言不区分标识符中字母的大小写。和高级语言的变量名一样,一般要求标识符尽可能取得有点含义,这会有助于对程序的理解。第第4章章 标识符和表达式标识符和表达式 标识符不能是汇编语言的保留字,汇编语言的保留字主要是指:指令助忆符、伪指令定义符、寄存器名以及一些具有特殊含义的字符串等。例如:MSG1、ERRMSG2、ASC1、asc2等是合法的标识符,而1a、ah、mov等就不是

36、标识符。试比较ABCDH和0ABCDH之间的差异。前者是标识符,而后者是十六进制数值。第第4章章 标识符和表达式标识符和表达式4.2 简单内存变量的定义简单内存变量的定义 在高级语言程序中,要给存储单元取一个符号名,然后通过引用该符号名来访问其所对应的存储单元。在汇编语言程序中要灵活一些,它可以给存储单元取符号名,也可以不取符号名。当给存储单元取符号名时,则可通过该符号名来访问其对应的存储单元;当不给存储单元取符号名时,则可通过存储单元的偏移量(有效地址)来访问它。第第4章章 标识符和表达式标识符和表达式4.2.1 内存变量定义的一般形式内存变量定义的一般形式 定义内存变量语句是程序中经常使用

37、的伪指令语句,其一般格式如下:变量名 数据定义符 表达式1,表达式2,表达式n;注释 该定义格式的主要解释如下:u变量名必须是一个合法的标识符,它可以写,也可以不写;u数据定义符用于确定内存单元的数据类型,常用定义符有:DB、DW和DD等;u表达式是定义内存单元时的初值表达式,一个定义语句可以有多个初值表达式,各表达式之间必须用逗号分开;如果某个存储单元没有初值表达式,则必须用一个问号?来表示;u在定义语句的后面可以书写注释内容,也可以不写。第第4章章 标识符和表达式标识符和表达式 在定义变量时,虽然可以不写变量名,但我们建议还是要写,因为不写变量名,就意味着只能用内存单元的偏移量来访问它。这

38、时,一旦内存单元的偏移量发生变化,那么程序中所有引用都要修改。这不仅增加了程序维护的工作量,而且也容易因遗漏修改而出错。第第4章章 标识符和表达式标识符和表达式4.2.2 字节变量字节变量 字节变量的定义符为DB/BYTE(Define Byte)(*),每个字节变量只占一个字节单元。例如:(*)BYTE是MASM 6.0及其以后版本的数据类型说明符,随后的其它类型说明符同此说明。COUNTERDB 6DB A,D,0Dh,$TABLEDB 1,3,5,7,9,110641440D2401030507090BCOUNTERTABLE第第4章章 标识符和表达式标识符和表达式 用定义符DB还可定义

39、一种特殊的数据形式字符串。在定义字符串时,必须用成对的单引号或双引号把所要的字符括起来,括号内字符的ASCII码将依次存放在相应的字节单元内。例如:MSG1 DB I am a student.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),每个字变量占两个连续的字节单元。例如:Word1DW 89H,1909H,-1DW 0a

40、bcdH,?,089000919FFFFCDAB-0000 由于字变量的数据是按照“高高低低”的原则存于存储单元之中的,而字节数据是按照排列顺序存于存储单元中的,所以,它们的存储方式有所不同。第第4章章 标识符和表达式标识符和表达式 试比较下面两个定义的存储顺序。B1 DB ABW1 DW AB其中:41H和42H分别是A和B的ASCII码。41424241第第4章章 标识符和表达式标识符和表达式4.2.4 双字变量双字变量双字变量的定义符为DD/DWORD(Define Double word),每个双字变量占用二个连续的字单元(四个字节)。例如:DD1 DD 12345678H,?DD2

41、DD 0abcd1243H 上述定义的内存分配如下所示,双字的内容也是按“高高低低”的原则来存储的。78563412-4312CDAB第第4章章 标识符和表达式标识符和表达式4.2.5 六字节变量六字节变量六字节变量的定义符为DF/FWORD(Define Farword)。每个六字节变量占用六个连续的字节。例如:DF1 DF 1234567890abH,0H,-1 DF 1abcd23H 第一个六字节常量1234567890abH在内存中的分配方式如下所示,它也是按“高高低低”的原则来存储的。其它六字节常量的存储方式与此一致。ab9078563412第第4章章 标识符和表达式标识符和表达式4

42、.2.6 八字节变量八字节变量八字节变量的定义符为DQ/QWORD(Define Quadword)。每个八字节变量占用八个连续的字节。例如:DQ1 DQ 12345678H,0H,-1234H DQ?,1238H,?第一个八字节常量12345678H在内存中的分配方式如下所示,其存储原则与前面相同。其它八字节常量的存储方式与此一致。7856341200000000第第4章章 标识符和表达式标识符和表达式4.2.7 十字节变量十字节变量定义十字节变量的定义符为DT/TBYTE(Define Tenbytes)。每个十字节变量占用十个连续的字节。例如:DT1 DT 12345678H,?DT2

43、DT?,-1H 第一个十字节常量12345678H在内存中的分配方式如下所示,它同样按“高高低低”的原则来存储。其它十字节常量的存储方式与此一致。78563412000000000000第第4章章 标识符和表达式标识符和表达式4.3 调整偏移量伪指令调整偏移量伪指令 调整偏移量伪指令是在内存变量定义时用来调整内存变量起始偏移量的,它们是在把源程序汇编成目标文件时起作用。常用的调整偏移量伪指令有:EVEN、ALIGN和ORG。4.3.1 偶对齐伪指令偶对齐伪指令EVEN 偶对齐伪指令格式:EVEN 伪指令的作用是:告诉汇编程序(Assember),本伪指令下面的内存变量从下一个偶地址单元开始分配

44、。如果下一个偏移量是偶地址,那么,该伪指令不起作用;否则,汇编程序将空出一个字节,从下一偶地址开始为其后变量分配内存单元。第第4章章 标识符和表达式标识符和表达式 假设有下列变量定义,并且变量B1的偏移量是偶数。B1 DB 12H;为了表示方便,不妨再假设其偏移量为:xxxx0HW1 DW 4567H 可把前面的变量定义改变成下列形式:B1 DB 12H EVENW1 DW 4567H第第4章章 标识符和表达式标识符和表达式4.3.2 对齐伪指令对齐伪指令ALIGN 对齐伪指令格式:ALIGN Num其中:Num必须是2的幂,如:2、4、8和16等。伪指令的作用是:告诉汇编程序,本伪指令下面的

45、内存变量必须从下一个能被Num整除的地址开始分配。u如果下一个地址正好能被Num整除,那么,该伪指令不起作用;u否则,汇编程序将空出若干个字节,直到下一个地址能被Num整除为止。试比较下面二组变量定义,它们的对齐效果一致吗?B1 DB 12HB1 DB 12H EVEN ALIGN 2W1 DW 4567HW1 DW 4567H第第4章章 标识符和表达式标识符和表达式4.3.3 调整偏移量伪指令调整偏移量伪指令ORG 调整偏移量伪指令格式:ORG 数值表达式 伪指令的作用是:告诉汇编程序,本伪指令下面的内存变量从该“数值表达式”所指定的偏移量开始分配。假设有下列变量定义,且变量word1的偏移

46、量为0。word1DW 1234hbyte1DB 56hword2DW 0abcdhORG 1byte2DB?word3DW?byte3DB?第第4章章 标识符和表达式标识符和表达式4.3.4 偏移量计数器的值偏移量计数器的值 汇编语言提供了一个特殊的符号“$”来引用偏移量计数器的值。例如:W1 DW$,$ORG$+3;从当前地址开始空3个字节B1 DB 43h 假设:在给变量W1分配内存单元时,当前偏移量计数器的值为2。第第4章章 标识符和表达式标识符和表达式4.4.1 重复说明符重复说明符DUP 汇编语言提供了变量的重复说明符DUP,其说明的一般形式如下:count DUP (表达式,表达

47、式,表达式)解释:count是重复次数,(表达式,表达式,表达式)是被重复的部分,“表达式”可以是存储单元的初值,也可以是含义另一个DUP的式子。如果在表达式的括号中有多个表达式,那么,它们之间要用逗号,分开。例如:4.4 复合内存变量的定义复合内存变量的定义BUFFER DB 100 DUP(?)STRING DB 120 DUP(ABCDE),0DATA1 DW 50 DUP(10H,20 DUP(1,2,3),20H)POINTS DD 12,30 DUP(0)第第4章章 标识符和表达式标识符和表达式4.4.2 结构类型的定义结构类型的定义1、结构类型的定义 用STRUC和ENDS可以把

48、一系列数据定义语句括起来作为一种新的、用户定义的结构类型。其一般说明格式如下:结构名STRUC Alignment,NONUNIQUE数据定义语句序列结构名ENDS 解释:结构名是一个合法的标识符,且具有唯一性。结构名代表整个结构类型,前后两个结构名必须一致。结构内被定义的变量为结构字段,变量名即为字段名。一个结构中允许含有任意多个字段,各字段的类型和所占字节数也都可任意。如果字段有字段名,则字段名必须唯一。每个字段可独立存取。第第4章章 标识符和表达式标识符和表达式u对齐方式(Alignment):可用1、2或4来指定结构中字段的字节边界(Byte boundary),其缺省值为1。uNON

49、UNIQUE:要求结构中的字段必须用全名才能访问,见本小节中的“结构类型字段的引用”。例如:COURSE STRUC NO DD?CNAME DB Assember SCORE DW 0COURSE ENDSAssemberNOCNAMESCORE 第第4章章 标识符和表达式标识符和表达式 结构中的字段可以有字段名,也可以没有字段名。有字段名的字段可直接用该字段名来访问它,没有字段名的字段可以用该字段在结构中的偏移量来访问。例如:PEASON STRUC NO DD?;偏移量为0 NAME DB 10 dup(?);偏移量为4 DB 1;偏移量为14PEASON ENDS 在结构PEASON中

50、,有二个字段有字段名,一个字段没有字段名,但不管有无字段名,我们都可用其偏移量来访问它。第第4章章 标识符和表达式标识符和表达式2、结构类型变量的定义 在定义某个结构类型后,程序员就可以说明该结构类型的内存变量。它的说明形式与前面介绍的简单数据类型的变量说明基本上相一致。其说明格式如下:变量名 结构名 解释:u变量名即为该结构类型的变量名,它可省缺。如果省缺,则不能用符号名来访问该内存单元;u字段值表是给字段赋初值,中间用逗号,分开,其字段值的排列顺序及类型应与该结构说明时各字段相一致;u如果结构变量中某字段用其定义时的缺省值,那么,可用逗号来表示;如果所有字段都如此,则可省去字段值表,但必须

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

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

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

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