《汇编语言》第四章汇编语言程序格式2回顾IBM-PC的寻址方式指令寻址方式操作数的寻址方式IBM-PC指令系统数据传送指令运算指令控制转移指令串处理指令处理机控制指令简单的汇编语言程序设计3目标汇编语言语句格式常量表达式、数值表达式变量定义及应用变量、标号和逻辑段的属性基本伪指令和操作符EQU/=、+-*/、DB/DW/DD、?/DUP、ORG/$、OFFSET/SEG/PTR、END、SEGMENT/ENDS完整段定义源程序格式,DOS的程序结构汇编语言源程序的编辑、汇编、连接和调试4指令格式硬指令和伪指令硬指令使CPU产生动作、并在程序执行时才处理的语句指令格式:标号:硬指令助记符操作数,操作数;注释伪指令(Directive)不产生CPU动作、在程序执行前由汇编程序处理的说明性语句例如,数据说明、变量定义、分配存储区等等。伪指令与具体的处理器类型无关,但与汇编程序的版本有关。伪指令的格式:名字伪指令助记符参数,参数,…;注释?伪指令语句与指令语句的主要区别:伪指令语句经汇编后不产生机器目标代码,而指令语句经汇编后将产生相应的机器目标代码;伪指令语句所指示的操作是在程序汇编时完成的,而指令语句的操作必须在程序运行时才能完成。5汇编语言基础标号、名字与标识符标号反映硬指令位置(逻辑地址)的标识符,后跟一个冒号分隔名字反映伪指令位置(逻辑地址)和属性的标识符,后跟空格或制表符分隔,没有一个冒号常见名字的表现方式有:变量名、段名、过程名等标识符(Identifier)是名字和标号的统称,一般最多由31个字母、数字及规定的特殊符号(如_、$、?、@)组成,不能以数字开头默认情况下,汇编程序不区别标识符中的字母大小写一个程序中,每个标识符的定义是唯一的,还不能是汇编语言采用的保留字例:next:incsistringdb1,2,3,4xdw1ydw26汇编语言基础保留字(ReservedWord)保留字是汇编程序已经利用的标识符,主要有:硬指令助记符:例如,MOV、ADD伪指令助记符:例如,DB、EQU操作符:例如,OFFSET、PTR寄存器名:例如,AX、CS预定义符号:例如,@data助记符硬指令助记符可以是任何一条处理器指令,也可以是一条宏指令伪指令助记符操作数与参数处理器指令的操作数可以是立即数、寄存器和存储单元伪指令的参数可以是常数、变量名、表达式等;可以有多个,参数之间用逗号分隔。7汇编语言基础注释语句中由分号“;”开始的部分为注释内容,用以增加源程序的可读性必要时,一个语句行也可以由分号开始作为阶段性注释汇编程序在翻译源程序时将跳过该部分,不对它们做任何处理分隔符语句的4个组成部分要用分隔符分开标号后用冒号,注释前用分号操作数之间和参数之间使用逗号分隔其他部分通常采用空格或制表符,多个空格和制表符的作用与一个相同MASM支持续行符“\”8常量常数:表示一个固定的数值,常用的数制有:十进制常数(D/d)、十六进制常数(H/h)、二进制常数(B/b)、八进制常数(Q/q)以字母A~F开头的十六进制数,前面要用0表示MASM中默认进制的设置:.RADIXn字符串常数用单引号或双引号括起来的单个字符或多个字符,其数值是每个字符对应的ASCII码的值符号常数:利用一个标识符表达的一个数值等价EQU伪指令:符号名EQU数值表达式或符号名EQU字符串等号=伪指令:符号名=数值表达式说明:二者间的区别在于=定义的常量可重复赋值,而EQU不允许例:符号定义及应用DosWriteCharequ2CarriageReturn=13CallDOSequint21hXdb‘1’符号应用(左边程序段等价右侧的符号形式)movah,2;movah,DosWriteCharmovdl,13;movdl,CarriageReturnint21h;CallDOS9数值表达式数值表达式一般是指由运算符连接的各种常数所构成的表达式汇编程序在汇编过程中计算表达式,最终得到一个数值表达式在程序运行之前,就已经计算结果;所以,程序运行速度没有变慢,但增强程序的可读性MASM对除伪指令外各种汇编时处理的指令统称为操作符(Operator)运算符算术运算符、逻辑运算符、(逻辑)移位运算符、关系运算符、高低分离符10运算符算术运算符+、-、*、/、MODMOD也称为取模,它计算除法之后的余数加+和减-运算符还可以用于地址表达式的计算除加、减外,其他运算符的参数必须是整数例:movax,3*4+5;等价于movax,17逻辑运算符AND、OR、XOR、NOT实现按位相与、相或、异或、求反的逻辑运算例:oral,03hAND45h;等价于oral,01h11运算符逻辑移位运算符SHL/SHR实现左移、右移的逻辑操作;移入低位或高位的是0格式为:数值表达式SHL/SHR移位次数例:moval,0101bSHL(2*2)关系运算符用于比较和测试符号数值EQ、NE、GT、LT、GE、LEMASM用-1表示条件为真,MASM用0表示条件为假例:movbx,((PORTLT5)AND20)OR((PORTGE5)AND30);当PORT5时,汇编结果为movbx,20;否则,汇编结果为movbx,3012运算符高低分离符HIGH、LOW、HIGHWORD、LOWWORD取数值的高半部分或低半部分HIGH、LOW从一个字数值或符号常量中得到高、低字节例:movah,HIGH8765h;等价于movah,87h从MASM6.0引入的HIGHWORD、LOWWORD取一个符号常量(不能是其他常数)的高字或低字部分例:dd_valueequ0ffff1234h;定义一个符号常量movax,LOWWORDdd_value;等价于movax,1234h13操作符的优先级1()[]LENGTHSIZEWIDTHMASK2PTROFFSETSEGTPYETHIS3HIGELOW4*/MODSHLSHR5+-6EQNEGTLTGELE7NOT8AND9ORXOR10SHORT14地址型参数地址型参数汇编语言程序中,地址型数据可作指令参数主要形式是标号和名字(变量名、段名、过程名等)硬指令的操作数有存储单元存储单元就应该用地址型参数(存储器操作数)表达15变量定义及存储器分配变量定义伪指令功能变量申请固定长度的存储空间并同时将相应的存储单元初始化数据定义伪指令的格式:变量名数据定义伪指令助记符初值表例:Xdb1,23,34db‘a’,’b’ydb50dup(1,2)16变量定义及存储器分配变量名为用户自定义标识符,表示初值表首元素的逻辑地址;用符号表示地址,称为符号地址变量名可以没有。这种情况,汇编程序将直接为初值表分配空间,无符号地址。初值表初值表是用逗号分隔的参数主要由数值常数、表达式或?、DUP组成?:表示初值不确定,即未赋初值;DUP:表示重复初值DUP的格式为:重复次数DUP(重复参数)17变量定义及存储器分配数据定义伪指令助记符变量定义伪指令根据申请的主存空间单位分类DB:定义字节DW:定义字DD:定义双字DF:定义3字DQ:定义4字DT:定义10字节常用的是DB、DW、DD类型属性类型属性表示每个数据项的字节长度DB:1DW:2DD:4例1:datasegment;数据段定义Xdb'a',-5db2dup(100),?Ydb'ABC'Dataends61HFBH64H64H?41H42H43HXY例2:若对例1完成如下操作,结果是?:moval,XdecX+1movY,al18变量定义及存储器分配例3:DUP的嵌套DATA1DB3DUP(2DUP(1,2),?)例4:字单元定义datasegment;数据段countdw8000h,?,'AB'maxintequ64hnumberdwmaxintarraydwmaxintdup(0)dataends19变量和标号的属性属性的类型地址属性:在存储器中的位置类型属性:表示的数据宽度标号和名字一经定义便具有以下两类三种属性:段值:属于地址属性,标号和名字对应存储单元的段地址偏移值:属于地址属性,标号和名字对应存储单元的偏移地址类型:属于类型属性标号、子程序名的类型可以是NEAR(近)和FAR(远),分别表示段内或段间;变量名的类型可以是BYTE、WORD和DWORD等20变量和标号的属性地址操作符用于取得名字或标号的段地址和偏移地址两个属性。[]:将括起的表达式作为存储器地址$:当前偏移地址::采用指定的段地址寄存器OFFSET名字/标号:返回名字或标号的偏移地址SEG名字/标号:返回名字或标号的段地址例:地址操作符的应用org$+10arraydb45,45hmovax,segarraymovds,axmovbx,offsetarray;等价于leabx,arraymovcl,array+4;等效于movcl,array[4]movax,es:[2000h]21变量和标号的属性类型操作符类型操作符对名字或标号的类型属性进行有关设置常用的类型操作符类型名PTR名字/标号THIS类型名SHORT标号TYPE名字/标号SIZE/SIZEOF变量名LENGTH/LENGTHOF变量名22类型操作符PTR格式:类型名PTR名字/标号功能:PTR操作符使名字或标号具有指定的类型使用PTR操作符,可以临时改变名字或标号的类型类型名BYTE、WORD、DWORD、FWORD、QWORD、TBYTENEAR、FAR由STRUCT、RECORD、UNION以及TYPEDEF定义的类型例1:PTR的使用moval,byteptrw_var;w_var是一个字变量jmpfarptrn_label;n_label是一个标号例2:为什么要使用PTRoper1db1,2oper2dw3,4movax,oper1;错误,movax,wordptroper1movbl,oper2;错误,movbl,byteptroper2例3:对BX指向的存储单元加1inc[bx];错误,应改为:incbyteptr[bx];或改为incwordptr[bx]提出问题:add[ax],32h正确吗?addax,32h正确吗?23类型操作符THIS格式:名字THIS类型功能:利用THIS说明的操作数具有汇编时的当前逻辑地址,且具有指定的类型一般与EQU一起使用例:xdb1,2,3b_varequTHISbyte;按字节访问变量b_var,但与w_var的地址相同w_vardw4,5,6;按字访问变量w_varf_jumpequTHISfar;用f_jump为段间转移(f_jumplabelfar)n_jump:movax,w_var;用n_jump为段内近转移,但两者指向同一条指令24类型操作符LABEL格式:名字LABLE类型LABEL伪指令的功能等同于EQUTHIS例:b_varequTHISbyte;等价于b_varLABELbytew_vardw10dup(0);f_jumpequTHISfar;等价于f_jumpLABELfarn_jump:movax,w_var;25类型操作符SHORT格式:SHORT标号指定标号作为-128~+127字节范围内的短转移如果标号实际上超出了这个范围,则出错。对高版本MASM已无意义例:jmpshortn_jump26数值返回操作符数值返回操作符返回变量或存储单元的属性或地址。有:TYPE、LENGTH、SIZE、SEG、OFFSET类型操作符TYPE格式:TYPE名字/标名返回表明名字或标号类型的一个字量数值对字节、字和双字变量依次返回1、2和4;对短、近和