1/96主要内容:一、汇编语言语句格式二、汇编语言伪指令三、汇编语言源程序的汇编与连接四、汇编语言程序设计的基本方法汇编语言程序设计2/96本讲重点:伪操作汇编语言程序格式简单汇编程序设计汇编语言程序设计3/96一、汇编语言语句格式汇编语言语句有指令性语句、伪指令语句和宏指令语句三种类型。1、指令性语句:[标号:]操作码[操作数][;注释]是机器指令的符号表示,经汇编产生对应的机器指令代码,在形成执行文件时执行。2、伪指令语句:[名字]伪指令助记符[操作数][;注释]只是给汇编程序提供一些控制信息,帮助汇编程序正确汇编指令性语句,没有对应的机器码。说明:名字可以是符号常量名、变量名、过程名、段名等,名字后面不能有“:”。伪指令命令助记符共有40多个,按功能不同分成八类。操作数之间须用逗号分隔。3、宏指令语句:[宏名]宏操作助记符[操作数][;注释]是指令性语句和指示性语句的复合体,在汇编时被展开。说明:宏名即宏指令名,是一标识符,宏名后面不能有“:”。宏操作助记符有MACRO、ENDM、LOCAL、REPT、IRP、PURGE等8个。汇编程序不区分大小写4/96汇编语言语句统一格式规定指令性语句、伪指令语句和宏指令语句的统一格式:[名字项]操作项[操作数项][;注释项]1.名字项:最多由21个字符组成。可由下列字符组成。①字母A~Z、a~z②数字0~9③特殊符号?、·、@、-、$等注意:名字项的第一个字符不可以是数字,必须是字母或特殊字符,但是问号本身不能单独作为名字;如果用到特殊符号,则它必须是首字符。汇编语言的专用保留字、寄存器名、8088/8086汇编语言中的指令助记符、伪指令名、表达式中使用的运算符和属性运算符等均不能作为名字项,否则汇编会给出错误信息;名字项在程序中不能重复定义。5/96(1)段属性:可用SIG伪指令求出此属性用于定义标号和变量的段起始地址。标号通常在代码段CS中定义,变量通常在DS、ES和SS段中定义。(2)偏移属性:可用OFFSET伪指令求出此属性指出标号或变量距离段起始地址的字节数,它是一个16位的无符号数。(3)类型属性:可用TYPE伪指令求出对标号而言,此属性指出其引用类型,段内引用属于NEAR类,指针长度为2字节;段间引用属于FAR类,指针长度为4字节。对变量而言,此属性指出其字节长度,可为1、2、4、8、10个字节。名字项属性6/962.操作项可以是指令、宏指令、伪指令的助记符。【例】LOOP:MOVAX,BX┆BUFFERDB1,2,3,4,5,6,7;数据定义伪指令,在主存中开辟7个连续的字节单元,初值依次为1~7,BUFFER表示首地址7/963.操作数项操作数项可以由常量、寄存器、标号、变量或表达式等组成。(1)常量常量是没有属性的纯数,其数值在汇编过程中被确定,并在程序运行时保持不变。分为数值常量和字符型常量。各种形式数字常量格式对照表8/96字符串常量•字符串常量是用单引号或双引号引起来的一个或多个字符。字符串常量是以各字符的ASCⅡ码表示的。如‘A’用41H表示,字符串‘A1B2’用41H,31H,42H,32H表示。9/96常数项举例[例5.2]SUBDH,22;常数22为立即数,汇编后为16HMOVBX,[SI十32H];常数32H作位移量DB12H;定义一个字节数据DW1234H;定义一个字数据DD12345678H;定义一个双字数据DB′9BD′;定义三个字节的字符串数据,在内存中就是39H、42H、44H10/96(2)表达式及运算符•算术运算符•移位运算符•逻辑运算符•关系运算符•分析运算符•综合运算符表达式由常数、寄存器、标号、变量与一些运算符组合而成,分为数字表达式和地址表达式。汇编过程中,汇编程序按照一定的优先规则,对表达式进行计算后得到一个数值或地址,用作指令的操作数。11/96•算术运算符:+(加)、-(减)、*(乘)、/(除)、MOD(求模)•移位运算符:SHL(左移)、SHR(右移)•可以用于数值表达式又可用于地址表达式。算术运算符和移位运算符12/96【例】算术和移位运算符进行数值表达式运算┆NUM1EQU25*4–50;NUM1=50NUM2EQUNUM1/7;NUM2=7NUM3EQUNUM1MOD7;NUM3=1NUM4EQU0FH┆MOVAL,NUM4SHL4;(AL)=11110000B13/96•与(AND)、或(OR)、异或(XOR)、非(NOT)四种运算。•由于逻辑运算是按位操作,且在汇编过程中完成,因而运算的结果仍为整数常量。【例】用逻辑运算符进行运算。MOVAL,34HAND0FH;04H→ALMOVBL,05HOR30H;35H→BLMOVCX,NOT00FFH;0FF00H→CXMOVDX,789AHXOR000FH;7895H→DX逻辑运算符14/96•相等(EQ),不等(NE),小于(LT),大于(GT),小于等于(LE)及大于等于(GE)。•运算结果成立时逻辑值为真,用0FFFFH表示;•关系不成立时逻辑值为假,用0表示。【例】用关系运算符进行数值表达式运算。NUM1EQU10LT5;NUM1=0NUM2EQU0AAAAHGT7FFFH;NUM2=0FFFFHMOVAX,‘A‘EQ41H;0FFFFH→AXMOVBX,NUM2LTNUM1;0→BX关系运算符15/96把标号或变量所指存储器地址的属性(段、偏移量和类型)或一些特征分离出来,作为操作数使用。主要介绍3个:SEG运算符OFFSET运算符TYPE运算符分析运算符号16/96格式:SEG变量或标号•功能:分离出其后变量或标号所在段的段首址。【例】已知数据段从存储器的23000H地址开始,DBUF是该段中的一个变量名。MOVBX,SEGDBUF汇编为:MOVBX,2300H①SEG运算符17/96•格式:OFFSET变量或标号•功能:分离出其后变量或标号的偏移地址。【例】已知标号START的段地址为2100H,物理地址为21200H。MOVDX,OFFSETSTART汇编为:MOVDX,0200H这条指令与指令LEADX,START功能相同。②OFFSET运算符18/96•格式:TYPE变量或标号•功能:分离出其后变量或标号的类型。如果是变量,将返回该变量的类型对应字节数;如果是标号,则返回代表标号类型的数值。它们之间的关系见下表所示。③TYPE运算符【例】已定义ARRAYDB22,33指令ADDSI,TYPEARRAY汇编为:ADDSI,119/96①段属性前缀运算符“∶”格式为:段寄存器名∶地址表达式或段名∶地址表达式或组名∶地址表达式此运算符用来表示一个标号、变量或地址表达式的段属性。【例】用段前缀指定附加段内操作数的地址MOVAL,ES∶DATA;指令源操作数在附加段DATA地址单元中(5)综合运算符20/96②LOW和HIGH格式为:LOW表达式或HIGH表达式此运算符用于对一个16位数据或地址表达式,用HIGH取其高位字节、LOW取其低位字节。所以此运算符又称为字节分离运算符。【例】已知RESULTEQU7788H则MOVAH,HIGHRESULT汇编为:MOVAH,77HMOVAL,LOWRESULT汇编为:MOVAL,88H(5)综合运算符21/96本节介绍了几种常用的运算符。为了正确计算表达式的数值,应该按照运算符的优先级:先高后低、自左向右(优先级相同时)地进行计算。括号内的表达式应优先计算。下面给出相关运算符从高到低的优先级排列顺序:表达式及运算符小结22/961.(在圆括号中的项),[方括号中的项],〈结构变量(变量、字段)〉2.LENGTH,SIZE、WIDTH和MASK3.PTR,OFFSET,SEG,TYPE,THIS及段运算符4.HIGH和LOW5.*,/,MOD,SHL(左移),SHR(右移)6.+,-7.EQ,NE,LT,LE,GT,GE8.NOT9.AND10.OR,XOR11.SHORT表达式及运算符小结高低23/964.注释项一行语句分号后面的内容,主要用来说明程序或语句功能,增加程序的可读性。对于较大的程序,注释项更不能缺少。分号(;)放在语句后,用来说明该语句的功能;分号放在某一行的开头,用来说明下面一段程序的功能;分号加到指令前,可暂时冻结有疑问的指令,调试正确后,再把这些指令解冻或删除,这样可减少语句增、删的编辑工作。24/96MOVCX,0;传送指令,具有2个操作数DELAY:NOP;空操作指令,没有操作数,带有标号LOOPDELAY;循环指令,标号DELAY说明转移位置BUFFERDB1,2,3,4,5,6,7;数据定义伪指令,在主存中开辟7个连续的字节单元,初值依次为1~7,BUFFER表示首地址25/96本节小结•汇编语言指令格式[名字项]操作项[操作数项][;注释项]•标号和变量的属性:段属性、偏移属性、类型属性•操作数的表达形式算术、移位、逻辑、关系、属性、综合运算符首页26/96二、汇编语言伪指令•伪指令:在汇编程序对源程序汇编期间由汇编程序处理的操作(不是真正执行的指令),可以完成处理器选择、定义程序模式、定义数据、分配存储区、指示程序结束等功能。•常用伪指令:处理器选择伪指令;段定义伪指令程序开始与结束伪指令;数据定义与存储器分配伪指令;赋值伪指令;地址计数器与对准伪指令;基数控制伪指令;偶地址对准伪指令;27/961.处理器选择伪操作.8086选择8086指令系统.286选择80286指令系统.286P选择保护模式下的80286指令系统.386选择80386指令系统.386P选择保护模式下的80386指令系统.486选择80486指令系统.486P选择保护模式下的80486指令系统.586选择Pentium指令系统.586P选择保护模式下的Pentium指令系统一般放在整个程序的最前面。默认值为.808628/962.段定义伪指令•完整的汇编语言源程序由段组成•一个汇编语言源程序可以包含若干个代码段、数据段、附加段或堆栈段,段与段之间的顺序可随意排列。•需独立运行的程序必须包含一个代码段,并指示程序执行的起始点,一个程序只有一个起始点•所有的可执行性语句必须位于某一个代码段内,说明性语句可根据需要位于任一段内•通常,程序还需要一个堆栈段29/962.段定义伪操作•源程序分别用两种格式书写第一种格式从MASM5.0开始支持–简化段定义格式第二种格式MASM5.0以前就具有–完整段定义格式Hello,Everybody!程序功能30/961;EXAMPLE5.42;程序注释;…………………………………数据段说明2DATASEGMENT;数据段┇3DATAENDS;…………………………………堆栈段说明4STACKSEGMENTPARASTACK′STACK′;堆栈段┇5STACKENDS;……………………………………………………………代码段说明6CODESEGMENT;代码段7STARTPROCFAR;远过程调用定义8ASSUMECS∶CODE,DS∶DATA,ES∶DATA,SS∶STACK完整段定义伪操作基本格式(1)31/969PUSHDS;保存返回地址10MOVAX,011PUSHAX12MOVAX,DATA;初始化DS,ES13MOVDS,AX14MOVES,AX┇;自己编写的程序;………………………………………………………………15RET;返回DOS16STARTENDP;………………………………………………………………17CODEENDS;代码段结束;………………………………………………………18ENDSTART;汇编到此结束32/961;EXAMPLE5.42;程序注释;…………………………………数据段说明2DATASEGMENT;数据段┇3DATAENDS;…………………………………堆栈段说明4STACKSEGMENTSTACK;堆栈段┇5STACKENDS;……………………………………………………………代码