微机原理与接口技术-第3章.ppt
3.1概述一、机器语言、汇编语言和高级语言第第3章章汇编语言程序设计汇编语言程序设计 1、机器语言 计算机中指令代码以二进制编码表示,这种代码计算机中指令代码以二进制编码表示,这种代码 机器可以识别与执行,把这种机器代码称为机器语言。机器可以识别与执行,把这种机器代码称为机器语言。用机器语言编写的程序称为机器语言程序(或目的用机器语言编写的程序称为机器语言程序(或目的程序)。程序)。例如例如 下面的机器代码就是下面的机器代码就是8086CPU8086CPU的三条机器指的三条机器指令令 B8H B8H,00H00H,30H30H 4EH 4EH,D8HD8H B9H B9H,14H14H,00H00H 用机器语言书写的程序人们不易看懂,也不易记忆。用机器语言书写的程序人们不易看懂,也不易记忆。看起来非常的乏味。但是计算机却非常熟悉它。看起来非常的乏味。但是计算机却非常熟悉它。2、汇编语言、汇编语言用助记符代替操作码,用符号和数字代替地址码用助记符代替操作码,用符号和数字代替地址码(或操作数),这种语言称为汇编语言。(或操作数),这种语言称为汇编语言。用汇编语言编写的程序称为汇编语言源程序。必用汇编语言编写的程序称为汇编语言源程序。必须经过翻译,转换成机器语言,计算机才能执行。须经过翻译,转换成机器语言,计算机才能执行。汇编语言人们容易记忆,也容易看懂。汇编语言人们容易记忆,也容易看懂。例如例如用用8086CPU的汇编语言可以把上述的机器指令代的汇编语言可以把上述的机器指令代码写成码写成MOVAX,3000H;B8HB8H,00H00H,30H30HMOVDS,AX;4EH4EH,D8HD8HMOVCX,0014H;B9HB9H,14H14H,00H00H3、高级语言高级语言不依赖具体的机器,面向对象的计算机语言称为高级不依赖具体的机器,面向对象的计算机语言称为高级语言。如语言。如BASIC,C,VB,VC等等高级语言易记忆,易懂、便于学习与掌握高级语言易记忆,易懂、便于学习与掌握汇编语言与高级语言的比较汇编语言与高级语言的比较汇编语言汇编语言高级语言高级语言执行速度快,占内存小,执行速度快,占内存小,执行速度慢,占内存大,执行速度慢,占内存大,实施控制方便,通用性差实施控制方便,通用性差通用性好,可移植性强通用性好,可移植性强程序设计效率低,依赖机器程序设计效率低,依赖机器程序设计效率高,不依赖机器程序设计效率高,不依赖机器与硬件打交道方便。与硬件打交道方便。与硬件打交道不方便。与硬件打交道不方便。汇编语言汇编语言q用汇编语言编写的程用汇编语言编写的程序不能由机器直接执序不能由机器直接执行,而必须经汇编程行,而必须经汇编程序翻译成机器语言程序翻译成机器语言程序。序。q汇编过程示意:汇编过程示意:二、汇编程序二、汇编程序1、汇编程序是用来将汇编语言程序、汇编程序是用来将汇编语言程序翻译成机器代码的系统(工具)程序。翻译成机器代码的系统(工具)程序。汇编语言源程序汇编语言源程序汇编语言汇编语言目标程序文件目标程序文件源程序列表源程序列表.ASM.OBJ.LST翻译翻译2、在、在DOS环境下建立和运行汇编语言程序的过程环境下建立和运行汇编语言程序的过程汇编语言程序的执行过程:汇编语言程序的执行过程:编辑程序编辑程序.ASM文件文件汇编程序汇编程序.OBJ文件文件连接程序连接程序.EXE文件文件Edit等等MASMLINK3、汇编程序的种类、汇编程序的种类1.自汇编程序和交叉汇编程序自汇编程序和交叉汇编程序2.基本汇编、小汇编和宏汇编基本汇编、小汇编和宏汇编3.一次扫描和两次扫描的汇编一次扫描和两次扫描的汇编4、8086/8088宏汇编程序宏汇编程序MASM.EXE宏汇编程序宏汇编程序MASM.EXE5.00以及对应的连接程序以及对应的连接程序LINK.EXE三、调试与运行三、调试与运行1、源文件编辑、源文件编辑任何文本编辑器均可用于编辑汇编语言的源程序。例任何文本编辑器均可用于编辑汇编语言的源程序。例如如dos下的下的edit,turboC集成环境的编辑器,集成环境的编辑器,Windows下的记事本、写字板等。下的记事本、写字板等。汇编语言源程序以汇编语言源程序以ASCII码形式存放于内存中,扩展码形式存放于内存中,扩展名应为名应为.ASM,给源文件命名后可存盘,源程序用大写、,给源文件命名后可存盘,源程序用大写、小写皆可。小写皆可。2、源文件汇编、源文件汇编用用Microsoft的宏汇编程序(的宏汇编程序(MASM)任何)任何版本汇编皆可。汇编有下列几种方式版本汇编皆可。汇编有下列几种方式方式方式1:在命令提示符下,键入在命令提示符下,键入MASM 屏幕上会出现如下提示,按照提示键入文件名屏幕上会出现如下提示,按照提示键入文件名回车即可回车即可。Sourcefilename.ASM:xxx Objectfilenamexxx.OBJ:Sourcelistingnul.LST:xxx Crose-referencenul.CRF:xxx+Bytessymbolspacefree0WarnimgErrors0SeversErrors说明:汇编后生成说明:汇编后生成3个文件,即:目标文件(个文件,即:目标文件(.OBJ),),列表文件(列表文件(.LST),交叉引用文件(),交叉引用文件(.CRF)。同时告)。同时告诉程序员汇编有无错误(警告错误和严重错误)。无诉程序员汇编有无错误(警告错误和严重错误)。无错,汇编通过;有错,则修改源程序的错误后,再次错,汇编通过;有错,则修改源程序的错误后,再次汇编。汇编。方式方式2在命令行提示符下键入文件名与逗号和分号在命令行提示符下键入文件名与逗号和分号C:MASMMASMABC;(生成(生成.OBJ文件,不产生文件,不产生.LST和和.CRF)C:MASMMASMABC,;(生成三个文件,名称为(生成三个文件,名称为ABC).OBJ文件中的地址操作数是可浮动的相对地址。文件中的地址操作数是可浮动的相对地址。.LST文件把源程序与机器代码(目的程序)都列表,可打印,文件把源程序与机器代码(目的程序)都列表,可打印,显示。显示。.CRF是用来对符号进行前后对照的文件,可了解源程序中符是用来对符号进行前后对照的文件,可了解源程序中符号(或变量)定义或引用情况。号(或变量)定义或引用情况。3、连接、连接在命令提示符下,键入在命令提示符下,键入LINK,或在或在Windows下用鼠标直下用鼠标直接点击接点击LINK,即可连接。,即可连接。连接时屏幕显示如下:连接时屏幕显示如下:ObjectModules.OBJ:ABC RunFileABC.EXE:ListFileNUL.MAP:ABC Libraries.LIB:(注:注:MASM中没有库文件,可直接键中没有库文件,可直接键入回车)入回车)Link:WarnimgL4201:noStackSegment(其中,(其中,L4201表示连接程序错误信息代码,表示连接程序错误信息代码,4表示警告错误,表示警告错误,201为错误号。源程序中没有堆栈段不影响连接。)为错误号。源程序中没有堆栈段不影响连接。)LINK生成两个文件:生成两个文件:.EXE为可执行文件。为可执行文件。.MAP为内存分配图为内存分配图文件,提供了文件中的内存地址分配的一些信息。文件,提供了文件中的内存地址分配的一些信息。4、调试与运行、调试与运行用用DEBUG与与Codeview软件都可进行目软件都可进行目的代码级程序的调试,对的代码级程序的调试,对.EXE文件可直接调文件可直接调入入DEBUG中跟踪调试。中跟踪调试。有错误需对源程序中的语句进行修改,汇有错误需对源程序中的语句进行修改,汇编中只能发现语法和符号等错误,不能发现编中只能发现语法和符号等错误,不能发现编程中的逻辑错误。编程中的逻辑错误。Codeview窗口调试工具,使用时请参看有窗口调试工具,使用时请参看有关资料。关资料。3.2汇编语言源程序的格式分段结构分段结构汇编语言程序的结构汇编语言程序的结构汇编语言程序也是分段编写的,每段最长汇编语言程序也是分段编写的,每段最长64K。8088汇编语言的源程序是由多个段组成的,汇编语言的源程序是由多个段组成的,一个可一个可执行的汇编程序一般至少有一个代码段,其中包含执行的汇编程序一般至少有一个代码段,其中包含可执行的语句。可执行的语句。例:一个简单的汇编程序例:一个简单的汇编程序05A2001085array1array2DSCSmy_datasegmentagain:Moval,siarray1db05,0a2H,00,10H,85HIncsinequ5Cmpal,50array2dbndup(?)Jbenextmy_dataendsMovdi,almy_codesegmentIncdiassumecs:my_codenext:deccxassumeds:my_datajnzagainbegin:movax,my_datamovah,4chmovds,axint21hLeasi,array1my_codeendsLeadi,array2endbeginMovcx,n3.2.2汇编语言语句的类型和组成汇编语言语句的类型和组成 语句类型语句类型语句类型语句类型指令语句:指令语句:以以8086/8088指令为基本部分,必要时加上标号指令为基本部分,必要时加上标号及注释构成。每一条语句产生相对应的目标代码及注释构成。每一条语句产生相对应的目标代码。伪指令语句:伪指令语句:伪指令语句:伪指令语句:为汇编程序和连接程序提供一些必要控制为汇编程序和连接程序提供一些必要控制为汇编程序和连接程序提供一些必要控制为汇编程序和连接程序提供一些必要控制的管理性语句。汇编时,伪指令的管理性语句。汇编时,伪指令的管理性语句。汇编时,伪指令的管理性语句。汇编时,伪指令不产生目标代码。不产生目标代码。宏指令语句:宏指令语句:宏指令语句:宏指令语句:由标号、宏指令和注释构成。汇编时,将宏指由标号、宏指令和注释构成。汇编时,将宏指由标号、宏指令和注释构成。汇编时,将宏指由标号、宏指令和注释构成。汇编时,将宏指令展开还原为定义时的多条语句,再逐条汇编。令展开还原为定义时的多条语句,再逐条汇编。令展开还原为定义时的多条语句,再逐条汇编。令展开还原为定义时的多条语句,再逐条汇编。1.指令语句及其格式指令语句及其格式指令语句即第二章介绍的指令语句即第二章介绍的8086CPU的指令,每一条指的指令,每一条指令即可构成一指令语句。每一指令都有对应的机器代令即可构成一指令语句。每一指令都有对应的机器代码。码。指令语句格式指令语句格式标号:标号:助记符助记符操作数,操作数,;注释注释格式共有四部分:其中标号,操作数,注释可以是格式共有四部分:其中标号,操作数,注释可以是任选项;助记符是必选项,该项在一条语句中不可省任选项;助记符是必选项,该项在一条语句中不可省略。略。标号后面一定要跟一个冒号;注释前一定加一分号。标号后面一定要跟一个冒号;注释前一定加一分号。2、伪指令语句及其格式、伪指令语句及其格式伪指令语句不是真正的指令语句,它不产生机器代码,伪指令语句不是真正的指令语句,它不产生机器代码,它是汇编程序要求的,用来指示汇编程序做何种操作,它是汇编程序要求的,用来指示汇编程序做何种操作,定义代码段、数据段在何处,是否产生列表等。定义代码段、数据段在何处,是否产生列表等。伪指令语句格式伪指令语句格式名字名字定义符定义符参数,参数,参数,参数;注释注释格式共有四部分:其中名字,参数,注释可以是任格式共有四部分:其中名字,参数,注释可以是任选项;定义符是必选项,该项在一条伪指令语句中不选项;定义符是必选项,该项在一条伪指令语句中不可省略。对于有些语句,名字也是必需的。可省略。对于有些语句,名字也是必需的。名字后面不要跟冒号:注释前一定加一分号;各个名字后面不要跟冒号:注释前一定加一分号;各个参数之间用,分开。参数之间用,分开。3.宏指令语句及其格式宏指令语句及其格式4.宏指令语句:宏指令语句:5.为了书写方便,把一个重复出现的为了书写方便,把一个重复出现的汇编语句序列用一条指令代替,这种重新汇编语句序列用一条指令代替,这种重新定义的指令就称为宏指令。定义的指令就称为宏指令。6.这种由宏指令组成的语句称为宏指这种由宏指令组成的语句称为宏指令语句。令语句。7.宏指令必须先定义,才能被使用,宏指令必须先定义,才能被使用,这称为宏定义;在汇编时,又要把宏指令这称为宏定义;在汇编时,又要把宏指令语句进行宏展开,生成对应的机器代码。语句进行宏展开,生成对应的机器代码。8.宏指令语句格式将在后面应用中介宏指令语句格式将在后面应用中介绍。绍。名字(名字(标识符)标识符)汇编语言语句的四个域,一个语句行的基本格式为:汇编语言语句的四个域,一个语句行的基本格式为:标识符标识符操作符操作符操作数操作数1,操作数,操作数2;注释注释标识符(名字)标识符(名字)标识符(名字)标识符(名字)-标号和名字(变量)标号和名字(变量)标号和名字(变量)标号和名字(变量)标识符可由数字、字母和下划线等一串字符构成,用于一段标识符可由数字、字母和下划线等一串字符构成,用于一段程序、一组(或一个)数据或一个段的开头。使用时要注意以程序、一组(或一个)数据或一个段的开头。使用时要注意以下下3点:点:不能以数字开头,数字可用在非开头的其它位置;不能以数字开头,数字可用在非开头的其它位置;其最大长度为其最大长度为31个字符。个字符。指令语句中的名字(标号)后跟冒号,而伪指令和宏指令的指令语句中的名字(标号)后跟冒号,而伪指令和宏指令的名字之后不跟冒号。名字之后不跟冒号。一一般般说说来来,名名字字项项可可以以是是标标号号或或变变量量。它它们们都都用用来来表表示示本本语语句句的的符符号号地地址址,它它是是可可有有可可无无的的,只只有有当当需需要要用用符符号号地地址址来来访访问问该该语句时它才需要出现。语句时它才需要出现。标标号号:标标号号在在代代码码段段中中定定义义,后后面面跟跟冒冒号号:,它也可以用,它也可以用LABELLABEL或或EQUEQU伪操作来定义。伪操作来定义。此此外外它它还还可可以以作作为为过过程程名名定定义义,这这将将在在以以后后的的章章节节中中加加以以说说明明。标标号号经经常常在在转转移移指指令令或或CALLCALL指指令令的的操操作作数数字字段段出出现现,用用以以表表示示转向地址。转向地址。标号有三种属性:段、偏移及类型。标号有三种属性:段、偏移及类型。标标号号实实际际上上是是用用符符号号表表示示的的地地址址(其其指指令令语语句句的的符号地址)。符号地址)。段段属属性性定定义义标标号号的的段段起起始始地地址址,此此值值必必须须在在一一个个段寄存器中,而标号的段则总是在段寄存器中,而标号的段则总是在CSCS寄存器中。寄存器中。偏偏移移属属性性:标标号号的的偏偏移移地地址址是是1616位位无无符符号号数数,它它代表从段起始地址到定义标号的位置之间的字节数。代表从段起始地址到定义标号的位置之间的字节数。类型属性:类型属性:用来指出该标号是在本段内引用还是用来指出该标号是在本段内引用还是在其它段中引用的。如在段内引用的,则称为在其它段中引用的。如在段内引用的,则称为NEAR,指针长度为,指针长度为2字节;如在段外引用,则称为字节;如在段外引用,则称为FAR,指,指针长度为针长度为4字节。字节。变量:变量:是存放在某些存储单元中是存放在某些存储单元中的操作数,的操作数,变量在除代码段以外的其变量在除代码段以外的其他段中定义,后面不跟冒号。他段中定义,后面不跟冒号。它也可以用它也可以用LABLE或或EQU伪操伪操作来定义。变量经常在操作数字段出作来定义。变量经常在操作数字段出现。现。所有的变量都有一个固定的所有的变量都有一个固定的地址地址(用变量名代表),它由段和偏移地址(用变量名代表),它由段和偏移地址组成;同时还有一个组成;同时还有一个类型类型,变量的类型变量的类型属性定义该变量所保留的字节数。如属性定义该变量所保留的字节数。如BYTEBYTE(1 1个字节长)、个字节长)、WORDWORD(2 2个字节长)、个字节长)、DWORDDWORD(4 4个字节长)、个字节长)、DQDQ(8 8个字节长)、个字节长)、DTDT(1010个字节长),这一点在数据定义个字节长),这一点在数据定义伪操作中说明。伪操作中说明。在程序中同样的标号或变量在程序中同样的标号或变量的定义只允许出现一次,否则汇编的定义只允许出现一次,否则汇编程序会指示出错。程序会指示出错。在程序中,变量可以使用数在程序中,变量可以使用数据定义伪指令进行初始化,见伪指据定义伪指令进行初始化,见伪指令一节中的数据定义部分。令一节中的数据定义部分。操作符操作符可以是指令、伪指令或宏指令的助记符。可以是指令、伪指令或宏指令的助记符。3.3.2.52.5操作数:操作数:操作数:操作数:可以是常数、寄存器名、标号、变量和表达式。可以是常数、寄存器名、标号、变量和表达式。可以是常数、寄存器名、标号、变量和表达式。可以是常数、寄存器名、标号、变量和表达式。1、常数常数可以是二进制、十进制、八进制或十六进制数,也可以是字符串。可以是二进制、十进制、八进制或十六进制数,也可以是字符串。10100101B;二进常数;二进常数256D或或256;十进常数;十进常数356Q或或356O;八进常数;八进常数2AFH;十六进常数;十六进常数0ABCDH;十六进常数,但十六进常数的第一个字符必须是;十六进常数,但十六进常数的第一个字符必须是数字。数字。ABCD;字符串常数,汇编后对应为相应的;字符串常数,汇编后对应为相应的ASCII码:码:41H44H1234;数字字符串常数,字符串需用单引号数字字符串常数,字符串需用单引号,汇编后为汇编后为31H34H2、寄存器寄存器寄存器寄存器8086/8088的寄存器是程序中最常出现的符号,的寄存器是程序中最常出现的符号,它可分为字节寄存器和字寄存器,如它可分为字节寄存器和字寄存器,如AX为字寄存为字寄存器,而器,而AL则为字节寄存器。只有则为字节寄存器。只有AX、BX、CX、DX可分为字和字节寄存器。可分为字和字节寄存器。3.3.标号标号标号标号标标号号实实际际上上是是用用符符号号表表示示的的地地址址(其其指指令令语语句句的的符符号号地地址址),因因此此它它也也是是由由段段、偏偏移移地地址址和和类类型型组组成成,其其类类型型分分为为段段内内(NEAR)和和段段间间(FAR)两种两种。标号实际上是代码段中某一指令的地址,实际上是代码段中某一指令的地址,同样具有三个属性:同样具有三个属性:段地址,偏移量与类段地址,偏移量与类型型。类型有:类型有:FAR与与NEARFAR(可在段间或段内引用)(可在段间或段内引用)NEAR(可在段内引用)(可在段内引用)注意:常量、变量的名字以及标号不能注意:常量、变量的名字以及标号不能用宏汇编中的保留字,用宏汇编中的保留字,即:(指令助记符,即:(指令助记符,CPU的寄存器名,的寄存器名,伪指令的符号等)伪指令的符号等)例如:例如:AAA:MOVAX,DATA;错误,错误,AAA不能不能做标号做标号DAADB?,?;错误,错误,DAA不能做变不能做变量名量名通过通过SEG标号标号OFFSET标号标号可以分别得到可以分别得到标号的段地址标号的段地址和和偏移地址偏移地址。如如果果是是NEAR类类型型,在在程程序序执执行行时时,只只取取标标号号的的偏偏移移地地址址,例例如如在在过过程程调调用用(CALL)时时,只只取取IP,而而对对于于FAR类类型型,则则要要取取段段地地址址和和偏偏移移地地址址,在在CALL时时要要取取IP和和CS。4.4.变量变量变量变量变量是存放在某些存储单元中的操作数,使用有变量是存放在某些存储单元中的操作数,使用有一定意义的符号来代表这些单元。一定意义的符号来代表这些单元。所有的变量都有一个固定的所有的变量都有一个固定的地址地址(用变量名代表)(用变量名代表),它由段和偏移地址组成;同时还有一个,它由段和偏移地址组成;同时还有一个类型类型,它可,它可以是以是字节(字节(BYTE)、字()、字(WORD)或双字)或双字(DWORD)。)。在程序中,变量可以使用数据定义伪指令进行初在程序中,变量可以使用数据定义伪指令进行初始化,见伪指令一节中的数据定义部分。始化,见伪指令一节中的数据定义部分。5、表达式、表达式 表达式是常数、寄存器、标号、变量与表达式是常数、寄存器、标号、变量与一些操作符相组合的序列,可以有数字表达一些操作符相组合的序列,可以有数字表达式和地址表达式两种。在汇编期间,汇编程式和地址表达式两种。在汇编期间,汇编程序按照一定的优先规则对表达式进行计算后序按照一定的优先规则对表达式进行计算后可得到一个数值或一个地址。为了能了解表可得到一个数值或一个地址。为了能了解表达式的组成,我们先介绍一些常用的达式的组成,我们先介绍一些常用的运算运算符。符。运算符包括算术、逻辑、关系、分析、运算符包括算术、逻辑、关系、分析、综合五类运算符。见下表综合五类运算符。见下表表表8086汇编语言中的运算符汇编语言中的运算符算术运算符算术运算符逻辑运算符逻辑运算符关系运算符关系运算符分析运算符分析运算符综合运算符综合运算符+(加法)(加法)AND(与)(与)EQ(相等)(相等)SEG(求段基址)(求段基址)PTR-(减法)(减法)OR(或)(或)NE(不相等)(不相等)OFFSET段属性前缀段属性前缀*(乘法)(乘法)XOR(异或)(异或)LT(小于)(小于)TYPETHIS/(除法)(除法)NOT(非)(非)GT(大于)(大于)SHORTMOD(求余)(求余)LESIZEHIGHSHL(左移)(左移)GELENGTHLOWSHR(右移)(右移)(1)、算术运算符)、算术运算符有有7种:种:+,-,*,/,MOD,SHL,SHR。分别为:加,减,乘,除,模,左移,右移。分别为:加,减,乘,除,模,左移,右移。说明:说明:除法返回的是商,而模返回的是余数除法返回的是商,而模返回的是余数。例如:例如:PIEQU3456/1000;PI=3PIREQU3456MOD1000;PIR=456SHL,SHR是移位运算,一般在建立屏蔽字时使用。是移位运算,一般在建立屏蔽字时使用。例如:例如:MSKEQU00110100BMSK1EQUMSKSHL2;低位补;低位补2个个0,MSK1=11010000BMSK2EQUMSKSHR2;高位补;高位补2个个0,MSK2=00001101B(2)、逻辑运算符)、逻辑运算符有有4种:种:AND,OR,XOR,NOT逻辑运算符和逻辑运算指令的区别:逻辑运算符和逻辑运算指令的区别:逻辑运算符在汇编时完成逻辑运算,逻辑运算指令逻辑运算符在汇编时完成逻辑运算,逻辑运算指令在执行该指令时完成逻辑运算。在执行该指令时完成逻辑运算。例如例如MSKEQU00110101BMOVAL,4EHANDAL,MSKAND0FH汇编时计算出汇编时计算出MSKAND0FH=05,执行第三条指令时执行第三条指令时AL=04H。例:逻辑运算符运用。例:逻辑运算符运用。MOVAX,0F00FHAMD253BH;AX=200BHMOVAC,0F00FHOR253BH;AX=F53FHMOVAC,0F00FHXOR253BH;AX=D534H例例 IN AL IN AL,VALVAL OUT VAL AND OFEH OUT VAL AND OFEH,ALAL 其中其中VAL为端口号,为端口号,OUT指令中的表达式说明指令中的表达式说明当当VAL为偶数时,输出端口号与输入端口号相同,而为偶数时,输出端口号与输入端口号相同,而当当VAL为奇数时,则输出端口号比输入端口号小为奇数时,则输出端口号比输入端口号小1。(3)关系运算符关系运算符包括包括相等相等:EQ大于:大于:GT不等:不等:NE小于或等于:小于或等于:LE小于:小于:LT大于或等于:大于或等于:GE关系运算结果只有两个关系运算结果只有两个真、假。真、假。如果关系是真,则结果为如果关系是真,则结果为0FFH(0FFFFH););如果关系是假,则结果为如果关系是假,则结果为0。例如例如:MOVBX,DATA1LT0010HMOVBX,0FFFFHMOVBX,DATA1LT0010HMOVBX,0当当DATA10010H时时 例例 MOV BX,(VAL LT 5)AND 20)OR MOV BX,(VAL LT 5)AND 20)OR(VAL GE 5VAL GE 5)AND 30AND 30)则当则当VAL5VAL5时,汇编结果应该是:时,汇编结果应该是:MOV BX MOV BX,2020否则,汇编结果应该是:否则,汇编结果应该是:MOVBX,30(4)分析运算符)分析运算符分析运算在汇编语言程序设计中分析运算在汇编语言程序设计中很重要。很重要。存储器地址操作数(变量和标号)具有段、偏移量及类型存储器地址操作数(变量和标号)具有段、偏移量及类型三种属性,分析运算符用来分离出一个存储器地址操作数的这三种属性,分析运算符用来分离出一个存储器地址操作数的这三种属性,并用数值的方法表达出来。三种属性,并用数值的方法表达出来。它包括:它包括:取存储单元偏移取存储单元偏移:OFFSET取存储单元段:取存储单元段:SEG取类型:取类型:TYPE取字节数取字节数:SIZE按类型取长度:按类型取长度:LENGTH求存储器地址操作求存储器地址操作数的三个属性数的三个属性求变量的字节求变量的字节数和长度数和长度SEG与OFFSET分析符 分别返回一个变量或标号的段地址和偏移量地址 OFFSET 格式为:格式为:OFFSET VariableOFFSET Variable或或labellabel 汇编程序将回送变量或标号的偏移地址值。汇编程序将回送变量或标号的偏移地址值。例例 MOV BX MOV BX,OFFSET OPER_ONEOFFSET OPER_ONE 则则汇汇编编程程序序将将OPER_ONEOPER_ONE的的偏偏移移地地址址作作为为立立即即数数回回送送给给指指令令,而而在在执执行行时时则则将将该该偏偏移移地地址址装装入入BXBX寄寄存存器器中。所以这条指令与指令中。所以这条指令与指令 LEA BX LEA BX,OPER_ONEOPER_ONE是等价的。是等价的。SEGSEG 格式为格式为:SEG VariableSEG Variable或或labellabel 汇编程序将回送变量或标号的段地址值。汇编程序将回送变量或标号的段地址值。例例 如如果果DATA_SEGDATA_SEG是是从从存存储储器器的的05000H05000H地地址址开开始始的的一一个个数数据据段段的的段段名名,OPER1OPER1是是该该段段中中的的一一个个变变量量名,则名,则 MOV BX MOV BX,SEG OPER1SEG OPER1 将把将把0500H作为立即数插入指令。实际上由作为立即数插入指令。实际上由于段地址是由连接程序分配的,所以该立即数是于段地址是由连接程序分配的,所以该立即数是连接时插入的。执行期间则使连接时插入的。执行期间则使BX寄存器的内容寄存器的内容成为成为0500H。TYPE分析符分析符返回变量和标号的类型。返回变量和标号的类型。对于变量:对于变量:类型为字节、字、双字变量分别返回类型为字节、字、双字变量分别返回1,2,4。对于标号:对于标号:类型为类型为NEAR的标号返回的标号返回-1(0FFFFH),类型为类型为FAR标号返回标号返回-2(0FFFEH)。例例 ARRAY DW 1 ARRAY DW 1,2 2,3 3则对于指令则对于指令 ADD SI ADD SI,TYPE ARRAYTYPE ARRAY 汇编程序将其形成为:汇编程序将其形成为:ADDSI,2表表存储器操作数的类型值存储器操作数的类型值存储器操作数存储器操作数类型值类型值字节数据(字节数据(DB定义)定义)1字型数据(字型数据(DW定义)定义)2双字数据(双字数据(DD定义)定义)4NEAR指令单元指令单元-1FAR指令单元指令单元-2 LENGTHLENGTH 格式为:格式为:LENGTH VariableLENGTH Variable 对对于于变变量量中中使使用用DUPDUP的的情情况况,汇汇编编程程序序将将回回送送分分配配给给该该变变量量的的单单元元数数。而而对对于于其其他他情情况况则回送则回送1 1。例例 FEES DW 100 DUP FEES DW 100 DUP(0 0)对于指令对于指令MOV CXMOV CX,LENGTH FEESLENGTH FEES 汇编程序将使其形成为:汇编程序将使其形成为:MOVCX,100 例例 ARRAY DW 1 ARRAY DW 1,2 2,3 3对于指令对于指令 MOV CX MOV CX,LENGTH ARRAYLENGTH ARRAY 汇编程序将使其形成为:汇编程序将使其形成为:MOVCX,1 例例 TABLE DB TABLE DB ABCDABCD对于指令对于指令MOV CXMOV CX,LENGTH TABLELENGTH TABLE汇编程序将使其形成为:汇编程序将使其形成为:MOVCX,l SIZESIZE 格式为:格式为:SIZE VariableSIZE Variable 汇汇编编程程序序应应回回送送分分配配给给该该变变量量的的字字节节数数。但但是是,此值是此值是LENGTHLENGTH值和值和TYPETYPE值的乘积。值的乘积。所以:所以:FEES DW 100 DUP FEES DW 100 DUP(0 0)MOV CX MOV CX,SIZE FEESSIZE FEES将形成为将形成为 MOV CX MOV CX,200200对于:对于:ARRAYDW1,2,3 MOV CX MOV CX,SIZE ARRAYSIZE ARRAY将形成为将形成为 MOV CX MOV CX,2 2 而而TABLEDBABCD MOV CX MOV CX,SIZE TABLESIZE TABLE将形成为将形成为MOV CXMOV CX,1 1。LENGTH和和SIZE分析符分析符对于对于DUP定义的变量:定义的变量:LENGTH返回的是分配给该变量的元素的个数;返回的是分配给该变量的元素的个数;SIZE返回的是分配给该变量的元素的字节数。返回的是分配给该变量的元素的字节数。例如:例如:BUFDW100DUP(?)MOVCX,LENGTHBUF;CX=100MOVCX,SIZEBUF;CX=200(1002)对于其他变量,则返回对于其他变量,则返回1(LENGTH),或返回,或返回(类型)(类型)(SIZE)例如例如M1DW1,2,3汇编后形成指令:汇编后形成指令:M2DBABCDMOVBL,LENGTHM1MOVBL,1MOVAL,LENGTHM2MOVAL,1MOVCL,SIZEM1MOVCL,2MOVCH,SIZEM2MOVCH,1例例1:设有数据段中使用设有数据段中使用DATA1DB05H,A2H,0,10H,85H则则MOVAL,DATA1可将可将DATA1中的数传送到中的数传送到AL中,中,(AL)=05HMOVAX,SEGDATA1可将可将DATA1的所在段地址传到的所在段地址传到AX中,(中,(AX)=2000HMOVAX,OFFSETDATA1可将可将DATA1的偏移地址传入的偏移地址传入AX中中,(AX)=1500H例例2:设有数据段中使用设有数据段中使用DATA2DW100DUP(?)定义了定义了100个字单元,则个字单元,则MOVAX,TYPEDATA2;(AX)=2MOVAX,SIZEDATA2;(AX)=200MOVAX,LENGTHDATA2;(AX)=10005A2001085DSCSDATA12000:1500例:分析运算符应用举例例:分析运算符应用举例下面定义的数据段下面定义的数据段DATA,设段基址从,设段基址从40000H开始。开始。DATA SEGMENTV1DB2AH,3FHV2DW2A3FH,3040HV3DD12345678H,12ABCDEFHV4DW20DUP(1)DATA ENDSMOVAX,SEGV1;AX=4000HMOVBX,SEGV2;BX=4000HMOVCX,SEGV3;CX=4000HMOVAX,OFFSETV1;AX=0MOVBX,OFFSETV2;BX=2MOVCX,OFFSETV3;CX=62A3F3F2A403078563412EFCDAB1201000100010040000HV1V2V3V440个个字字节节MOVAX,TYPEV1;AX=1MOVBX,TYPEV2;BX=2MOVCX,TYPEV3;CX=4MOVAX,LENGTHV4;AX=20MOVBX,SIZEV4;BX=40而:而:MOVAH,LENGTHV1;AH=1MOVAL,SIZEV1;AL=1MOVBH,LENGTHV2;BH=1MOVBL,SIZEV2;BL=2MOVCH,LENGTHV3;CH=1MOVCL,SIZEV3;CL=4注:对于形如注:对于形如V1、V2、V3格式定义的变量,运算符格式定义的变量,运算符LENGTH和和SIZE只只对对DB、DW和和DQ定义的多项逗号分开的数据项的第一项有效。定义的多项逗号分开的数据项的第一项有效。注意!上述表达式中运算符的求值的操作不是在程序执行的时候完成,而是在对源程序进行汇编(编译)的时候完成.PTR操作符操作符PTR用于改变变量或标号的原有属性,用于改变变量或标号的原有属性,PTR本身并本身并不分配存储单元,仅给已分配的存储单元赋予新的属性,不分配存储单元,仅给已分配的存储单元赋予新的属性,保证运算时操作数类型的匹配。保证运算时操作数类型的匹配。常与类型常与类型BYTE、WORD、NEAR、FAR连用。连用。格式:格式:类型类型/距离距离PTR变量或标号变量或标号例例1N1DB15H,36HN2DW1122HLOOP:MOVAX,WORDPTRN1;(AX)=3615HMOVBL,BYTEPTRN2;(BL)=22H例例2MOVBYTEPTRBX,10H;(BX)10HMOVWORDPTRBX,10H;(BX)0010H 有时指令要求使用有时指令要求使用PTRPTR操作符。例如用操作符。例如用 MOV MOV BXBX,5 5 指指令令把把立立即即数数存存入入BXBX寄寄存存器器内内容容指指定定的的存存储储单单元元中中,但但汇汇编编程程序序不不能能分分清清是是存存入入字字单单元元还还是是字字节节单单元元,此此时时必必须须用用PTRPTR操操作作符符来来说说明明属属性,应该写明:性,应该写明:MOV BYTE PTRMOV BYTE PTRBXBX,5 5或或MOVWORDPTRBX,5 则语句则语句MOVAL,DATA2;错错而应为:而应为:MOVAL,BYTEPTRDATA205A2001085DSDATA2例:例:DATA1DB05H,A2H,0,10H,85HDATA2EQUWORDPTRDATA1则则DATA2和和DATA1的段基址和偏移的段基址和偏移量均相同,但类型不同,量均相同,但类型不同,DATA1是是BYTE型,而型,而DATA2是是WORD型。型。DATA1THIS 操作符格式为格式为THIS attributeTHIS attribute或或typetype 它可以象它可以象PTRPTR一样建立一个指定类型(一样建立一个指定类型(BYTEBYTE、WORDWORD或或DWORDDWORD)的或指定距离()的或指定距离(NEARNEAR或或FARFAR)的地址操作数。该)的地址操作数。该操作数的段地址和偏移地址与下一个存储单元地址相同。操作数的段地址和偏移地址与下一个存储单元地址