资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,汇编语言的基本语法,1.1.,汇编语言源程序的格式,DATA SEGMENT AT 2000H,ARRAY DB a1,,,a2,,,a3,,,a10,(,a1,a10,为立即数),COUNT EQU $ - ARRAY,SUM DW ?,DATA ENDS,STACK SEGMENT PARA STACK STACK,STAK DB 10 DUP (?),TOP EQU LENGTH STAK,STACKENDS,CODE SEGMENT,ASSUME CS:CODE, DS:DATA, SS:STACK,START: MOV AX,DATA,MOV DS,AX,MOV AX,0,MOV DI,OFFSET SUM,MOV BX,OFFSET ARRAY,MOV CX,COUNT,LOP: ADD AL,BX,ADC AH,0,INC BX,LOOP LOP,MOV DI,AX,MOV AH,4CH,INT 21H,CODE ENDS,END START,汇编语言源程序格式的特点是,:,1 .,分段结构,2 .,语句行,汇编语言程序的语句有两类:,( 1 ),指令性语句,( 2 ),指示性语句,汇编语言源程序语句的格式,汇编语言源程序中的每个语句可以由四项组成,格式如下:,名字,操作 操作数, ;,注释,其中:名字项是指一个标号或变量。操作项是一个操作码的助记符,它可以是指令、伪指令或宏指令名。,操作数项由一个或多个表达式组成,它提供为执行所要求的操作而需要的信息。操作数项可以是常数、寄存器、标号、变量或由表达式组成。注释项用来说明程序或语句的功能。,;,为识别注释项的开始。,;,也可以从一行的第一个字符开始,此时整行都是注释,常用来说明下面一段程序的功能。,上面四项中带方括号的两项是可选项。各项之间必须用,空格,(,space,),或,水平制表,(,Tab,),符隔开。(,1,) 名字项(,2,) 操作项(,3,) 操作数项(,4,) 注释项,(,1,) 名字项,源程序中用下列字符来表示名字:字母,A,Z,数字,0,9,专用字符 ?、,、,、,-,、除数字外,所有字符都可以放在源语句的第一个位置。名字中如果用到,则必须是第一个字符。可以用很多字符来说明名字,但只有前面的,31,个字符能被汇编程序所识别。,一般说来,名字项可以是标号或变量。,它们都用来表示本语句的符号地址,,都是可有可无的,,只有当需要用符号地址来访问该语句时它才需要出现。,标号:标号在代码段中定义,后面跟着冒号:,此外,它还可以作为过程名定义。,变量:变量在数据段或附加数据段中定义,后面不跟冒号。 变量经常在操作数字段出现。,(,2,)操作项,操作项可以是指令、伪指令或宏指令的助记符。对于指令,汇编程序将其翻译为机器语言指令。对于伪指令,汇编程序将根据其所要求的功能进行处理。对于宏指令,则将根据其定义展开。,(,3,) 操作数项,操作数项由一个或多个表达式组成,多个操作数项之间一般用逗号分开。对于指令,操作数项一般给出操作数地址,它们可能有一个,或二个,或三个,或一个也没有。对于伪操作或宏指令,则给出它们所要求的参数。操作数项可以是常数、寄存器、标号、变量或由表达式组成。,(,4,) 注释项,注释项用来说明一段程序、一条或几条指令的功能。对于汇编语言程序来说,注释项的作用是很明显的,它可以使程序容易被读懂,因此汇编语言程序必须写好注释。注释应该写出本条(或本段)指令在程序中的功能和作用,而不应该只写指令的动作。读者在有机会阅读程序例子时,应注意学习注释的写法,在编制程序时,更应学会写好注释。,指令性语句,格式为:,标号,: 操作码,操作数, ,; 注释,带方括号的为任选项,,标号是指令的符号地址,,操作码和操作数是用汇编语言指令表示的指令部分,,,注释是对该语句在本程序中的功能的说明。,指示性语句,格式为:,名字,/,变量,命令,参数, ,; 注释,命令指示汇编程序进行某种汇编操作,,,参数是有关的数据,,名字是段名、符号名等标识符,变量用变量名表示。,常量、标识符和表达式,一、常量,其值在程序中不能改变的量,在汇编语言源程序中的常量有:,数字常量、字符常量和符号常量,( 1 ),数字常量可以是二进制数、八进制数、十进制数或十六进制数表示,( 2 ),字符常量是用单引号 括起来的,ASCII,字符,,其值是该字符的,ASCII,代码值,( 3 ),符号常量是用标识符定义的常量。,例如,采用符号定义语句,PORTA EQU 80H,,,则指令,MOV AL,,,PORTA,与指令,MOV AL,,,80H,等价。,二、标识符,在编程时建立的有特定意义的字符序列,标识符可用作符号常量、名字、变量和标号等。,组成标识符有如下规定:,( 1 ),组成标识符的字符有:,英文大写字母:,AZ,;,英文小写字母:,a-z,;,数字,09,;,字符,?,、,、,_,、,$,;,( 2 ),字符长度不超过,3l,个;,( 3 ),首字符不能是数字;,( 4 ) ?,不能单独作为一个标识符;,( 5 ),不能把保留字用作标识符,保留字包括助记符、寄存器名等。,三、表达式,表达式是常数、标号、变量与一些操作符相组合的序列,可以有数字表达式和地址表达式两种。在汇编期间,汇编程序按照一定的优先规则对表达式进行计算后可得到一个数值或一个地址。常用的表达式操作符介绍如下:,(,1,) 算术操作符 算术操作符有,+,、,-,、*、,/,和,MOD,。,MOD,是指除法运算后得到的余数,如,19/7,的商是,2,,而,19 MOD 7,则为,5,(余数)。,算术操作符可以用于数字表达式或地址表达式中,但当它用于地址表达式时,只有当其结果有明确的物理意义时才是有效的结果。例如两个地址相乘或相除是无意义的。在地址表达式中,可以使用,+,或,-,,但也必须注意其物理意义。,例如把两个不同段的地址相加也是无意义的。经常使用的是地址,数字量,它是有意义的。例如,SUM +1,是指,SUM,字节单元的下一个字节单元的地址(注意:不是指,SUM,单元的内容加,1,),而,SUM-1,则是指,SUM,字节单元的前一个字节单元的地址。例: 如果要求把首地址为,BLOCK,的字数组的第,6,个字传送到,DX,寄存器,可用指令如下:,MOV,DX, BLOCK+ (6-1) * 2,例: 如数组,ARRAY,定义如下,写出把数组长度(字数)存入,CX,寄存器的指令。,ARRAY,DW 1, 2, 3, 4, 5, 6, 7,ARYEND,DW ?,其中,ARYEND,是为计算数组长度而建立的符号地址,所需指令如下:,MOV,CX, (ARYEND-ARRAY)/2,汇编程序在汇编期间将计算出表达式的值而形成指令:,MOV,CX, 7,(,2,) 逻辑操作符,逻辑操作符有:,AND,(,与)、,OR,(,或)、,XOR,(,异或)、,NOT,(,非)。逻辑操作符都是按位操作的,只能用于数字表达式中。逻辑操作符要求,汇编程序对其前后两个操作数(或表达式)作指定的逻辑操作,。,例:,OUT PORT_VAL AND 0FEH, AL,上例中,PORT_VAL,为端口号,,OUT,指令中的表达式说明只为偶数号端口输出数据。,(,3,) 关系操作符关系操作符有:,EQ,(,相等)、,NE,(,不等)、,LT,(,小于)、,GT,(,大于)、,LE,(,小于或等于)、,GE,(,大于或等于)。关系操作符的两个操作数必须都是数字或是同一段内的两个存储器地址。计算的结果应为逻辑值:结果为真,表示为,0FFFFH,;,结果为假,则表示为,0,。,例如:,MOV BX,(PORT_VAL LT 5) AND 20) OR (PORT_VAL GE 5) AND 30),则当,PORT_VAL 5,时,汇编结果应该是:,MOV BX, 20,否则,汇编结果应该是:,MOV BX, 30,(,4,) 数值回送操作符 数值回送操作符有:,TYPE,、,LENGTH,、,SIZE,、,OFFSET,、,SEG,等。数值回送操作符把一些特征或存储器地址的一部分作为数值回送。, TYPE,格式为:,TYPE,表达式如果表达式是变量,则汇编程序将回送该变量的以字节数表示的类型:,DB,为,1,,,DW,为,2,,,DD,为,4,,,DF,为,6,,,DQ,为,8,,,DT,为,10,。如果表达式是标号,则汇编程序将回送代表该标号类型的数值:,NEAR,为,-1,,,FAR,为,-2,。如果表达式为常数,则应回送,0,。,举例:,ARRAY DW 1, 2, 3,则对于指令,ADD SI, TYPE ARRAY,汇编程序将其形成为:,ADD SI, 2, LENGTH,格式为:,LENGTH,变量对于变量中使用,DUP,的情况,汇编程序将回送分配给该变量的单元数,而对于其他情况则送,1,。,举例,1,:,FEES DW 100 DUP (0),对于指令,MOV CX, LENGTH FEES,汇编程序将使其形成为:,MOV CX, 100,举例,2,:,ARRAY DW 1, 2, 3,对于指令,MOV CX, LENGTH ARRAY,汇编程序将使其形成为:,MOV CX, 1,举例,3,:,TABLE DB ABCD,对于指令,MOV CX, LENGTH TABLE,汇编程序将使其形成为:,MOV CX, 1, SIZE,格式为:,SIZE,变量汇编程序应回送分配给该变量的字节数。但是,此值是,LENGTH,值和,TYPE,值的乘积。,例如:,MOV CX, SIZE FEES,将形成为,MOV CX, 200,又例如:,MOV CX, SIZE ARRAY,将形成为,MOV CX, 2,又例如:,MOV CX, SIZE TABLE,将形成为,MOV CX, 1,。, OFFSET,格式为:,OFFSET,变量或标号汇编程序将回送变量或标号的偏移地址值。举例:,MOV BX, OFFSET OPER_ONE,汇编程序将,OPER_ONE,的偏移地址作为立即数回送给指令,而在执行时则将该偏移地址装入,BX,寄存器中。所以这条指令的功能与指令,LEA BX, OPER_ONE,是等价的。, SEG,格式为:,SEG,变量或标号汇编程序将回送变量或标号的段地址值。举例:如果,DATA_SEG,是从存储器的,05000H,地址开始的一个数据段的段名,,OPER1,是该段中的一个变量名,则,MOV BX, SEG OPER1,将把,0500H,作为立即数插入指令。实际上,由于段地址是由连接程序分配的,所以该立即数是连接时插入的。执行期间则使,BX,寄存器的内容成为,0500H,。, PTR,格式为:类型,PTR,符号地址,PTR,用来给已分配的存储地址(用符号地址表示)赋予另一种属性,使该地址具有另一种类型。类型可有,BYTE,、,WORD,、,DWORD,、,FWORD,、,QWORD,、,TBYTE,、,NEAR,和,FAR,等几种,所以,PTR,也可以用来建立字、双字、四字或段内及段间的指令单元等。,举例:已有数据定义如下:,TWO_BYTE DW ?,可以用以下语句对这两个字节赋予另一种类型定义:,ONE_BYTE EQU BYTE PTR TWO_BYTE,这里,ONE_BYTE,和,TWO_BYTE,两个符号地址具有相同的段地址和偏移地址,但是它们的类型属性不同,前者为,1,,后者为,2,。,此外,有时指令要求使用,PTR,操作符。例如用,MOV BX, 5,指令把立即数存入,BX,寄存器内容指定的存储单元中,但汇编程序不能分清是存入字单元还是字节单元,此时必须用,PTR,操作符来说明属性,应该写明:,MOV BYTE PTR BX,5,或,MOV WORD PTR BX,5,段操作符段操作符用来表示一个标量、变量或地址表达式的段属性。格式为: 段寄存器地址表达式段名地址表达式,例如,用段前缀指定某段的地址操作数,MOV AX,ES:BX + SI, SHORT,用来修饰,JMP,指令中转向地址的属性,指出转向地址是在下一条指令地址的,127,个字节范围之内。,例如:,JMP SHORT TAG,;,转移属性为短转移,.,.,.,TAG:,MOV., THIS,格式为:,THIS,属性或类型,THIS,可以象,PTR,一样建立一个指定类型(,BYTE,、,WORD,、,DWORD,),或指定距离(,NEAR,或,FAR,),的地址操作数。,该操作数的段地址和偏移地址与下一个存储单元地址相同,。,例如:,FIRST_TYPE EQU THIS BYTE,WORD_TABLE DW 100 DUP (?),此时,FIRST_TYPE,的偏移地址和,WORD_TABLE,完全相同,但它是字节类型的;而,WORD_TABLE,则是字类型的。又如:,START EQU THIS FAR,MOV,CX, 100,这样,,MOV,指令有一个,FAR,属性的符号地址,START,,,这就允许其他段的,JMP,指令直接跳转到,START,来。, HIGH,和,LOW,称为字节分离操作符,它接收一个数或地址表达式,,HIGH,取其高位字节,,LOW,取其低位字节。例如:,CONST EQU 0ABCDH,则,MOV AH, HIGH CONST,将汇编成,MOV AH, 0ABH,指令,MOV AH, LOW CONST,将汇编成,MOV AH, 0CDH,操作符的优先级我们知道表达式是常数、寄存器、标号、变量和操作符的组合,在计算表达式时,应该首先计算优先级高的操作符,然后从左到右地对优先级相同的操作符进行计算。括号也可以改变计算次序,括号内的表达式应优先计算。,表达式中的运算符,高,优,先,级,低,1,括号中的项,即(,)和,2,LENGTH,SIZE,WIDTH,MASK,3,PTR,OFFSET,SEG,TYPE,THIS,4,,,/,,,MOD,5,+,-,6,EQ,NE,L,LE,GT,GE,7,NOT,8,AND,9,OR,XOR,伪指令(,指示性语句),伪指令又称为伪操作,它是在对源程序汇编期间由汇编程序处理的操作,它们可以完成如 定义数据、分配存储区、指示程序结束等功能。 宏指令是由用户按照宏定义格式编写的一段程序,其中语句可以是指令、伪指令,甚至是已定义的宏指令。,伪指令和指令的区别在于,每一条指令必须生成机器代码,然后在程序运行期间由,CPU,来执行其操作;而伪指令是在汇编期间由汇编程序执行的操作命令,除了数据定义及存储器分配伪指令分配存储器空间外,其它伪指令不生成目标码。和各种指令一样,伪指令也是程序设计不可缺少的工具。下面介绍一些常用的伪指令。,段定义伪指令,段定义伪指令是表示一个段开始和结束的命令 。,段名,SEGMENT,段名,ENDS,段名由用户命名。对于数据段、附加段和堆栈段来说,段内一般是存储单元的定义、分配等伪指令语句;对于代码段中则主要是指令及伪指令语句。定义了段还必须说明哪个段是代码段,哪个段是数据段。,ASSUME,伪指令就是建立段和段寄存器关系的伪指令,其格式为:,ASSUME,段寄存器名,:,段名,,段寄存器名必须是,CS,、,DS,、,ES,和,SS,中的一个,而段名必须是由,SEGMENT,定义的段名。,例,; * * * * * * * * * * * * * * * * * * * * * * *data_seg1 segment,;,定义数据段,data_seg1 ends; * * * * * * * * * * * * * * * * * * * * * * * data_seg2 segment,;,定义附加段,data_seg2 ends; * * * * * * * * * * * * * * * * * * * * * * *,code_seg,segment,;,定义代码段,assume,cs:code_seg, ds:data_seg1, es:data_seg2,start:,;,程序执行的起始地址,; set DS register to current data segment,mov,ax, data_seg1,;,数据段地址,mov,ds, ax,;,存入,DS,寄存器,; set ES register to current extra segment,mov,ax, data_seg2,;,附加段地址,mov,es, ax,;,存入,ES,寄存器,.,.,code_seg,ends,;,代码段结束,; * * * * * * * * * * * * * * * * * * * * * * * * * *,end,start,由于,ASSUME,伪指令只是指定某个段分配给哪一个段寄存器,它并不能把段地址装入段寄存器中,所以在代码段中,还必须把段地址装入相应的段寄存器中:,MOV,AX,,,DATA_SEG1,;,数据段地址,MOV,DS,,,AX,;,存入,DS,寄存器,MOV,AX,,,DATA_SEG2,;,附加段地址,MOV,ES,,,AX,;,存入,ES,寄存器,如果程序中还定义了堆栈段,STACK_SEG,,也需要把段地址装入,SS,中:,MOV,AX,,,STACK_SEG,;,堆栈段地址,MOV,SS,,,AX,;,存入,ES,寄存器,注意,在程序中不需要用指令装入代码段的段地址,因为在程序初始化时,装入程序已将代码段的段地址装入,CS,寄存器了。,程序开始和结束伪指令,在程序的开始可以用,NAME,或,TITLE,作为模块的名字,其格式为:,NAME,模块名,TITLE,文件名表示源程序结束的伪指令的格式为:,END,标号,注意:,NAME,及,TITLE,伪指令并不是必需的,如果程序中既无,NAME,又无,TITLE,伪指令,则将用源文件名作为模块名。,END,伪指令中的“标号”指示程序开始执行的起始地址。如果多个程序模块相连接,则只有主程序的,END,要加上标号,其他子程序模块则只用,END,而不必指定标号。上例最后使用了,END START,伪指令。汇编程序将在遇,END,时结束汇编,并且程序在运行时从,START,开始执行。,数据定义及存储器分配伪指令,8086,提供了各种数据及存储器分配伪指令,这些伪指令在汇编程序对源程序进行汇编期间,由汇编程序完成数据类型定义及存 储器分配等功能。 数据定义及存储器分配伪指令的格式是:,变量,助记符 操作数, ,操作数, ;,注释,数据定义及存储器分配伪指令格式中的,变量,是操作数的符号地址,它是可有可无的,它的作用与指令语句前的标号相同,区别是变量后面不加冒号。如果语句中有变量,那么汇编程序将操作数的第一个字节的偏移地址赋于这个变量。,注释,字段用来说明该伪指令的功能,它也不是必须有的。,助记符,字段说明所用伪指令的助记符。,下面介绍常用的数据定义伪指令。,DB,(,define byte,),DB,伪指令用来定义字节,对其后的每个数据都存储在一个字节中。,DB,能定义十进制数、二进制数、十六进制数和,ASCII,字符,二进制数和十六进制数要分别用,B,和,H,表示,,ASCII,字符用单引号(, ,)括起来。,DB,还是唯一能定义字符串的伪操作,串中的每个字符占用一个字节。,请看下面数据定义的例子,注意,DB,定义的每个数据的存储情况,左边第一列是汇编程序为数据分配的字节地址,第二列是相应地址中存储的数据或,ASCII,字符(均用十六进制表示)。变量,DATA7,定义了,3,个数据和一个字符串,每个数据或串用,分开,它们分别存储在偏移地址,002E,开始的,6,个字节单元中。,0000,19,DATA1,DB,25,;,十进制数,0001,89,DATA2,DB,10001001B,;,二进制数,0002,12,DATA3,DB,12H,;,十六进制数,0010,ORG,0010H,;,指定偏移地址为,10h,0010,32 35 39 31,DATA4,DB,2591,; ASCII,码数,0018,ORG,0018H,;,指定偏移地址为,18h,0018,00,DATA5,DB,?,;,保留一个字节,0020,ORG,0020H,;,指定偏移地址为,20h,0020,4D 79 20 6E 61 6D,DATA6,DB,My name is Joe ; ASCII,码字符,65 20 69 73 20 4A,6F 65,002E,0A 10 02 31 30 42,DATA7,DB,10,10H,10B,10B ;,不同的数据类型,DW,(,define word,),DW,伪指令用来定义字,对其后的每个数据分配,2,个字节(,1,个字),数据的低,8,位存储在低字节地址中,高,8,位存储在高字节地址中,如下例中的变量,DATA8,的数据存储在,0070,字地址中,其中,0070,字节存储,0BAH,,,0071,字节存储,03H,。,DW,还可存储变量或标号的偏移地址。见下面,DW,伪指令的例子。,DD,(,define,doubleword,),DD,伪指令用来定义双字,对其后的每个数据分配,4,个字节(,2,个字)。该伪指令同样将数据转换为十六进制,并根据低地址存储低字节,高地址存储高字节的规则来存放数据。如下例,DATA15,的存储情况是:,00A8:0F2H,,,00A9H:57H,,,00AAH:2AH,,,00ABH:5CH,。用,DD,存入地址时,第一个字为偏移地址,第二个字为段地址。,DQ,(,define,quadword,),DQ,伪指令用来定义,4,字,即,64,位字长的数据,,DQ,之后的每个数据占用,8,个字节(,4,个字)。,DT,(,define ten bytes,),DT,伪指令用来为压缩的,BCD,数据分配存储单元,它虽然可以分配,10,个字节(,5,个字),但最多只能输入,18,个数字,要注意的是,数据后面不需要加“,H”,。,下面是,DQ,和,DT,的例子。,DUP,(,duplicate,),DUP,伪指令可以按照给定的次数来复制某个(某些)操作数,它可以避免多次键入同样一个数据。例如,把,6,个,FFH,存入相继字节中,可以用下面两种方法,显然用,DUP,的方法更简便些。存入,6,字节的,FFHDATA20 DB 0FFH 0FFH 0FFH 0FFH 0FFH 0FFH;DATA21 DB 6 DUP(0FFH),DUP,操作一般用来保留数据区,如用数据定义伪指令,DB 64 DUP(?),可保留,64,个字节单元。,DUP,还可以嵌套。,表达式赋值伪操作,EQU,有时程序中多次出现同一个表达式,为方便起见可以用赋植伪操作给表达式赋予一个名字,其格式如下:,Expresstion_name,EQU,Expresstion,此后,程序中凡需要用到该表达式之处就可以用表达式名来代替。上式中表达式可以是任何有效的操作数格式,可以是任何可以求出常数值的表达式,也可以是任何有效的助记符。,EQU,是一个赋值伪操作(伪指令),它给一个数据标号赋于一个常数值,但这个常数不占用存储单元。当这个数据标号出现在程序中时,汇编程序即用它的常数值代替数据标号。,EQU,可以在数据段之外使用,甚至可用在代码段中间。,假定在数据段和代码段中要多次使用一个数据(如,25,),那么在编程时凡是用到,25,的地方都可用数据标号,COUNT,来表示。如果程序想修改这个数据,那么只需修改,EQU,的赋值,而无须修改程序中其它部分,如,COUNTER,和,MOV,语句就不必修改。,COUNT,EQU 25,COUNTER,DB,COUNT,MOV,AL,COUNT,DATA,EQU HEIGHT + 12,;,地址表达式赋以符号,ALPHA,EQU 7,;,常数赋以符号名,BETA,EQU ALPHA-2,;,把,7-2=5,赋以符号名,BETA,ADDR,EQU VAR + BETA,; VAR+5,赋以符号名,ADDR,B,EQU BP + 8,;,变址引用赋以符号名,B,P8,EQU DS:BP + 8 ;,加段前缀的变址引用赋以符号名,P8,注意:在,EQU,语句的表达式中,如果有变量或标号的表达式,则在该语句前应该先给出它们的定义。如上例,,ALPHA,必须在,BETA,之前定义,否则汇编程序将指示出错。,=,伪操作,赋值伪操作,=,的作用与,EQU,类似。它们之间的区别是,,EQU,伪操作中的标号名是不允许重复定义的,而,=,伪操作是允许重复定义的。,例如,,TMP,EQU 5,TMP,EQU TMP+1,则是错误语句,因为,TMP,已赋值为,5,,就不能再把它定义为其它数值。而,TMP = 5,TMP = TMP+1,则是允许使用的,因为,=,伪操作允许重复定义。第一个语句,TMP,的值为,5,,第二个语句,TMP,的值就为,6,了。,地址计数器与对准伪指令,1,地址计数器在汇编程序对源程序汇编的过程中,使用地址计数器来保存当前正在汇编的指令的地址。地址计数器的值在汇编语言中可用来表示。当用在伪指令的参数字段时,它所表示的是地址计数器的当前值,汇编语言允许用户直接用来引用地址计数器的值,例如指令:,JMP,+ 6,它的转向地址是,JMP,指令的首地址加上,6,。当用在指令中时,它表示本条指令的第一个字节的地址。在这里,,+ 6,必须是另一条指令的首地址。否则,汇编程序将指示出错信息。当用在伪指令的参数字段时,则和它用在指令中的情况不同,它所表示的是地址计数器的当前值。例如指令:,ARRAY,DW 1, 2,+ 4, 3, 4,+ 4,假设汇编时,ARRAY,分配的偏移地址为,0074H,,,则汇编后,,+ 4,所在的两个字单元: (,ARRAY+4,),=0078+4=007CH,(,ARRAY+0A,),=007E+4=0082H,应当注意,,ARRAY,数组中的两个,+ 4,得到的结果是不同的,这是由于的值是在不断变化的缘故。当在指令中用到时,它只代表该指令的首地址,而与本身所在的字节无关。,2,EVEN,伪指令,EVEN,伪指令使下一个变量或指令开始于偶数字节地址。例如:,DATA_SEG,SEGMENT,BYTE_DAT,DB ?,EVEN,WORD_DAT,DW 100 DUP (?),DATA_SEG,ENDS,一个字的地址最好从偶地址开始,所以对于字数组为了保证它从偶地址开始,可以在,DW,定义之前用,EVEN,伪指令来达到这一目的。,3,ALIGN,伪指令,ALIGN,伪指令使它后面的数据或指令从,2,的整数倍地址开始。其格式为:,ALIGN 2n (n,为任意整数,),例如:,ALIGN 4 ARRAY DD 100 DUP (?)ALIGN,伪指令保证了双字数组,ARRAY,地址边界从,4,的倍数开始。,ALIGN,伪指令是将当前偏移地址指针指向,2,的乘方的整数倍的地址,如果源地址指针以指向,2,的乘方的整数倍的地址,则不作调整;否则将指针加以一个数,使地址指针指向下一个,2,的乘方的整数倍的地址。当然,,ALIGN 2,和,EVEN,是等价的。,基数控制伪指令,.RADIX,伪指令,.RADIX,可以把默认的基数改变为,2,16,范围内的任何基数。其格式如下:,.RADIX,基数值其中基数值用十进制数来表示。,例如:,MOV,BX, 0FFH,;,16,进制数标记为,HMOV,BL, 10000101B,;,二进制数标记为,BMOV,BX, 178,;,10,进制为默认的基数,可无标记,.RADIX,16,;,以下程序默认,16,进制数,MOV,BX, 0FF,;,16,进制为默认的基数,可无标记,MOV,BX, 178D,;,10,进制数应加标记,D,应当注意,在用,.RADIX 16,把基数定为十六进制后,十进制数后面都应跟字母,D,。,在这种情况下,如果某个十六进制数的末字符为,D,,,则应在其后跟字母,H,,,以免与十进制数发生混淆。,
展开阅读全文