1、本章学习要点:(1)常见的伪指令及它们的用法(2)汇编语言的结构一、汇编语句的种类和格式1. 语句的种类汇编语言有多种类型的语句,指令语句、伪指令语句、宏指令语句。汇编语言在对源程序进行汇编时,把指令语句翻译成机器指令,也就是说指令语句有着与之对应的机器指令。伪指令语句没有与其对应的机器指令,只是指示汇编程序如何对源程序进行汇编,包括符号的定义、变量的定义、段的定义等。通俗点讲,它实际上是属于一种说明语句。2.语句的格式指令语句格式:(标号)指令助记符(操作数(,操作数)(;注释)伪指令语句的格式如下:(名字)伪指令定义符(参数,参数)(;注释),伪指令定义符:规定了伪指令的功能参数:说明伪指
2、令操作的对象,如常数(数值表达式)等名称:给所定义的内容起的名称。在汇编语言中,名字和标号很容易区分,名字后面没有冒号,而标号后一定用冒号。标号和名字最多由31个字母、数字及规定的特殊字符组成,并且不能以数字来开头。标号和名字不能是汇编语言的保留字,如不能是“MOV”。汇编语言不区分保留字中字母的大小写。如“MOV AX ,03H”等同于“mov ax , 03h”伪指令有多种,常见的如:(1)段定义伪操作(2)数值数据定义及存储器分配(3)符号数据定义(4)程序开始和结束伪操作(5)表达式赋值伪操作此外还有基数控制伪操作、对准伪操作等。,看看下列代码有哪些伪指令:,二、常见的伪指令/伪操作(
3、1)段定义语句为了与存储器的分段结构相对应,汇编语言的源程序也是由若干个段组成。1. 段开始和段结束语句段定义的一般格式如下:段名SEGMENT 定位类型 组合类型 类型段名ENDS例:一个简单的段如下所示:DSEGSEGMENTMESS DB HELLO , 0DH , 0AH , $DSEGENDS,2. 段使用设定语句汇编程序根据段开始语句和段结束语句判断出源程序的段划分,为了有效地产生目标代码,汇编程序还要了解各程序段与段寄存器间的对应关系。这种对应关系由段使用设定语句说明。ASSUME 段寄存器名:段名,段寄存器名:段名段寄存器名可以是CS,DS,SS和ES。段名就是段开始和段结束语
4、句中规定的段名。例如:CS寄存器对应CSEG段,DS寄存器对应DSEG段。ASSUME CS : CSEG , DS : DSEGASSUME伪指令中段名也可以是一个特别的关键字NOTHING,它表示某个段寄存器不与任何段有对应关系。,DSEG1 SEGMENTVARW DW 12DSEG1 ENDSDSEG2 SEGMENTXXX DW 0DSEG2 ENDSCSEG SEGMENTASSUME CS:CSEG , DS: DSG1 , ES : DSG2MOV AX , DSEG1MOV DS , AXMOV AX , DSEG2MOV ES , AXASSUME DS: DSG2 , E
5、S :NOTHINGMOV AX , DSEG2MOV DS , AXDSEG ENDS,(2)关于数值数据定义语句及存储器分配通过数值数据定义语句可以为数据项分配存储单元,并根据需要设置其初值。还可以用符号代表数据项,此时符号就与分配的存储单元相联系。代表数据项的符号本省称为变量名,与之相对应的存储单元用于存放变量。 1. 数据定义的格式数据定义语句是最常用的伪指令语句。一般格式如下:变量名 数据定义符 表达式,表达式,表达式;注释例如:VARB DB3WARW DW -1234BUFF DB 100 , 3+4 , 5*6,1)定义字节数据项(DB)每一个字节数据项只占用一个字节存储单元例
6、:COUNT DB 100 DB 0DH ,0AH , $ TABLEDB 0 , 1 , 4 , 9 , 162)定义字数据项(DW)每一个字数据项只占用两个字节存储单元例:FLAG DW 2FCDH, 100,-1 VECTDW 0 DW 100H3)定义双字数据项(DD)每一个双字数据项只占用四个字节存储单元例:VECTOR DD 4 FARPTRDD 12345678H, 0此外,还可以定义8字节的数据项(DQ),10字节的数据项(DT),4)定义没有初值的数据项如果数据定义语句中的表达式只是一个问号(?),则表示不预置对应变量的初值,而仅仅是给变量分配存储单元。例:INBUFF DB
7、 5 , ? , ? , ? , 8 , ? VARWDW ? OLDVDD ?5)定义字符串定义字节数据的伪指令DB也可以用于方便地定义字符串。字符串要用引号括起来,单引号和双引号皆可,只要配对。例如:MESS DB HELLO!上述语句与如下语句定义内容相同:MESS DB H , E , L , L , O , !,2. 重复操作符DUP有时需要定义数组,有时还需要定于数据缓冲区。例如: BUFFER DB 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 以上操作太不方便,为此,汇编语言停供了在数据定义语句中使用的重复操作符DUP。比如,上述定义语句与如下定义语句起相同的作用
8、:BUFFER DB 8 DUP(0)重复操作符DUP的一般格式如下:count DUP (表达式, 表达式, )例如: BUFFER1 DB 5 , 0 , 5 DUP(?)BUFFER2 DB 100 DUP(0 , 2 DUP(1 , 2) , 0 , 3)BUFFER3 DB 256 DUP(ABCDE),(3)关于符号数据的定义语句1. 等价语句EQU格式 EQU 表达式例:COUNT EQU 100;符号COUNT就代表常数100BUFF_LEN EQU 4*COUNT;COUNT是已定义的符号常数HELLO EQU “How are you!”例:MOVE EQU MOVCOUN
9、T EQU CX在安排上述语句后,就可以用MOVE代替指令助记符MOV,用COUNT代替寄存器CX。当然,MOV和CX仍可以照样使用。当遇到:MOVE AX , CX;MOV AX , CXMOVE COUNT , 100;MOV CX , 100需要注意:第1,等价语句不另外给符号分配存储单元;第2,等价语句定义的符号不能与其它符号相同,也不能被重新定义。,2. 等号语句(=)汇编语言专门提供了符号语句来定义符号常数,即用符号表示一个常数。等号语句的一般格式如下:符号名 = 数值表达式例如:XX = 10用符号定义语句可被重新定义。例如:ABCD = 1ABCD = 100,3. 定义符号名
10、语句格式:符号名 LABEL 类型其中类型可以是BYTE、WORD、DWORD、NEAR、FAR,其中前3项对应于数据项,后2项对应于可执行代码。功能:指定为某一类型的符号,且该符号的段属性和偏移属性与下一个紧接着的存储单元的段属性和偏移属性相同。例如:BUFFER LABEL WORDBUFF DB 100 DUP(0)定义了一个符号BUFFER,其类型是WORD。因为段属性与偏移属性和BUFF相同,所以内容为0000H。又如:QUIT LABEL FAREXIT:MOV AH , 4CH“MOV AH , 4CH”有了QUIT和EXIT两个标号。,(4)程序开始与结束伪操作END 伪操作格
11、式: END 标号其中标号表示程序开始执行的起始地址。注意:程序是从END所指的“标号”开始执行,遇到END指令后结束。如果END没有指定标号,则从相应代码段从开始运行。,注意以下2个程序的区别:,(5)对准伪操作1. EVEN格式:EVEN功能:使紧随其后的内容从偶地址开始存储。DSEG SEGMENTEVENWORD_ARRAY DW 100 DUP(?) DSEG ENDS,2. ORG格式: ORG 常数表达式功能:使紧随其后的内容从表达式所指定的地址开始存储。DSEG SEGMENTORG 10VECT1 DW 47A5HORG 20VECT2 DW 1234H DSEG ENDS,
12、可以使用符号$来代表当前正在汇编的指令的地址。例:已知ARRAY的偏移量为0074H,试写出下列语句所分配空间的内容ARRAY DW 1 , 2 , $+4 , 3, 4, $ + 4,三. 关于表达式的伪操作(1)数值表达式1.常数常数有多种类型和表示方式,如:1)十进制常数,以字母D结束为标识。例:MOV AX , 178D2)十六进制常数,以字母H结束为标识例:MOV AL , 0AH注意,在程序编写时,十六进制数必须以数字开头。例:要使(AL)为ABH,程序必须使用下列写法:MOV AL , 0ABH3)二进制常数,以字母B结束为标识例:OR AL , 11001010B TEST B
13、L , 00101000B4)八进制常数,以字母Q结束为标识,如127Q。,5)字符串常数(串常数)串常数的值是包括在引号中的字符的ASCII代码值。例:A的ASCII码值是41HCMP AL , A相当于 CMP AL , 41H6)伪指令RADIX设置其后数值的缺省进制格式:RADIX expexp的值必须是区间2,16内的一个整数。例如:RADIX 8MOV AL , 10RADIX 16MOV AH , 10但是,为了避免混淆和不必要的误会,我们提倡慎用RADIX.,2. 算术运算符算术运算府包括正(+)、负(-),加(+)、减(-)、乘(*)、除(/)和模(MOD),这些算术运算符的
14、意义与高级语言中同样运算符的意义相似。ADD AX , 100 * 4 + 2 ; 100 * 4 + 2就构成了一个算术表达式SUB CX , 100H / 2MOV AL , -33.关系运算符关系运算符包括相等(EQ)、不等(NE)、小于(LT)、大于(GT)、小于或等于(LE)、大于或等于(GE)。若关系不成立,则结果为0(一个数值);若关系成立,则结果为FFFFH(一个数值)。例如, MOV AX , 1234H LT 1024H等同于 MOV AX , 0HMOV BX , 1234H GT 1024H等同于 MOV BX , 0FFFFH,4. 逻辑运算符逻辑运算符包括按位操作的
15、“与”(AND)、“或” (OR) 、“非” (NOT) 、“异或” (XOR) 、“左移”(SHL)和“右移” (SHR)。逻辑运算的结果也是数值。例:MOV BX , (VAL LT 5) AND 20) OR (VAL GE 5) AND 30)当VAL 5时,汇编的结果应该是:MOV BX , 20否则,汇编结果应该是:MOV BX , 30注意:逻辑运算符和指令助记符的区别,表达式中的逻辑运算符属于伪指令,在汇编时起说明作用;而指令助记符则有机器指令与之对应。,5. 在数值表达式中使用操作符(1)HIGH、LOW功能:取数值表达式的值的高8位(或低8位)。例:MOV AL , LOW
16、 3080H将汇编成:MOV AL , 80HMOV AH , HIGH 2050H将汇编成:MOV AH , 20HMOV AH , HIGH(1234H + 5)将汇编成:MOV , 12HMOV AH , HIGH 1234H + 5将汇编成:MOV AH , 17H注意:最后1题为什么是先取1234H的高8位再加5,而不是先加5再取高8位?,6. 优先级汇编语言中各种运算符和操作符的优先级按高到低排列如下:(1)圆括号,尖括号,方括号,圆点符,LENGTH,SIZE,WIDTH , MASK。(2)PTR, OFFSET,SEG,TYPE, THIS,冒号。(3)* , / , MOD
17、, SHL, SHR(4)HIGH, LOW(5)+ , -(6)EQ,NE,LT,LE,GT,GE(7)NOT(8)AND(9)OR , XOR(10)SHORT,7. 其它操作符SEG、OFFSET、TYPE、LENGTH、SIZE、PTR1)SEG 变量名或标号功能:取变量或标号所在段的段值2)OFFSET 变量名或标号功能:取变量或标号在段中的偏移例:定义变量如下,假设VARW的段内偏移为100H。VARW DW 1234H, 5678HVARB DB 3,4MOV AX, SEG VARWMOV DS, AXMOV BX, OFFSET VARW; 100H 送BXMOV DI, O
18、FFSET VARW 2;102H送DI, ;OFFSET优先级高于+MOV SI, OFFSET VARB; 104H送SI,3)TYPE 变量名或标号功能:返回变量或标号的类型。定义常见类型及其对应数值如下:字节(BYTE)变量:1字(WORD)变量:2双字(DWORD)变量:4近(NEAR)标号:-1远(FAR)标号:-2可见:变量的类型值是对应类型变量所占用的字节数,而标号的类型值却没有实际的物理意义。例:假设变量VARW的定义为“VARW DW 1234H, 5678H”ADD SI, TYPE VARW将汇编成:ADD SI , 2,4)LENGTH 变量名功能:返回利用DUP定义
19、的数组中元素的个数。如果变量定义语句中没有使用DUP,则总返回1。如果嵌套使用了DUP,则只返回最外层的重复数。例:定义变量如下VARW DW 1234H, 5678HVARB DB 3,4VARD DD 5 DUP(?)则MOV CX, LENGTH VARW;1送CXMOV CX, LENGTH VARB;1送CXMOV CX, LENGTH VARD;5送CX,5)SIZE 变量名功能:返回利用DUP定义的数组占用字节的个数。可按下式计算:SIZE 变量 = (LEGNTH 变量)* (TYPE 变量)例:定义变量如下VARW DW 1234H, 5678HVARB DB 3,4VARD
20、 DD 5 DUP(?)则MOV CX, SIZE VARW;2送CXMOV CX, SIZE VARB;1送CXMOV CX, SIZE VARD;20送CX,例:对于下面数据定义,各条指令单独执行后,寄存器的内容是什么?FLDB DB ?TABLE DW 20 DUP(?)TABLEA DB ABCDMOV AX, TYPE FLDBMOV AX, TYPE TABLEMOV CX, LENGTH TABLEMOV DX, SIZE TABLEMOV CX, LENGTH TABLEA寄存器内容分别为: (AX)=1; (AX)=2; (CX)=20; (DX)=40; (CX)=1;,6
21、)PTR功能:指定或临时改变变量和标号的类型。格式:类型 PTR 地址表达式类型可以是BYTE、WORD、DWORD、NEAR、FAR。PTR操作符并不分配存储单元,而只是临时性地强制指定变量或标号的类型。REP MOVS ES:WORD PTR DI,DS:SIREP MOVS ES:BYTE PTR DI,DS:SIJMP FAR PTR OK,四.完整的汇编程序示例1:串拷贝,示例2:查表要求:内存单元TAB首地址开始存放了09的平方数。直接利用查表方式完成将由A单元给定数(小于等于9)的平方值送B单元保存并打印出来。,其中,红色方框内的内容可替换为:XLAT(translate)为换码指令格式:XLAT(通常无需指定操作数,其操作数有默认的寄存器进行设定)功能: (AL) (BX)+ (AL)这也充分说明了学好汇编语言的重要前提是学习好指令系统。,