汇编语言程序设计第4章汇编语言程序格式4.1汇编程序功能4.2伪操作4.3汇编语言程序格式4.4汇编语言程序的上机过程汇编语言程序设计汇编程序功能汇编语言程序的建立及汇编过程汇编程序的主要功能检查出源程序的语法错误,并给出出错信息提示。生成源程序的目标代码程序,也可给出列表文件。汇编时遇到宏指令即展开。编辑程序*.ASM汇编语言*.OBJ连接程序*.EXE汇编语言程序设计伪操作伪指令语句又称为说明语句或管理语句。它不同于指令语句,不是直接命令CPU去执行某一操作,而是命令汇编程序应当如何生成目标代码。例如控制汇编以实现数据定义、存储器分配、符号处理、模块之间的通信、源程序开始和指示程序结束等功能。伪指令无相应的目标代码,因此也称为伪操作。伪指令格式与指令格式十分相似。汇编语言程序设计处理器选择伪操作告诉汇编程序选择哪一种指令系统缺省方式选择8086指令系统.8086选择80286指令系统.286选择选择保护方式下的80286指令系统.286P选择80386指令系统(除特权指令).386选择选择保护方式下的80386指令系统.386P选择80486指令系统(除特权指令).486选择选择保护方式下的80486指令系统.486P汇编语言程序设计段定义伪操作1、完整的定义段伪操作格式:段名SEGMENT[使用类型][定位方式][组合类型][‘类别’]段名ENDS汇编语言程序设计定位类型说明段的起始地址应该有怎样的边界值。可以是:1)PARA指定段的起始地址必须从小段边界开始,即段起始地址的最低16进制数位必须为”0”。即地址是可以被16整除的地址,缺省时,隐含为PARA。2)BYTE该段的起始地址可以从任何地址开始。3)WORD表示段起始地址以偶地址开始。4)DWORD该段必须从双字的边界开始。即段起始地址的最低十六进制数位必须为4的倍数。5)PAGE设该段的起始地址的低8位为”0”。该地址是被256整除的地址汇编语言程序设计组合类型说明程序连接时的段合并方法。1)PRIVATE(默认选项)该段为私有段,在连接时将不与其他模块中的同名分段合并。2)PUBLIC该段连接时可以把不同模块中的同名段相连接而形成一个段,其连接次序由连接命令指定。每一分段都从小段的边界开始。3)COMMON该段在连接时可以把不同模块中的同名段重叠而形成一个段,由于各同名分段有相同的起始地址,所以会产生覆盖。COMMON的连接长度是各分段中的最大长度。4)AT表达式使段地址是表达式所计算出来的16位值。但它不能用来指定代码段。汇编语言程序设计5)MEMORY与PUBLIC同义6)STACK把不同模块中的同名段组合而形成一个堆栈段。该段的长度为各原有段的总和,各原有段之间并无PUBLIC所连接段中的间隙,而且栈顶可以自动指向连接后形成的大堆栈段的栈顶。汇编语言程序设计使用类型只适用于386及其后继机型,它用来说明使用16位寻址方式还是32位寻址方式。可以是:1)USE16(默认选项)使用16位寻址方式段长不超过64KB,地址的形式是16位段地址和16位偏移地址。2)USE32使用32位寻址方式段长可达4GB,地址的形式是16位段地址和32位偏移地址。汇编语言程序设计类别(‘CLASS’)在引号中给出连接时组成段组的类型名。类别说明并不能把相同类别的段合并起来,但在连接后形成的装入模块中,可以把它们的位置靠在一起。汇编语言程序设计段分配伪指令ASSUMEASSUME段寄存器名:段名,段寄存器名:段名功能:制定某个段分配给哪一个段寄存器,它并不能把段地址分配给段寄存器。该指令放在程序的代码段中。如:ASSUMECS:CODE,ES:ESTRA,DS:DATA,SS:STACK说明代码段的段地址寄存器CS应该存放代码段CODE的段地址,同理ES、DS、SS段寄存器对应存放ESTRA、DATA、STACK的段地址,该指令只是说明,并没有真正传送,除了代码段寄存器中的代码段地址是由系统自动分配,其他的段地址在代码段中可以为所对应的段寄存器赋初值。汇编语言程序设计DSEGSEGMENTDSEGENDSCSEGASSUMECS:CSEG,DS:DSEGSTART:MOVAX,DSEGMOVDS,AXMOVAX,4C00HINT21HCSEGENDSENDSTART汇编语言程序设计变量和标号的属性变量的属性:(1)段属性:定义变量的段起始地址,此值必须在段寄存器中。(2)偏移属性:从变量所在段的起始地址到定义变量的位置之间的字节数。(3)类型属性:定义该变量所保留的字节数。标号的属性:(1)段属性:定义标号的段起始地址,此值必须在一个段寄存器中,标号的段总在CS寄存器中。(2)偏移属性:从标号所在段的起始地址到定义标号的位置之间的字节数。(3)类型属性:用来指出该标号是在本段内引用还是在其他段中引用。如在段内引用则称为NEAR,如在段外引用则称为FAR。汇编语言程序设计数据定义及存储分配伪操作变量定义伪指令为变量申请固定长度的存储空间,并可同时将相应的存储单元初始化变量名伪指令助记符初值表变量定义伪指令根据申请的主存空间单位分类DB——定义字节伪指令DW——定义字伪指令DD——定义双字伪指令DF——定义3字伪指令DQ——定义4字伪指令DT——定义10字节伪指令汇编语言程序设计例:定义变量并赋初值XDB1,-1,0fcHYDW1,-1,0fcHZDD1,-1,0fcH汇编语言程序设计汇编语言程序设计汇编语言程序设计汇编语言程序设计属性定义运算符格式:类型PTR地址表达式说明:指明紧跟其后的地址表达式的类型属性,但保持它原来的段属性和偏移地址属性不变。类型属性可以为:BYTE、WORD、DWORD、FWORD、NEAR和FAR等。类型运算符主要用于以下情况:1)使语句中类型模糊的操作数地址变得明确。例如:MOV[SI],100MOVWORDPTR[SI],1002)可用来临时改变某一操作数地址的类型,使得类型不一致的两地址变为一致。汇编语言程序设计例:阅读下列程序段,指出其中的语句错误DATASEGMENTNUMDB11H,22H,33H,44HLENEQULEN-NUMDATAENDSMOVAX,NUMMOVAX,WORDPTRNUMMOVSI,OFFSETNUMADD2[SI],LENADDBYTEPTR2[SI],LENINC[SI]INCBYTEPTR[SI]汇编语言程序设计同一个变量可以具有不同的类型属性,除了用属性操作符定义外,还可以用LABEL伪操作来定义。变量名LABEL类型其中类型可以是:BYTE、WORD、DWORD、FWORD、QWORD或TBYTE对于可执行的代码,则可以表示为:标号名LABEL类型类型可以是:NEAR或者FAR例如:BYTE_ARRAYLABELBYTEWORD_ARRAYDW50DUP(?)汇编语言程序设计表达式赋值伪操作EQU符号常量的定义就是用赋值伪指令EQU来定义的符号名。伪指令格式:标识符EQU表达式伪指令功能:用表达式来定义标识符,使表达式等同与标识符。表达式包括:常量表达式,地址表达式。XEQU3*4;表达式是常量表达式汇编语言程序设计等号伪指令=格式:符号名=表达式功能:与EQU相同,但有点区别。Y=3*4=伪指令与EQU伪指令的差别:1)=伪指令只能代表表达式或常数,不能是指令助记符等。2)EQU定义的符号不能重定义,而=定义的可以。在同一个汇编源程序中,EQU不能重复定义同一个标识符,而“=”可以重复定义标识符。例如:XDW100RES=3*X+8┇RES=3*X+9汇编语言程序设计地址计数器和对准伪操作1、地址计数器$在汇编程序对源程序汇编的过程中,使用地址计数器来保存当前正在汇编的指令的偏移地址。当开始汇编或在每一段开始时,把地址计数器初始化为零,以后在汇编过程中,每处理一条指令,地址计数器就增加一个值,此值为该指令所需要的字节数。汇编语言允许用户直接用$来引用地址计数器的值。如:JNE$+6其转向地址是JNE指令的首地址加6。当$用在指令中时,表示本条指令的第一个字节的地址。汇编语言程序设计当$用在伪操作的参数字段时,表示地址计数器的当前值。例如ARRAYDW1,2,$+4,3,4,$+4如果汇编时ARRAY分配的偏移地址为0074,则第一个$+4的值为:007C第二个$+4的值为:0082汇编语言程序设计ORG伪操作用来设置当前地址计数器的值ORG常数表达式例如:VECTORSSEGMENTORG10VECT1DW47A5HORG20VECT2DW0C596HVECTORSENDS则VECT1的偏移地址值为0AH,而VECT2的偏移地址值为14H。汇编语言程序设计EVEN伪操作使下一个变量或指令开始于偶数字节地址。一个字的地址最好从偶地址开始,所以对于字数组为保证其从偶数地址开始,可以在其前用EVEN伪操作来达到这一目的。例如:DATA_SEGSEGMENTEVENWORD_ARRAYDW100DUP(?)DATA_SEGENDS汇编语言程序设计ALIGN伪操作为保证双字数组边界从4的倍数开始创造条件。ALIGN边界其中边界必需是2的幂。例如:.DATAALIGN4ARRAYDB100DUP(?)就可以保证ARRAY的值为4的倍数。ALIGN2和EVEN等价。汇编语言程序设计基数控制伪操作汇编程序默认的数为十进制数。.RADIX伪操作可以把默认的基数改变为2~16范围内的任何基数。.RADIX表达式其中表达式用来表示基数值(用十进制表示).RADIX16汇编语言程序设计汇编语言程序格式汇编语言源程序中每个语句可以由4项组成,格式如下:[名字]操作操作数[;注释]其中:名字:是一个符号;操作:是一个操作码的助记符,可以是指令、伪操作或宏指令名。操作数:由一个或多个表达式组成,提供为执行所要求的操作所需要的信息。注释:说明程序或语句的功能。汇编语言程序设计名字项源程序中用下列字符表示名字:字母:A~Z数字:0~9专用字符?.@-$(1)标号:在代码段中定义,后面跟冒号:(2)变量:在数据段或附加段中定义,后面不跟冒号。汇编语言程序设计操作数项操作数项由一个或多个表达式组成,多个操作数项之间用逗号隔开。1算术运算符(+、-、*、/、MOD)2逻辑运算符(AND、OR、XOR、NOT)3关系运算符(EQ、NE、LT、LE、GT、GE)4数值回送操作符(SEG、OFFSET、TYPE、LENGTH、SIZE)5属性操作符(PTR、:、THIS、SHORT、HIGH、LOW)6运算符的优先级汇编语言程序设计算术运算符算术运算符包括:+、-、*、/、MOD(取余)。运算符MOD是作除法操作,取余数。如:10MOD3=1。需要注意的问题:1)算术运算符可以用于数值表达式或地址表达式中,参加运算的数和结果必须是整数,除法运算结果只有商,没有余数。2)当算术运算符用于地址表达式时,常用“地址±常量”来描述指针的移动。汇编语言程序设计将数组ARRAY的元素个数(双字数组)送到CX寄存器中。ARRAYDD1,2,3,4,5,6,7COUNTDD?┆MOVCX,(COUNT-ARRAY)/4┆假设数组ARRAY的地址是2000H,则COUNT=201CH(COUNT-ARRAY)/4=(201CH-2000H)/4=0007H汇编语言程序设计逻辑运算符包括:AND(逻辑与)、OR(逻辑或)、XOR(逻辑异或)、NOT(逻辑非)。【例】执行下列指令,计算其逻辑运算的值。MOVCL,88HXOR0FH;CL=87H100010000000111110000111(87H)汇编语言程序设计关系运算符包括:EQ(等于)(Equal)NE(不等于)(NotEqual)LT(小于)(LessThan)LE(小于等于)(LessEqual)GT(大于)(GreaterThan)GE(大于等于)(GreaterEqual)关系运算符的使用格式:表达式1关系运算符表达式2计算结果:真为全1,假为全0。汇编语言程序设计【例】MOVAX,((X