资源描述
1,第3章汇编语言程序结构,一、汇编语言源程序的基本结构二、汇编语言源程序中的语句三、常量、变量、标号与表达式四、伪指令五、操作符六、汇编语言上机过程,教学重点:指令语句格式和伪指令语句格式;汇编语言程序格式;汇编语言的上机过程教学难点:伪指令的应用;运算符、操作符的应用;伪指令存储器分配技术,2,DATASEGMENTSTRDB0DH,0AH,Howareyou!$DATAENDSSTACKSEGMENTSTACKDB100DUP(0)STACKENDSCODESEGMENTASSUMEDS:DATA,CS:CODE,SS:STACKBEGIN:MOVAX,DATAMOVDS,AXLEADX,STRMOVAH,9INT21HMOVAH,4CHINT21HCODEENDSENDBEGIN,汇编语言的一个实例P81,3,一、汇编语言源程序的基本结构,完整的汇编语言源程序由段(代码段、数据段、附加段或堆栈段)组成;一个汇编语言源程序必须包含一个代码段,并指示程序执行的起始点,一个程序只有一个起始点。数据段、堆栈段和附加段视情况而定。每个段由若干语句行组成。语句行是汇编的编程基础。所有的指令必须位于某一个代码段内,伪指令可根据需要位于任一段内。段以“SEGMENT”开始,以“ENDS”结束。段由用户定义。,4,二、汇编语言源程序中的语句,1、语句的分类2、语句的格式,5,1、汇编源程序中语句的分类,指令性语句(指令/硬指令)指示性语句(伪指令)宏指令(第章),使CPU产生动作、并在程序执行时才处理的语句,就是第3章学习的处理器指令。,不使CPU产生动作、在程序执行前由汇编程序处理的说明性语句,例如,数据说明、变量定义等等。,6,2、汇编源程序中语句的格式,指令的格式:标号:操作码操作数;注释伪指令的格式:名字伪指令操作数;注释,共同点:每一语句行都由4部分组成,各部分之间至少要用一个空格作为间隔。,不同点:在形式上:带不带冒号,是否可转向它。在本质上:汇编时能否形成对应的机器码。,7,1、常量,1)数值常量2)字符常量)符号常量,三、常量、变量、标号与表达式(续),数值常量,8,字符串常量是用单引号或双引号引起来的一个或多个字符。字符串常量是以各字符的ASC码表示的。如A用41H表示,字符串A1B2用41H,31H,42H,32H表示。,字符串形式的常量,对经常使用的数值常量可以先为它定义一个名字,然后在语句中用名字来表示该常量。符号常量需要用等价伪指令EQU和等号伪指令“=”来定义。,符号常量,三、常量、变量、标号与表达式(续),9,变量:变量是一个存放数据的存储单元的名字,用变量名来表示,变量名由用户自定义。变量实际上表示数据初值表首元素的地址;用这个变量名表示,常称为符号地址,在程序中作为存储器操作数来使用。如例子中BLOCK、BUFF。一般在数据段中定义。由于汇编语言中存储单元是分段使用的,所以变量具有三种属性:段值(SEGMENT)变量定义所在段的段地址。偏移量(OFFSET)变量所指的单元地址与段起始地址之间的位移量。类型(TYPE)有字节(byte)、字(word)和双字(doubleword)等。,三、常量、变量、标号与表达式(续),提示:每一个变量定义后都具有此三种属性,设置变量名是为了方便存取它指示的存储单元。,10,标号是一条指令语句的符号地址。在汇编源程序中,只有在需要转向一条指令语句时,才为该指令语句设置标号,以便在转移类指令(含子程序调用指令)中直接引用这个标号。因此,标号可作为转移类指令的操作数,即转移地址。标号也有三种属性:段值:所在段的段地址,总是在CS段寄存器中;偏移量:与变量相同,所在段的段内偏移地址;类型:分NEAR和FAR两种。其中:NEAR表示标号所在语句与转移指令或调用指令在同一码段内,只需改变IP即可。FAR标号所在语句与转移指令或调用指令不在同一码段内。若没有对类型进行说明,默认为NEAR。,三、常量、变量、标号与表达式(续),11,例:测试为0或1,若要检测AL中的最低位是否为1,若为1则转移。testal,01h;测试AL的最低位D0jnzthere;标志ZF=0,即D0=1;则程序转移到there.;否则ZF=1,即D0=0,顺序执行there:.,TEST,12,表达式是由运算符(操作符)将常数、寄存器、标号、变量组合起来的式子,分数值表达式和地址表达式两种。汇编时按一定的优先规则对表达式进行计算。,表达式,(1)算术运算符,(2)逻辑运算符,(3)关系运算符,三、常量、变量、标号与表达式(续),下面介绍三种运算符:,数值表达式,算术表达式(利用算术运算符),逻辑表达式(利用逻辑运算符),关系表达式(利用关系运算符),13,有+、-、*、/以及MOD(取余),其中MOD表示除法运算后得到的余数。例:19/7的商是2,19MOD7则为5(余数)算术运算符可以用于数值表达式,例:MOVAL,2*7,(1)算术运算符,14,逻辑运算符有AND、OR、XOR和NOT,它们只能用于数值表达式中。例:MOVCL,36HAND0FH经汇编后:MOVCL,06H这些逻辑运算符也是8086的指令助记符,会不会造成混乱呢?不会的,逻辑运算符在汇编时进行,而指令助记符在指令执行时进行。例:ANDDH,PORTAND0FEH后一个逻辑运算符AND在汇编时进行,若PORT为81H,则汇编后表达式算出为80H。执行前一个指令助记符AND时,将DH与80H相与,结果在DH中。,(2)逻辑运算符,ANDDH,PORTAND0FEH,15,【例】用逻辑运算符进行运算。MOVAL,34HAND0FH;04HALMOVBL,05HOR30H;35HBLMOVCX,NOT00FFH;0FF00HCXMOVDX,789AHXOR000FH;7895HDXMOVAL,0FHSHL4;AL=11110000BMOVBL,0FHSHR4;BL=00000000B,16,共有6个,分别是:EQ(相等),NE(不等),LT(小于),GT(大于),LE(小于或等于),GE(大于或等于)关系运算符的两个操作数必须都是数字或者是同一段内的两个存储器地址。结果始终是一个数字值。若:关系为真,结果为0FFFFH关系为假,结果为0例:MOVBX,PORTGE5若PORT的值大于等于5,则汇编后为:MOVBX,0FFFFH若PORT的值小于5,则汇编后为:MOVBX,0,(3)关系运算符,提示:不单独使用关系运算符,通常将关系运算符与逻辑运算符组合起来使用。,17,运算符的优先级,1()LENGTHOFSIZEOFWIDTHMASK2PTROFFSETSEGTPYETHIS:3HIGELOW4*/MODSHLSHR5+-6EQNEGTLTGELE7NOT8AND9ORXOR10SHORT,18,地址表达式在后面变量中讲,19,四、伪指令,段定义伪指令SEGMENT/ENDS符号定义伪指令变量定义伪指令LABEL类型定义伪指令假定伪指令ASSUME置汇编地址计数器伪指令ORG源程序结束伪指令,20,段定义伪指令,因8086/8088CPU的存储器是分段的,这就需要有段定义语句。1、段定义伪指令的格式如下:段名SEGMENT定位类型组合类型类别段名ENDS解释:SEGMENT和ENDS这两个伪指令总是成对出现,二者前面的段名一致,由用户起。二者之间的删节部分,一般是符号、变量定义等伪指令。对于数据段、附加段及堆栈段同数据段,对于代码段一般则是指令。,21,、符号定义伪指令,等值伪指令EQU格式:符号名EQU表达式例:AEQU100BEQUA说明:EQU伪指令在未解除前,不能重新定义。等号(=)伪指令与EQU类似,但允许重新定义例:EMP=7;值为7EMP=;值为8,已用EQU定义的符号,可用PURGE解除,再重新定义。格式:PURGE符号1,符号2,.,符号n例:AEQU100PURGEAAEQU200,22,、变量定义伪指令,变量是内存中数据区的首地址名字,故定义变量的伪指令又可叫数据定义伪指令。这类伪指令格式为:变量名伪指令助记符操作数;注释,(1)变量名用符号地址表示;(2)伪指令助记符有如下几种:DB(字节)、DW(字)、DD(双字)、DF、DQ、DT(3)操作数可以是常数或表达式;(4)注释用来说明伪指令的功能,它亦可有可无。,解释:,23,表达式:表达式项是给变量或指定存储单元赋予初值,它有以下几种形式:(1)数值表达式(2)字符串表达式(3)地址表达式(只适用DW和DD两个伪指令)(4)?表达式(5)带DUP的表达式,24,汇编后如下图所示:,A,C,B,10,5,10H,100H,100,-4,60,0FFFBH,DatasegmentADB10,5,10HBDW100H,100,-4CDD2*30,0FFFBHDataends,数值表达式举例,25,操作数可以是字符串STRDBHELLO汇编后如下:,STR,H,E,L,L,O,注意下面的不同:ADBABADWAB41A42B42B41A,说明:当DB定义的数据是字符串时,按字符在字符串中出现的先后次序分配内存单元。,字符串表达式举例,26,例3:XDW,$+,$+Lendb$-x设X的偏移地址为0000H,则汇编后如下图所示:,x,0000H,0004H,000AH,P72例,len,0004H+4,000AH+4,0012,地址表达式举例,27,算术运算符也可以用于地址表达式,地址表达式的基本形式为:变量名或标号名数值表达式或变量名或标号名数值表达式说明:对地址运算的结果应有明确的物理意义,例两个地址的乘或除无意义。例:LEASI,SUM+3;SUM为一变量movax,BUF1-BUF2表示变量SUM的地址加上3得到的和作为新存储单元的地址。,地址表达式,28,说明:()变量和标号是最简单的地址表达式;()地址表达式所表示的偏移地址是在汇编时由MASM计算的;()两个地址表达式的差表示两个地址之间的距离(即字节数)而且两个地址必须在同一个段内;()两个地址表达式相加是没有意义的,地址表达式(续),29,$:可用在硬指令中,也可用在伪指令中。在伪指令中使用$,表示的是地址计数器的当前值;,地址计数器$,汇编程序的地址计数器:每进入一个新段,地址计数器清零;每分配一个单元,地址计数器自动加1,指向下一个待分配的单元;代表当前值。,在硬指令中使用$,它表示本条指令的第一个字节的地址(本条指令的首地址)。如:JNE$6$6表示的转向地址是JNE指令的首地址加上6。它必须是另一条指令的首地址。,30,例3:XDW,$+,$+Lendb$-x设X的偏移地址为0000H,则汇编后如下图所示:,x,0000H,0004H,000AH,P72例,len,0004H+4,000AH+4,0012H,地址表达式举例,31,操作数?用来保留内存空间,但不存入数据,即初始值未定义。例3:ADB0,1,?,?,?LDW?,54,?汇编后如下图示:,A,L,0,1,?,?,?,?,?,54,?表达式举例,32,操作数还可以用复制操作符DUP来缩写,如ABCDB0,1,?,?,?亦可写成:ABCDB0,1,3DUP(?)又如:bufDB2DUP(0,1,2,?)与bufDB0,1,2,?,0,1,2,?等价,DUP表达式举例,33,4.LABEL类型定义伪指令格式:名字LABEL类型功能:定义与原有变量类型不同的新变量或为指令语句定义有指定类型的标号。通常与数据定义伪指令连用,其功能类似语句“变量名或标号EQUTHIS类型”。解释:其中的名字可以是变量或标号,当为变量时,类型是BYTE、WORD、DWORD等,当为标号时,类型是NEAR或FAR。举例:datasegmentbalabelbytewadw100dup(?)dataends上述指令定义了地址相同、类型不同的两个变量:字节类型变量ba与字类型变量wa。Movwa,AXMovba,AL,34,.指定段寄存器伪指令ASSUME格式:ASSUME段寄存器名:段名,段寄存器名:段名功能:建立段寄存器与段之间的关系。即指出某个段的段地址在哪个段寄存器中。如:ASSUMECS:CODE,DS:DATA注意:ASSUME伪指令并不能为段寄存器赋值。说明:ASSUME伪指令只是告知汇编程序有关段寄存器与段的关系,并没有给段寄存器赋予实际的初值。需通过以下指令:MOVAX,DATAMOVDS,AXMOVES,AX实现将段基址装入段寄存器。说明:代码段不需要用户装,由初始化程序装入。,35,.置汇编地址计数器伪指令ORG,格式:ORG数值表达式功能:将数值表达式的值赋给汇编地址计数器。伪指令ORG规定了段内的起始偏移地址,表达式的值即为段内的起始偏移地址,从此地址起连续存放程序或数据。数值表达式的值须为065535之间的非负整数。【例】给汇编地址计数器赋值。DATASEGMENTORG10;置值为10VAR1DW100H,200HORG+5;置的值为14+5,即为19VAR2DBABCDATAENDS,解释P7例,36,、源程序结束伪指令,格式:END地址功能:该语句标志整个程序的结束,是源程序的最后一条语句。说明:可选的地址指出程序执行的起始点,通常是标号或过程名。,37,SEG操作符OFFSET操作符TYPE操作符PTR属性操作符THIS类型操作符,五、操作符,38,(1)SEG操作符格式:SEG变量或标号功能:分离出其后变量或标号所在段的段首址。例如:MOVAX,SEGARRMOVDS,AX(2)OFFSET操作符格式:OFFSET变量或标号功能:分离出其后变量或标号的偏移地址。例如:MOVBX,OFFSETBUF,提示:ARR与BUF都为某一数据段当中定义的变量,39,(3)TYPE操作符格式:TYPE变量或标号功能:分离出其后变量或标号的类型。如果是变量,将返回该变量的类型对应字节数;如果是标号,则返回代表标号类型的数值。它们之间的关系见表所示。,40,对于A、B、C三变量:Sega=segb=segcOffseta=?Offsetb=?Offsetc=?Typea=?Typeb=?Typec=?,举例:,DATASEGMENTADBABCDEFBDW10DUP(1,2DUP(2)CDB3,20DUP(0)DATAENDS,41,Sega=segb=segc=0c52HOffseta=0000HOffsetb=0006HOffsetc=0042HTypea=1Typea=2Typea=1,举例:,DATASEGMENTADBABCDEFBDW10DUP(1,2DUP(2)CDB3,20DUP(0)DATAENDS,42,功能:用来对存储单元规定类型,通常和伪指令BYTE,WORD等连起来使用。例:MOVBYTEPTRDI,0MOVWORDPTRDI,0而MOVDI,0;类型不定PTR也可用来对已经规定了类型进行更改例:STRIDW?;定义为字类型MOVSTRI,AX;是合法的MOVAL,STRI;是非法的只能用:MOVAL,BYTEPTRSTRI,(4)属性(类型)操作符PTR,说明:PTR只是临时改变变量的类型属性,原类型属性不变,43,功能:返回一个指定类型的内存操作数或标号,相应的地址为地址计数器的当前值。通常,THIS操作符与EQU配合使用。功能同“LABEL”格式:名字EQUTHIS类型理解:给当前偏移地址指定一种类型属性,同时定义了一个名字例如:bufdw2055h;设=0008Hbvarequthisbyte;不占存储空间wvardw10dup(0);wvar仍然指向0008H解释:当前偏移地址为0008H,第二条语句“THIS”给它指定了一个类型属性:BYTE,并借助EQU为它定义了名字:bvar。第三条语句使0008H单元具有了另一个名字和另一种属性。对0008H单元,两个名字、两种属性都可用。解释:,(5)this类型操作符,注意:要借助EQU伪指令。与下一条伪指令合用。,44,DATASEGMENTSTRDB0DH,0AH,Howareyou!$DATAENDSSTACKSEGMENTSTACKDB100DUP(0)STACKENDSCODESEGMENTASSUMEDS:DATA,CS:CODE,SS:STACK,ES:DATABEGIN:MOVAX,DATAMOVDS,AXMOVES,AXMOVAH,4CHINT21HCODEENDSENDBEGIN,汇编语言源程序结构,45,过程1:源程序的编辑,源程序文件要以.ASM为扩展名源程序文件的形成(编辑)可以通过任何一个文本编辑器实现:DOS中的全屏幕文本编辑器EDIT其他程序开发工具中的编辑环境Visualc+等EDITlt1.asm,六、汇编语言程序的上机过程,46,过程2:源程序的汇编,汇编是将源程序翻译成由机器代码组成的目标模块文件的过程,由汇编程序MASM完成。MASMlt1.asm如果源程序中没有语法错误,MASM将自动生成一个目标模块文件(lt1.obj);否则MASM将给出相应的错误信息这时应根据错误信息,重新编辑修改源程序后,再进行汇编。,47,过程3:目标模块的连接,连接程序能把一个或多个目标文件和库文件合成一个可执行程序:LINKlt1.obj如果没有严重错误,LINK将生成一个可执行文件(lt1.exe);否则将提示相应的错误信息这时需要根据错误信息重新修改源程序后再汇编、链接,直到生成可执行文件,48,过程4:可执行程序的调试,经汇编、连接生成的可执行程序在操作系统下只要输入文件名就可以运行:lt1操作系统装载该文件进入内存,并开始运行如果出现运行错误,可以从源程序开始排错,也可以利用调试程序帮助发现错误采用DEBUG.EXE调试程序:DEBUGlt1.exe,注:如果结果在寄存器或存储器中,则只能在DEBUG下查看结果,49,六、汇编语言程序的上机过程,源程序:文件名.asm,目标模块:文件名.obj,可执行文件:文件名.exe,错误,50,总结,一、汇编语言源程序的基本框架二、汇编语言源程序中的语句三、变量、标号的三种属性四、伪指令五、操作符六、汇编语言上机过程,51,作业,
展开阅读全文