汇编语言源程序格式.ppt
《汇编语言源程序格式.ppt》由会员分享,可在线阅读,更多相关《汇编语言源程序格式.ppt(97页珍藏版)》请在三一办公上搜索。
1、第2章 汇编语言程序格式,2.1 汇编语言语句格式2.2 伪指令2.3 汇编语言源程序基本框架,2.1 汇编语言语句格式,同其他程序设计语言一样,汇编语言的翻译器(汇编程序)对源程序有严格的格式要求。这样,汇编程序才能确切翻译源程序,形成功能等价的机器指令(目标代码),连接后能直接运行。汇编语言程序格式就是汇编语言必须遵循的语法规则。,2.1.1 汇编语言语句类型,汇编语言源程序由语句序列构成,汇编语言程序中的语句可以分为指令语句、伪指令语句和宏指令语句三种。(1)指令语句:对应于CPU指令系统中的一条机器指令,由CPU执行,能完成一定操作功能,能够翻译成机器代码的语句。(2)伪指令语句:无对
2、应的机器指令,不由CPU执行,只为汇编程序在翻译汇编语言源程序时提供有关信息,并不翻译成机器代码的语句。(3)宏指令语句:就是由若干条指令语句形成的语句,一条宏指令语句的功能相当于若干条指令语句的功能,详见第5章。,2.1.2 汇编语言语句格式,汇编语言源程序中的每个语句可以由4项组成,格式如下:名字:操作码 操作数,操作数;注释其中,名字项是一个符号项。操作码项是一个操作码的助记符,它可以是指令、伪指令或宏指令名。操作数项由一个或多个表达式组成,它提供为执行所要求的操作而需要的信息。注释项用来说明程序或语句的功能。“;”为识别注释项的开始。带方括号的项是可选项,需要根据具体情况而定。汇编语言
3、源程序中的每条语句一般占一行,各项之间必须用空格或制表符作为分隔符,操作数之间用逗号分隔。,1名字项名字是用户按照一定规则定义的标识符,可由下列符号组成:字母 AZ、az数字 09 特殊字符?、.、_、$数字不能作名字项的第一个字符。而圆点仅能用作第一个字符,可以用很多字符来说明名字,但只有前面的31个字符能被汇编程序所识别。为了便于记忆,名字的定义应该能够见名知义,如用BUFFER表示缓冲区、SUM表示累加和等。名字有两种形式:标号或变量。指令语句中的名字通常用标号表示,而伪指令语句中的名字通常用变量名、段名和过程名表示,多数情况下用变量名表示。,(1)标号标号在代码段中定义,也可以用EQU
4、或LABEL伪指令来定义,标号与其所代表的指令之间用冒号分开,用来代表一条指令所在单元的地址。标号也可以作为过程名定义。标号经常在转移指令的操作数字段出现,用以表示转向的目标地址。标号在命名时,应尽量取有意义的字符,以便程序的阅读和理解。,标号有3种属性:段属性、偏移属性和类型属性。段属性:标号所代表指令单元的段起始地址,此值必须在一个段寄存器中,而标号的段则总是在CS寄存器中。偏移属性:标号所代表指令单元的段内偏移地址,标号的偏移地址是从段起始地址到定义标号的位置之间的字节数。对于16位段是16位无符号数。类型属性:用来指出标号是在本段内引用还是在其他段中引用的。如是在段内引用的,则称为NE
5、AR,转移源和转移目标在同一个代码段中,转移时,只改变IP值,不改变CS值;如在段外引用,则称为FAR,转移源和转移目标在不同的代码段中,转移时,既改变IP值,又改变CS值。,(2)变量 变量在除代码段以外的其它段中定义,后面不跟冒号。它也可以用EQU或LABEL伪指令来定义。变量是一个可以存放数据的存储单元的名字,即存放数据的存储单元的地址符号名。变量用DB、DW、DD定义,此时变量名仅表示该数据区或存储区的第一个数据单元的首地址。变量经常在操作数字段出现。,变量也有3种属性:段属性、偏移属性和类型属性。段属性:变量所代表数据单元的段起始地址,此值必须在一个段寄存器中(DS、ES或SS中)。
6、偏移属性:变量所代表数据单元的段内偏移地址,变量的偏移地址是从段的起始地址到定义变量的位置之间的字节数。对于16位段是16位无符号数。在当前段内给出变量的偏移值等于当前地址计数器的值,当前地址计数器的值可以用$来表示。类型属性:变量的类型属性定义该变量所保留的字节数,如BYTE(1个字节长),WORD(2个字节长),DWORD(4个字节长)。这一点,将在数据定义伪指令中说明。在同一个程序中,同样的标号或变量的定义只允许出现一次,否则汇编程序会指示出错。,2操作码项,操作码项可以是指令、伪指令或宏指令的助记符。助记符表示指令语句的功能,如INC、MOV等,其符号与意义是由系统定义的,编程时必须照
7、写不误,既不能多写,也不能少写,如果指令带有前缀(如REP、REPE等),则指令前缀和指令助记符要用空格分开。对于指令,汇编程序将其翻译为机器语言指令。对于伪指令,汇编程序将根据其所要求的功能进行处理。对于宏指令,则将根据其定义展开。在第5章中将会专门讨论。,3操作数项,指令中的操作数用来指定参与操作的数据。对于一般指令,可以有一个或两个操作数,也可以没有操作数;对于伪指令和宏指令,可以根据需要有多个操作数。操作数多于一个时,各操作数之间用逗号分开。,操作数可以是常数、寄存器、标号、变量或由表达式组成。在这里,将专门对表达式加以说明。表达式是常数、标号、变量、寄存器与一些操作符相组合的序列,可
8、以有数字表达式和地址表达式两种。数字表达式由汇编程序根据优先级规则计算得到一个常数值。地址表达式由汇编程序计算得到一个地址或一个常数值(地址间的距离长度)。组成表达式的操作符有算术、逻辑、关系、数值返回、属性操作符。,常用的操作符,算术操作符逻辑与移位运算符关系运算符 数值返回运算符 属性运算符,算术操作符算术运算符包括:+、*、/、MOD(取余)。运算符MOD是作除法操作,取余数,如10 MOD 3=1。算术运算符可以用于数字表达式或地址表达式中。但当它用于地址表达式时,只有当其结果有明确的物理意义时才是有效的结果,例如,两个地址相乘或相除是无意义的。在地址表达式中,可以用+或-,但也必须注
9、意其物理意义,例如把两个不同段的地址相加也是无意义的。经常使用的方法是“地址常量”来描述指针的移动,例如,SUM+1是指SUM字节单元的下一个字节单元的地址(注意:不是指SUM单元的内容加1),而SUM-1则是指SUM字节单元的前一个字节单元的地址。,【例2.1】将首地址为ARRAY的字数组的第6个字传送到DX寄存器中。MOV DX,ARRAY+(6-1)*2【例2.2】数组ARR定义如下,试写出把数组长度(字数)存入CX寄存器的指令。ARR DW 1,2,3,4,5,6,7ARREND DW?其中,ARREND是为计算数组长度而建立的符号地址,则指令如下:MOV CX,(ARREND-ARR
10、)/2汇编程序在汇编期间将计算出表达式的值而形成指令:MOV CX,7,(2)逻辑与移位运算符逻辑运算符逻辑运算符包括:AND(逻辑与)、OR(逻辑或)、XOR(逻辑异或)、NOT(逻辑非)。逻辑运算符是按位操作的,它的操作数只能是数字,且结果也为数字。逻辑运算符只能用在数字表达式中,不能用在地址表达式中。逻辑运算符和逻辑运算指令是有区别的,逻辑运算符的功能在汇编阶段完成,逻辑运算指令的功能是在程序执行阶段完成。要注意AND、OR、XOR、NOT不是助记符,而是运算符。,【例2.3】AND AL,78H AND 0FH等价于:AND AL,08H【例2.4】设VALUE是字节型变量,分析下面这
11、条语句执行完AL寄存器的内容。MOV AL,VALUE AND 01H在汇编后,该语句的源操作数(VALUE AND 01H)可能产生两个结果之一:当VALUE值的D0位为1时,VALUE和01与操作的结果为01H,则该语句变成MOV AL,01H;当VALUE值的D0位为0时,VALUE和01与操作的结果为00H,则该语句变成MOV AL,00H。因此,执行后AL寄存器的内容为01H或00H。,移位运算符移位运算符有:SHL(逻辑左移)、SHR(逻辑右移)格式:表达式 SHL(或SHR)n(移位次数)汇编程序将表达式左移或右移n位,高位或低位补0,若移位次数大于15,则结果为0。【例2.5】
12、VAL EQU 5H;符号常量VAL值=5H MOV AL,VAL SHR 1;VAL=00000101B逻辑 右移1位为00000010=2注意:移位运算符SHL/SHR在操作数中,汇编时对常量进行移位;而移位指令SHL/SHR是在指令的操作码位置,执行时对寄存器或存储器单元中的操作数移位。,(3)关系运算符关系运算符包括:EQ(等于)、NE(不等)、LT(小于)、GT(大于)、LE(小于等于)、GE(大于等于)6种。格式:表达式1 关系运算符 表达式2计算结果,若关系成立,则为全1,即0FFFFH;关系不成立,则为全0。,【例2.6】MOV BX,32 EQ 45 等价于:MOV BX,0
13、【例2.7】MOV BX,56 GT 30 等价于:MOV BX,0FFFFH【例2.8】MOV BX,(VAL LT 5)AND 20)OR(VAL GE 5)AND 30)当VAL5时,汇编结果应该是:MOV BX,20 当VAL5时,汇编结果应该是:MOV BX,30,(4)数值返回运算符数值返回运算符包括:SEG(取段地址)、OFFSET(取偏移地址)、TYPE(取类型值)、LENGTH(取长度)、SIZE(取总字节数)这些操作符把一些特征或存储器地址的一部分作为数值回送,但不改变源操作数的属性。,SEG格式:SEG 变量名/标号汇编程序将回送变量或标号的段地址值。【例2.9】如果DA
14、TA_SEG是从存储器的05000H开始的一个数据段的段名,OPER1是该段中的一个变量名,则MOV BX,SEG OPER1将把05000H作为立即数插入指令。实际上,由于段地址是由连接程序分配的,所以该立即数是连接时插入的。执行期间则使BX寄存器的内容变成为05000H,OFFSET格式:OFFSET 变量名/标号 汇编程序将回送变量或标号的偏移地址。【例2.10】MOV BX,OFFSET OPER_2汇编程序将OPER_2的偏移地址作为立即数回送给指令,而在执行时则将该偏移地址装入BX寄存器中,所以这条指令与LEA BX,OPER_2是等价的。,TYPE格式:TYPE 变量名/标号 如
15、果该表达式是变量,则汇编程序将回送变量的以字节数表示的类型:DB为1,DW为2,DD为4。如果该表达式是标号,则汇编程序将回送代表该标号类型数值:NEAR为-1,FAR为-2。如果表达式为常数,则应回送0。【例2.11】ARRAY DW 1,2,3则对于指令:ADD SI,TYPE ARRAY汇编程序将其形成为:ADD SI,2,LENGTH格式:LENGTH 变量名对于变量中使用DUP的情况,汇编程序将回送分配给该变量的单元数,对于其他情况则送1。【例2.12】FEES DW 100 DUP(0)对于指令:MOV CX,LENGTH FEES汇编程序将其形成为:MOV CX,100,SIZE
16、格式:SIZE 变量名汇编程序应回送分配给该变量的总字节数,也就是LENGTH和TYPE的乘积,即:SIZE=LENGTHTYPE【例2.13】FEES DW 100 DUP(0)对于指令:MOV CX,SIZE FEES汇编程序将其形成为:MOV CX,200,(5)属性运算符属性运算符包括:PTR(属性修改运算符)、“:”(段跨越前缀符)和SHORT(短取代运算符)。PTR格式:类型 PTR 表达式是属性修改运算符,用PTR来建立符号地址,但它本身并不分配存储器,只是用来给已分配的存储地址赋予另一种属性,使该地址具有另一种类型,仅在本语句有效。格式中的类型字段表示所赋予的新的类型属性,而表
17、达式字段则是被取代类型的符号地址。,【例2.16】已有数据定义如下:ARRAY DW?可以用以下语句对这两个字节赋予另一种类型定义:ARRAY1 EQU BYTE PTR ARRAYARRAY2 EQU BYTE PTR(ARRAY+1)这里,ARRAY和ARRAY1两个符号地址具有相同的段地址和偏移地址,但是它们的属性类型不同,前者为1,后者为2。,此外,有时指令中也要求使用PTR运算符。例如,当汇编程序遇到“MOV BX,5”指令时,指令要求把立即数5存入BX寄存器内容所指定的存储单元中,但是,汇编程序不能分清是存入字单元还是字节单元,此时必须用PTR运算符来说明属性,应该写明:MOV B
18、YTE PTR BX,5或MOV WORD PTR BX,5,:格式:段寄存器:地址表达式“:”称为段运算符,又称为段跨越前缀符。用于临时给变量、标号或地址表达式指定一个段属性,地址表达式的EA和类型属性不变。在指令中代替默认的段以形成物理地址。【例2.17】MOV AX,ES:BX+SI;PA=ES*16+EA,临时替换默认的DS,SHORT短取代运算符,用来修饰JMP指令中转向地址的属性,指出转向地址是在下一条指令地址的-128+127个字节范围内。【例2.18】JMP SHORT NEXTNEXT:MOV AX,BX,(6)运算符的优先级以上说明了5类常用的运算符,在计算表达式时,应该首
19、先计算优先级高的运算符,同级运算符从自左向右进行计算。下面给出运算符的优先级别,从高到低排列如下:()、LENGTH、SIZE,然后是段跨越前缀符“:”PTR、OFFSET、SEG、TYPE、THIS以及段运算符HIGH、LOW*、/、MOD、SHL、SHR+、-EQ、NE、LT、LE、GT、GENOTANDOR、XORSHORT,4注释项注释项由分号“;”开始,用来说明一条指令或一段程序的功能,它不属于程序本身,在汇编过程中,汇编程序不会对注释作任何加工,这部分不产生机器代码,注释只是为了增加程序的可读性,便于阅读、理解和修改程序。对于汇编语言程序来说,注释项的作用是很明显的,读者应该在编写
20、汇编程序的过程中,注意学会写好注释。,2.2 伪指令,2.2.1 处理器选择伪指令2.2.2 数据定义伪指令2.2.3 模块命名和标题伪指令2.2.4 程序结束伪指令(END)2.2.5 完整段定义伪指令(SEGMENT、ENDS、ASSUME)2.2.6 简化段定义伪指令2.2.7 表达式赋值伪指令2.2.8 定位伪指令(ORG)2.2.9 标号定义伪指令(LABEL),2.2.1 处理器选择伪指令,由于80 x86的所有处理器都支持8086/8088指令系统,但每一种高档的机型又都增加一些新的指令,因此,在编写程序时要对所用处理器有一个明确的选择。此类伪指令格式为:8086;选择8086指
21、令系统 286;选择80286指令系统 286P;选择保护模式下80286指令系统 386;选择80386指令系统需要注意的问题:(1)处理器选择伪指令在完整和简化两种程序框架中均可使 用。(2)缺省时为选择8088/8086微处理器指令系统。,2.2.2 数据定义伪指令,程序中所涉及到的大量初始数据、中间数据和结果数据,一般都要在程序设计时进行预置和分配存储空间,可以通过数据定义伪指令实现,其格式为:变量名 DB 表达式;定义字节型变量,每个操 作数占1个字节的内存单元变量名 DW 表达式;定义字型变量,每个操作 数占2个字节的内存单元变量名 DD 表达式;定义双字型变量,每个操 作数占4个
22、字节的内存单元,其中,DB、DW、DD称为伪指令助记符,分别用来定义字节型、字型、双字型变量。数据定义伪指令可用于除代码段以外的任何段中,但主要用于数据段和附加数据段中,用来按名字存取其对应的内存单元。数据定义伪指令可以为一个或连续的存储单元设置数值初值。其中变量名、助记符和操作数之间以空格隔开,且方括号中内容为可选项。表达式可为如下几种情况:常数表达式、问号(?)、地址表达式(适用DW和DD)、字符及字符串(适用于DB)、重复子句DUP(表达式)、用逗号分开的上述各项。,需要说明的是:(1)若是字符串且是DB类型时,必须以单引号括起来,括起来的字符个数不能超过255个,字符串以ASCII码的
23、形式按地址递增的顺序依次存放在以变量名开始的内存单元中;(2)若是?时,表示为变量预留内存单元。例如:X1 DB?;为变量X1预留1个字节单元;(3)若是带DUP的表达式表示定义多个相同的操作数和要预留多个内存单元。DUP的使用格式如下:表达式 DUP(操作数项)表达式为要重复的次数;操作数表示要重复的内容,可以是常数或表达式、字符串、?和带DUP的表达式。,【例2.19】操作数可以是常数,或者是表达式。DATA1 DB 12,4,10H;每个操作数占用一个字节单元DATA2 DW 100,100H,-5;每个操作数占用一个字单元DATA3 DD 3*20,0FFFDH;每个操作数占用一个双字
24、单元汇编程序可以在汇编期间在存储器中存入数据,如图2.1所示。,图2.1 例2.19的汇编结果,【例2.20】操作数也可以是字符串。下面3个定义语句是等价的。存储器存储情况如图2.2所示。STR1 DB ABCD;存放地址由低到高分别为:41H、42H、43H、44HSTR1 DB A,B,C,DSTR1 DB 41H,42H,43H,44H,图2.2 例2.20的汇编结果,2.2.3 模块命名和标题伪指令,1模块命名伪指令(NAME)格式:NAME 模块名该命令表示一个模块的开始,并给出该模块名。如果程序中没有使用NAME伪指令,也可以使用TITLE伪指令来给源程序设置标题,以后每页的第一行
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 源程序 格式

链接地址:https://www.31ppt.com/p-6186522.html