第四章汇编语言4.1、伪指令伪指令语句用来告诉汇编程序在汇编期间需要做的一些工作,如数据定义、分配存储区、指示程序结束等等。伪指令与机器指令不同的地方在于伪指令本身不产生任何目标代码,也不象机器指令那样在机器运行期间由计算机来执行,它仅在汇编期间起作用。第四章汇编语言4.1、伪指令一、定义数据存储单元伪指令格式为:[名字]伪指令操作数[;注释]名字:变量名,是一个任选项,后面不使用冒号。注释:说明该伪操作的功能。伪指令:DB、DW、DD、DQ、DT操作数:①可以是常数、表达式或字符串,每项操作数的值不能超过所定义类型限定的范围。作用:①定义变量的类型;②给存贮单元赋初值;③给变量分配存贮单元例:DATADB100,0FFHDA1DB‘GOOD!’DA2DB2*3+7STRDB‘AB’STR1DW‘AB’STR2DD‘AB’例(非法):STRDW‘ABCD’例:为数据段分配存储单元。DATASEGMENTADB11H,12H,13HBDW1122H,3344HCDD12345678HDATAENDS第四章汇编语言4.1、伪指令一、定义数据存储单元伪指令例:为字符串分配存储单元。DATASEGMENTSTR1DB‘1234’STR2DW‘AB’,‘CD’,‘A’STR3DD‘AB’DATAENDS第四章汇编语言4.1、伪指令一、定义数据存储单元伪指令第四章汇编语言4.1、伪指令一、定义数据存储单元伪指令②可以是?,仅保留相应的存贮单元,而不赋予变量某个确定的值例:ABCDB?,?DA_WDW?③带DUP的操作数,DUP是定义重复数据操作符。例:D_B1DB20HDUP(?)D_B2DB10HDUP(‘ABCD’)D_W1DW5DUP(4)④操作数可以是标号或变量例:ADR1DWSTART;将START的偏移量存入内存单元ADR2DDDA1;将DA1的偏移量和段地址存入内存单元画图说明下列语句分配的存贮空间及初始化的数据值。①BYTE_VARDB‘BYTE’,12,12H,2DUP(0,?,3DUP(1,2),?)②WORD_VARDW4DUP(0,1,2),?,-5,‘BY’,‘TE’,256H①BYTE_VARDB‘BYTE’,12,12H,2DUP(0,?,3DUP(1,2),?)42h,59h,54h,45h,0ch,12h,00,00,01,02,01,02,01,02,0000,00,01,02,01,02,01,02,00②WORD_VARDW4DUP(0,1,2),?,-5,‘BY’,‘TE’,256H00,00,01,00,02,0000,00,01,00,02,0000,00,01,00,02,0000,00,01,00,02,00-,-,FBH,FFH,59H,42H,45H,54H,56H,02第四章汇编语言4.1、伪指令二、段定义伪指令作用:定义逻辑段格式为:段名SEGMENT[定位类型][组合类型][类别名]┇;本段语句序列(程序或数据)段名ENDS每一个段都是以SEGMENT伪指令开始,以ENDS伪指令结束。①段名:由用户自己选定,通常使用与本段用途相关的名字。一个段开始与结尾用的段名应一致。②定位类型:对段的起始边界要求。可有四种选择:PARA(节):默认值。它表示本段从一个节的边界开始,一个节长度为16个字节,所以段的起始地址为XXXX0H。BYTE(字节):表示本段从一个字节的边界开始,即可以从任一地址开始。WORD(字):表示本段从一个字边界开始。即段起始地址必为偶数。PAGE(页):表示本段从一个页的边界开始。一页256个字节,所以段的起始地址为XXX00H。第四章汇编语言4.1、伪指令二、段定义伪指令③组合类型:段与段之间是怎样连接和定位的,共有六种选择:NONE:缺省项。表示本段与其它段无连接关系。PUBLIC:在满足定位类型的前提下,本段与同名的段相邻地连接在一起,形成一个新的逻辑段,装入内存。COMMON:产生一个复盖段。在连接时,把本段与其它用COMMON说明的同名段置成相同的起始地址,共享相同的存储区,互相覆盖。连接后的段长度为原最长的段,内容为最后一个逻辑段的内容。STACK:把所有同名的堆栈段连接在一起,形成一个连续段,且系统自动对SS段寄存器和堆栈指针SP初始化。用户程序中至少有一个段用STACK说明过,否则需要用户程序自已初始化SS和SP。AT表达式:表示本段可定位在表达式所指示的节边界上。如AT0930H,那么本段的段地址为0930H。注意:不能用它指定代码段。MEMORY:表示本段在存储器中应定位在所有其他段的最高地址。如有多个MEMORY,则只把第一个遇到的段当作MEMORY处理,其余的同名段均按PUBLIC说明处理。第四章汇编语言4.1、伪指令二、段定义伪指令④类别名类别名可以是任何字符串组成的名字。类别名必须用单引号(‘)括起来,它不能再作程序中的标号、变量名或其它定义符号。在连接处理时,LINK程序把类别名相同的所有段存放在连续的存储区内。第四章汇编语言4.1、伪指令datasegmentorg200Hd1db12h,34h,56h,78h,9ah,0abh,0bch,0cdhd2db0cdh,0bch,0abh,9ah,78h,56h,34h,12h;至20FHdataendsdata2segmentbyte;从210H开始strDB‘THISISANEXAMPLE!‘;占19个字节data2ends;至222Hdata3segmentpage;从300H开始bufferdw40dup(2)data3endsstacksegmentstack;从一个节开始stadb80dup(?)stackends例:第四章汇编语言4.1、伪指令三、段寻址伪指令(Assume伪指令)作用:用于指示汇编程序已定义的段与段寄存器的对应关系。格式:ASSUME段寄存器名:段名,段寄存器名:段名,……段寄存器名:指四个段寄存器CS,SS,DS,ES中的一个。段名:是指用SEGMENT/ENDS伪指令语句中定义的段名。段寄存器名与段名之间必须用冒号“:”。只通知汇编程序段寄存器和逻辑段的关系,部队段寄存器赋值,必须在程序中使用MOV指令实现。但代码段不要求用户赋初值,在堆栈段的组合类型使用STACK后,系统自动对SS赋值、初始化SP,所以用户需对DS和ES赋初值。第四章汇编语言4.1、伪指令datasegmentd1db12h,34h,56h,78h,9ah,0abh,0bch,0cdhd2db0cdh,0bch,0abh,9ah,78h,56h,34h,12hdataendsstacksegmentstackstadb80dup(?)stackendscodesegmentassumecs:code,ds:data,ss:stackstart:movax,datamovds,ax┇codeendsendstart第四章汇编语言4.1、伪指令1、赋值语句语句格式:符号EQU表达式功能:把表达式的值或符号赋给EQU左边的符号。表达式可以是常数、数值表达式、符号、变量、标号、地址表达式等。在同一源程序中,同一符号不能用EQU伪指令重新定义。四、符号赋值伪指令(1)常数或数值表达式,例如:COUNTEQU5NUMEQU13+5-4(2)地址表达式,例如:ADR1EQU[BP+14](3)变量、标号或指令助记符,例如:CREGEQUCXL1EQUSUB_STARTCBDEQUDAANUMEQU10HNUMEQU20H;因符号重新定义而出现语法错误第四章汇编语言4.1、伪指令四、符号赋值伪指令2、等号语句语句格式:符号=表达式①该语句功能与赋值语句相同。②等号语句允许重新定义。例如:CONT=5NUM=l4HNUM=NUM+10HCBD=DAACBD=ADD第四章汇编语言4.1、伪指令格式:过程名PROC(NEAR/FAR)┇RET过程名ENDP五、过程定义伪指令(PROC/ENDP)①过程名不能省略,且过程的开始(PROC)和结束(ENDP)应使用同一个过程名。②过程名具有段、偏移量和类型这三个属性。过程的类型可选择NEAR和FAR。类同一个标号的作用,隐含类型为NEAR。③可用CALL指令调用该过程:CALL过程名④过程中含有的返回语句可以是一条或多条,但最后一条必须是RET指令。第四章汇编语言4.1、伪指令六、定位伪指令(ORG)格式为:ORG表达式①表达式为一地址值②ORG语句后的指令或数据以表达式给出的地址作为起始偏移量例:DATASEGMENTORG300HDATA1DB12H,34HSTRDB’ABCDEF’DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,……ORG100HMOVAX,0┇CODEENDS第四章汇编语言4.1、伪指令七、当前位置计数器($)$:指当前偏移量例:DATASEGMENGORG30HDA1DB12H,34HORG$+20H;$=32HSTRDB‘ABCDEF’;STR从52H开始COUNTEQU$-STR;$=58H,COUNT=6DATAENDS4.2、汇编语言程序格式一、源程序结构datasegmentd1db12h,34h,56h,78h,9ah,0abh,0bch,0cdhd2db0cdh,0bch,0abh,9ah,78h,56h,34h,12hdataendsstacksegmentstackstadb80dup(?)stspequlengthstastackendscodesegmentassumecs:code,ds:data,ss:stackbg:movax,datamovds,axleabx,d2movbx,0bac1hmovax,1234haddax,bxcodeendsendbg1、分段结构——逻辑段2、每个段中含有汇编语句(指令性语句和指示性语句)3、在代码段中用ASSUME语句将段与各段寄存器相关联。第四章汇编语言第四章汇编语言4.2、汇编语言程序格式二、汇编语言组成[标识符]操作项操作数项[;注释项]标识符1、字符个数为:1~31个标识符的第一个字符必须是字母,问号“?”,“@”或下划线“_”这四种字符中的一个;从第二个字符开始,可以是字母,数字,?,@或_。2、不能使用系统专用保留字。3、标识符可以是标号,也可以是变量名。①标号:标号在代码段中定义,后面跟冒号:,标号有三种属性:段、偏移及类型。段属性:定义标号的段起始地址,此值必须在一个段寄存器中,而标号的段则总是在CS寄存器中。偏移属性:标号的偏移地址是16位元符号数,它代表从段起始地址到定义标号的位置之间的字节数。类型属性:用来指出该标号是在本段内引用还是在其它段中引用的。NEAR和FAR。②变量:变量在除代码段以外的其它段中定义,后面不跟冒号。它也有段、偏移量及类型三种属性。段属性:定义变量的段起始地址,此值必须在一个段寄存器中。偏移属性:变量的偏移地址是16位无符号数,它代表从段的起始地址到定义变量的位置之间的字节数。类型属性:变量的类型属性定义该变量所保留的字节数。如BYTE、WORD、DWORD。第四章汇编语言第四章汇编语言操作项操作项可以是指令、伪操作或宏指令的助记符。操作数项操作数可能有一个、二个或一个也没有。操作数项可以是常数、寄存器、标号、变量名或由表达式组成。标号代表一条指令的符号地址,表达式是由常数、寄存器、标号、变量与一些操作符的组合,有数字表达式和地址表达式两种。注释项注释项用来说明一段程序或一条或几条指令的功能,它是可有可无的。第四章汇编语言4.2、汇编语言程序格式三、操作符1、算术操作符+、-、*、/、MOD例:把首地址为BLOCK的字数组的第6个字传送到DX寄存器,可用指令如下:MOVDX,BLOCK+(6-1)*22、逻辑操作符AND、OR、XOR、NOT(对整常数进行逻辑运算)例:MOVAL,5AHAND0F0HANDAL,5AH——指令的源操作数为表达式——指令第四章汇编语言3、关系