《微机原理与接口技术》课件第4章.pptx

上传人(卖家):momomo 文档编号:7570974 上传时间:2024-03-19 格式:PPTX 页数:209 大小:2.75MB
下载 相关 举报
《微机原理与接口技术》课件第4章.pptx_第1页
第1页 / 共209页
《微机原理与接口技术》课件第4章.pptx_第2页
第2页 / 共209页
《微机原理与接口技术》课件第4章.pptx_第3页
第3页 / 共209页
《微机原理与接口技术》课件第4章.pptx_第4页
第4页 / 共209页
《微机原理与接口技术》课件第4章.pptx_第5页
第5页 / 共209页
点击查看更多>>
资源描述

1、第4章 汇编语言程序设计第4章 汇编语言程序设计4.1 汇编语言程序格汇编语言程序格式式4.2 伪指伪指令令4.3 汇编语言源程序结汇编语言源程序结构构4.4 汇编语言程序的上机过汇编语言程序的上机过程程4.5 汇编语言程序设汇编语言程序设计计4.6 程序设计举例程序设计举例习题习题4第4章 汇编语言程序设计4.1 汇编语言程序格式汇编语言程序格式4.1.1 汇编语言的程序结构第4章 汇编语言程序设计第4章 汇编语言程序设计1)指令语句指令语句是功能性语句,由Intel 8086/8088 CPU提供的指令形成,实现一定的操作功能,能够被编译成机器代码。2)伪指令语句伪指令语句也叫指示性语句,

2、只是为汇编程序在翻译汇编语言源程序时提供有关信息,并不产生机器代码。程序中的语句:BUF1 DB 34HBUF2 DB 2AHSUM DB?第4章 汇编语言程序设计就是伪指令语句,其功能是在内存中开辟3个名字分别为BUF1、BUF2、SUM的字节存储单元,前两个单元的初值分别为34H和2AH,SUM仅指定一个字节的空单元,并不定义确定的初值。实际上,汇编语言源程序中还可出现宏指令语句或系统调用。宏指令语句就是由若干条指令语句形成的语句体,编译时被展开。一条宏指令语句的功能相当于若干条指令语句的功能。系统调用是直接调用操作系统提供的专用子程序。第4章 汇编语言程序设计4.1.2 汇编语言的语句格

3、式汇编语言的语句格式指令语句和伪指令语句的格式是类似的,格式如下:名字 指令助记符,操作数;注释其中,带方括号的项可以省略,注释内容以分号(;)引导。1.名字名字1)名字的标识符名字也就是由用户按一定规则定义的标识符,可由下列符号组成:(1)英文字母(AZ,az);(2)数字(09);(3)特殊符号(?、_等)。第4章 汇编语言程序设计2)名字的定义规则(1)数字不能作为名字的第一个符号;(2)单独的问号(?)不能作为名字;(3)一个名字的最大有效长度为31,超过31的部分计算机不再识别;(4)汇编语言中有特定含义的保留字,如操作码、寄存器名等,不能作为名字使用。为了便于记忆,名字应该做到见名

4、知意,如用BUFFER表示缓冲区,用SUM表示累加和等。第4章 汇编语言程序设计3)名字的两种主要形式名字有标号和变量两种主要形式。(1)标号。标号在代码段中定义,后面跟着冒号“:”,它也可以用LABEL或EQU伪操作来定义。此外,它还可以作为子程序名定义,由于子程序由伪指令定义,因此子程序名不需冒号说明。标号经常在转移指令或CALL指令的操作数字段出现,用以表示转向地址。标号有三种属性:段基值、段内偏移量(或相对地址)和类型属性。第4章 汇编语言程序设计段基值(SEG)属性:是标号所在逻辑段的段基值,即段起始地址的前16位。此值必须在一个段寄存器中,而标号的段则总是在CS寄存器中。段内偏移量

5、(OFFSET)属性:是标号距离段起始地址的字节数,对于16位段是16位无符号数,对于32位段则是32位无符号数。类型(TYPE)属性:类型表示该标号所代表的指令的转移范围,分为NEAR和FAR两种。如果为NEAR型,则标号只能在段内引用;如果为FAR型,则标号可以在段间引用。第4章 汇编语言程序设计(2)变量。变量在数据段、附加数据段或堆栈段中定义,后面不跟冒号。它也可以用LABEL或EQU伪操作来定义。变量经常在操作数字段出现。它也有段、偏移及类型三种属性。段属性:定义变量的段起始地址,此值必须在一个段寄存器中。偏移属性:变量的偏移地址是从段的起始地址到定义变量的位置之间的字节数。对于16

6、位段,是16位无符号数;对于32位段,则是32位无符号数。在当前段内给出变量的偏移值等于当前地址计数器的值,当前地址计数器的值可以用$来表示。第4章 汇编语言程序设计类型属性:变量的类型属性定义该变量所保留的字节数,如BYTE(DB,1个字节长)、WORD(DW,2个字节长)、DWORD(DD,4个字节长)、FWORD(DF,6个字节长)、QWORD(DQ,8个字节长)、TBYTE(DT,10个字节长)。在同一个程序中,同样的标号或变量的定义只允许出现一次,否则汇编程序会指示出错。第4章 汇编语言程序设计 2.指令助记符指令助记符指令助记符用来指明不同的操作指令,如MOV、ADD等都是指令助记

7、符。3.操作数操作数指令中的操作数是指令执行的对象。对于一般指令,可以有一个或两个操作数,也可以没有操作数;对于伪指令和宏指令,可以有多个操作数。当操作数多于一个时,操作数之间用逗号分开。操作数可以是常数或表达式。第4章 汇编语言程序设计 1)常数(1)数值常数。汇编语言中的数值常数可以是二进制、八进制、十进制或十六进制数,书写时用加后缀(如B、O或Q、D、H)的方式标明即可。对于十进制数,可以省掉后缀。对于十六进制数,当以AF开头时,前面要加数字0,以避免和名字混淆,如十六进制数A6H,应该写成0A6H,否则容易和名字A6H相混。(2)字符串常数。包含在单引号中的若干个字符即形成字符串常数。

8、字符串在计算机中存储的是相应字符的ASCII码,如A的值是41H,AB的值是4142H等。第4章 汇编语言程序设计(3)符号常数。用符号名来代替的常数就是符号常数,如COUNT EQU 3或COUNT=3定义后COUNT就是一个符号常数,与数值常数3等价。第4章 汇编语言程序设计2)表达式由运算对象和运算符组成的合法式子就是表达式。表达式分为数值表达式、关系表达式、逻辑表达式和地址表达式等。(1)算术运算符。算术运算符有:+(加)、-(减)、*(乘)、/(除)、MOD(取余除)。算术运算符可以用于数值表达式和地址表达式中,用于计算数据或地址的结果。下面的两条指令是正确的:MOVAL,4*8+5

9、;数值表达式MOVSI,OFFSET BUF+12;地址表达式第4章 汇编语言程序设计(2)逻辑运算符。逻辑运算符有:AND(与)、OR(或)、XOR(异或)、NOT(非)。逻辑运算符只能用于数值表达式中,不能用于地址表达式中,其运算结果为“真”或“假”。逻辑运算符和逻辑运算指令是有区别的。逻辑运算符的功能在汇编阶段完成,逻辑运算指令的功能在程序执行阶段完成。在汇编阶段,指令ANDAL,78H AND 0FH等价于指令AND AL,08H。第4章 汇编语言程序设计(3)关系运算符。关系运算符有:EQ(相等)、LT(小于)、LE(小于等于)、GT(大于)、GE(大于等于)、NE(不等于)。关系运

10、算符要有两个运算对象。两个运算对象要么都是数值,要么都是同一个段内的地址,其运算结果为“真”或“假”。结果为真时,表示为0FFFFH;运算结果为假时,表示为0000H。指令 MOV BX,32 EQ 45 等价于 MOV BX,0。指令 MOV BX,56 GT 30 等价于 MOV BX,0FFFFH。第4章 汇编语言程序设计4.注释注释注释是语句的说明部分,用来说明一条指令或一段程序的功能,由分号(;)开始,适当地加些注释内容,可以增加程序的可读性,便于阅读、理解和修改程序。汇编源程序时,注释部分不产生机器代码。一条语句可以写在多行上,续行符使用。第4章 汇编语言程序设计4.1.3 汇编语

11、言的运算符汇编语言的运算符1分析运算符分析运算符分析运算符的运算对象是存储器操作数,即由变量名或标号形成的地址表达式,运算结果是一个数值。运算符的格式为运算符 地址表达式第4章 汇编语言程序设计(1)SEG和OFFSET运算符。SEG运算符返回变量或标号所在段的段基值,OFFSET运算符返回变量或标号的段内偏移量。例如,若VAR是一个已经定义的变量,它所在的逻辑段的段基址是3142H,它在该段的偏移量是120H,那么指令MOV AX,SEG VARMOV BX,OFFSET VAR就等价于:MOV AX,3142HMOV BX,120H或LEA BX,VAR 第4章 汇编语言程序设计(2)TY

12、PE运算符。TYPE运算符返回变量或标号的类型属性值。对于各种类型的变量和标号,它们对应的属性值如表4-1所示。第4章 汇编语言程序设计(3)LENGTH运算符和SIZE运算符。LENGTH运算符返回变量数据区分配的数据项总数。SIZE运算符返回变量数据区分配的字节个数。例如,若有如下的数据定义:DAT1 DB 20H,48 DAT2 DW 5 DUP(2,4)第4章 汇编语言程序设计那么,对于下边的指令语句,它所完成的操作如注释所示。MOV AL,TYPE DAT1;AL1 MOV AH,LENGTH DAT1;AH1 MOV BL,SIZE DAT1;BL1 MOV BH,TYPE DAT

13、2;BH2 MOV CL,LENGTH DAT2;CL5 MOV CH,SIZE DAT2;CH20第4章 汇编语言程序设计2.组合运算符组合运算符组合运算符有PTR和THIS两个运算符。(1)PTR运算符。PTR运算符的功能是对已分配的存储器地址临时赋予另一种类型属性,但不改变操作数本身的类型属性,同时保留存储器地址的段基址和段内偏移量的属性。它的使用格式如下:类型 PTR 地址表达式其中,地址表达式部分可以是标号、变量或各种寻址方式构成的存储器地址。对于标号,可以设置的类型有NEAR和FAR;对于变量,可以设置的类型有BYTE、WORD和DWORD。第4章 汇编语言程序设计例如:MOV W

14、ORD PTR BX,AX ;将BX所指存储单元临时设置为字类型MOV BYTE PTR DAT,AL ;将变量DAT临时设置为字节类型 JMP FAR PTR LPT ;将标号LPT临时设置为远类型 第4章 汇编语言程序设计(2)THIS运算符。THIS运算符用来定义一个新类型的变量或标号。但它只指定变量或标号的类型属性,并不为它分配存储区,它的段属性和偏移属性与下一条可分配地址的变量或标号属性相同。格式:THIS 类型其类型选项与PTR运算符相同。例如:LAB EQU THIS BYTE;EQU是赋值伪指令,它将表达式的值赋给标号或变量LAW DW 2341HMOV BL,LAB ;(BL

15、)41HMOV AX,LAW ;(AX)2341H在这里,变量LAB和LAW具有相同的段基址和偏移地址,但LAB是字节类型,而LAW是字类型。第4章 汇编语言程序设计3.分离运算符分离运算符(1)LOW运算符。格式:LOW 表达式功能:取表达式的低字节返回。(2)HIGH运算符。格式:HIGH 表达式功能:取表达式的高字节返回。例如:MOV AL,LOW 2238H;AL38HMOV AH,HIGH 2238H;AH22H第4章 汇编语言程序设计4.2 伪伪 指指 令令汇编语言程序的语句除指令以外还可以由伪操作和宏指令组成。伪操作又称为伪指令,它们不像机器指令那样是在程序运行期间由计算机来执行

16、的,而是在汇编程序对源程序汇编期间由汇编程序处理的,它们可以完成如处理器选择、定义程序模式、定义数据、分配存储区、指示程序结束等功能。伪指令形式上与一般指令相似,但伪指令只是为汇编程序提供有关信息,不产生相应的机器代码。第4章 汇编语言程序设计4.2.1 定义符号的伪指令定义符号的伪指令有时程序中多次出现同一个表达式,为方便起见,可以用赋值伪操作给表达式赋予一个名字。1.等值伪指令等值伪指令EQU格式:EQU 功能:给符号名定义一个值,赋予一个符号名、表达式或助记符。第4章 汇编语言程序设计此后,程序中凡需要用到该表达式之处,就可以用表达式名来代替了。可见,EQU的引入提高了程序的可读性,也使

17、其更加易于修改。上式中的表达式可以是任何有效的操作数格式,可以是任何可以求出常数值的表达式,也可以是任何有效的助记符。举例如下:第4章 汇编语言程序设计CONSTANTEQU256;将数256赋以符号名CONSTANTDATA EQUHEIGHT+12 ;HEIGHT为一标号,地址表达式赋以符号名DATAALPHA EQU7 BETA EQUALPHA2;这是一组赋值伪操作,把72=5赋以符号名BETAADDR EQUVAR+BETA ;将VAR+5赋以符号名ADDRB EQUBP+8 ;变址引用赋以符号名BP8 EQUDS:BP+8 ;加段前缀的变址引用赋以符号名P8第4章 汇编语言程序设计

18、在EQU语句的表达式中,如果有变量或标号的表达式,则在该语句前应该先给出它们的定义。例如,语句AB EQU DATA_ONE+2必须放在DATA_ONE的定义之后,否则汇编程序将指示出错。第4章 汇编语言程序设计2.等号伪指令等号伪指令“=”还有一个与EQU相类似的“=”伪操作也可以作为赋值操作使用。它们之间的区别是:EQU伪操作中的表达式名是不允许重复定义的,而“=”伪操作则允许重复定义。例如,EMP=6或EMP EQU 6都可以使数6赋给符号名EMP,然而不允许两者同时使用。但是,语句EMP=7EMP=EMP+1在程序中是允许使用的,因为“=”伪操作允许重复定义。这种情况下,在第一个语句后

19、的指令中,EMP的值为7;而在第二个语句后的指令中,EMP的值为8。第4章 汇编语言程序设计3.解除定义伪指令解除定义伪指令PURGE格式:PURGE 功能:解除指定符号的定义。解除符号定义后,可用EQU重新进行定义。例如:Y1EQU7;定义Y1的值为7PURGEY1;解除Y1的定义Y1EQU36;重新定义Y1的值为36第4章 汇编语言程序设计4.2.2 定义数据的伪指令定义数据的伪指令这一类伪指令的格式是:变量 助记符 操作数,操作数;注释功能:为操作数分配存储单元,并用变量与存储单元建立联系。其中,变量是可有可无的,它用符号地址表示,其作用与指令语句前的标号相同,但它的后面不跟冒号。如果语

20、句中有变量名,则汇编程序使其记为第一个字节的偏移地址。注释字段用来说明该伪指令的功能,它也是可有可无的。伪指令格式中的助记符是用来说明所定义的数据类型。第4章 汇编语言程序设计这一类伪指令的助记符有以下几种:(1)DB用来定义字节,其后的每个操作数都占有一个字节(8位)的存储单元。(2)DW用来定义字,其后的每个操作数占有一个字(16位,其低位字节在第一个字节地址中,高位字节在第二个字节地址中)。(3)DD用来定义双字(4个字节),其后的每个操作数占有两个字(32位)。第4章 汇编语言程序设计(4)DF用来定义3字(6个字节),其后的每个操作数占有48位,可用来存放远地址。这一伪指令只能用于3

21、86及其后继机型中。(5)DQ用来定义4字(8个字节),其后的每个操作数占有4个字(64位),可用来存放双精度浮点数。(6)DT用来定义5字(10个字节),其后的每个操作数占有5个字,形成压缩的BCD码形式。第4章 汇编语言程序设计这些伪指令可以把其后跟着的数据存入指定的存储单元,形成初始化数据,或者只分配存储空间而并不存入确定的数值,形成未初始化数据空间。DW和DD伪指令还可存储地址,DF伪指令则可存储由16位段地址及32位偏移地址组成的远地址指针。下面举例说明。第4章 汇编语言程序设计【例4-2】操作数可以是常数,或者是表达式(根据该表达式可以求得一个常数),如:DATA_BYTE DB

22、10,4,10HDATA_WORD DW 100,100H,-5DATA_DW DD 3C,0FFFDH汇编程序可以在汇编期间在存储器中存入数据,汇编后的内存分布如图4.1所示。第4章 汇编语言程序设计图4.1 例4-2的汇编结果000A041064000001FBFF3C000000FDFF00DATA_BYTEDATA_WORDDATA_DW10D4D10H100D100D 5D60D0FFFD H第4章 汇编语言程序设计【例4-3】操作数也可以是字符串,如:MESSAGE DB HELLO存储器存储情况如图4.2(a)所示,而DB AB和DW AB的存储情况分别如图4.2(b)和(c)所

23、示。(a)字符串的存储;(b)DBAB;(c)DWAB图4.2 例4-3的汇编结果第4章 汇编语言程序设计【例4-4】操作数“?”可以保留存储空间,但不存入数据。例如:ABC DB 0,?,?,0 DEF DW?,52,?经汇编后的存储情况如图4.3所示。操作数还可以使用复制操作符(DUPLICATION OPERATOR)来复制某个(或某些)操作数。其格式为REPEAT_COUNT DUP(OPERAND,OPERAND)其中,REPEAT_COUNT可以是一个表达式,它的值应该是一个正整数,用来指定括号中的操作数的重复次数。第4章 汇编语言程序设计图4.3 例4-4的汇编结果0000340

24、052DDEFABC第4章 汇编语言程序设计【例4-5】使用DUP实现重复定义。ARRAY1 DB 2 DUP(0,1,2,?)ARRAY2 DB 100 DUP(?)经汇编后的存储情况如图4.4所示。由图可见,例4-5中的第一个语句展开后和语句ARRAY1 DB 0,1,2,?,0,1,2,?是等价的。第4章 汇编语言程序设计图4.4 例4-5的汇编结果000102000102100 个字节ARRAY2ARRAY1第4章 汇编语言程序设计4.2.3 定义程序开始和结束的伪指令定义程序开始和结束的伪指令在程序的开始部分可以用NAME或TITLE为模块命名。NAME的格式是:NAME MODUL

25、E_NAME汇编程序将以给出的MODULE_NAME作为模块的名字。如果程序中没有使用NAME伪操作,则可使用TITLE伪操作,其格式为TITLE TEXT第4章 汇编语言程序设计TITLE伪操作可指定列表文件的每一页上打印的标题。同时,如果程序中没有使用NAME伪操作,则汇编程序将用 TEXT中的前六个字符作为模块名。TEXT中最多可有60个字符。如果程序中既无 NAME又无 TITLE伪操作,则将用源文件名作为模块名。所以,NAME及TITLE伪操作并不是必要的,但一般经常使用TITLE,以便在列表文件中能打印出标题来。第4章 汇编语言程序设计表示源程序结束的伪操作的格式为END LABE

26、L其中,标号(LABEL)指示程序开始执行的起始地址。如果多个程序模块相连接,则只有主程序要使用标号,其他子程序模块只用END而不必指定标号。汇编程序将在遇到END时结束汇编,而程序则将从主模块的第一个标号处开始执行。第4章 汇编语言程序设计4.2.4 指令集选择伪指令指令集选择伪指令由于80 x86的所有处理器都支持8086/8088指令系统,而且每一种高档的机型又都增加了一些新的指令,因此,在编写程序时要对所用处理器有一个确切的选择。也就是说,要告诉汇编程序应该选择哪一种指令系统。这一组伪操作的功能就是确定指令系统。第4章 汇编语言程序设计此类伪操作主要有以下几种:(1).8086:选择8

27、086指令系统。(2).286:选择80286指令系统。(3).286P:选择保护方式下的80286指令系统。(4).386:选择80386指令系统。(5).386P:选择保护方式下的80386指令系统。(6).486:选择80486指令系统。(7).486P:选择保护方式下的80486指令系统。(8).586:选择Pentium指令系统。(9).586P:选择保护方式下的Pentium指令系统。第4章 汇编语言程序设计有关“选择保护方式下的xxxx指令系统”的含义是指包括特权指令在内的指令系统。此外,上述伪操作均支持相应的协处理器指令。这类伪操作一般放在整个程序的最前面,如不给出,则汇编程序

28、默认值为.8086指令系统。它们可放在程序中,如程序中使用了一条80486所增加的指令,则可以在该指令的上一行加上.486。第4章 汇编语言程序设计4.2.5 地址计数器与对准伪操作地址计数器与对准伪操作1.地址计数器地址计数器$在汇编程序对源程序汇编的过程中,使用地址计数器(LOCATION COUNTER)来保存当前正在汇编的指令的偏移地址。当开始汇编或在每一段开始时,把地址计数器初始化为零,以后在汇编过程中,每处理一条指令,地址计数器就增加一个值,此值为该指令所需要的字节数。地址计数器的值可用$来表示,汇编语言允许用户直接用$来引用地址计数器的值,因此指令JNE$+6第4章 汇编语言程序

29、设计的转向地址是JNE指令的首地址加上6。当$用在指令中时,它表示本条指令的第一个字节的地址。在这里,$+6必须是另一条指令的首地址;否则,汇编程序将指示出错信息。当$用在伪操作的参数字段时,和它用在指令中的情况不同,它所表示的是地址计数器的当前值。第4章 汇编语言程序设计【例4-6】$用法示例。ARRAY DW 1,2,$+4,3,4,$+4如汇编时ARRAY分配的偏移地址为0074,则汇编后的存储区将如图4.5所示。注意:ARRAY数组中的两个$+4得到的结果是不同的,这是由于$的值是在不断变化的缘故。当在指令中用到$时,它只代表该指令的首地址,而与$本身所在的字节无关。第4章 汇编语言程

30、序设计图4.5 例4-6的汇编结果010002007C000300040082000074ARRAY第4章 汇编语言程序设计2.ORG伪操作伪操作ORG伪操作用来设置当前地址计数器的值,其格式为ORG CONSTANT EXPRESSION 如常数表达式的值为N,则ORG伪操作可以使下一个字节的地址成为常数表达式的值N。例如:VECTORSSEGMENTORG 10VECT1 DW 47A5HORG 20VECT2 DW 0C596HVECTORSENDS则VECT1的偏移地址值为0AH,而VECT2的偏移地址值为14H。第4章 汇编语言程序设计常数表达式也可以表示从当前已定义过的符号开始的位

31、移量,或表示从当前地址计数器值$开始的位移量。例如:ORG$+8可以表示跳过8个字节的存储区,亦即建立了一个8字节的未初始化的数据缓冲区。如程序中需要访问该缓冲区,则可用LABEL伪操作来定义该缓冲区的如下变量名:BUFFER LABEL BYTEORG$+8当然,其完成的功能和BUFFERDB8DUP(?)是一样的。第4章 汇编语言程序设计3.EVEN3.EVEN伪操作伪操作 EVEN伪操作使下一个变量或指令开始于偶数字节地址。一个字的地址最好从偶地址开始,所以对于字类型数组,为保证其从偶地址开始,可以在其前用EVEN伪操作来达到这一目的。例如:DATA_SEG SEGMENT EVEN;保

32、证地址从偶地址开始WORD_ARRAY DW100DUP(?)DATA_SEGENDS第4章 汇编语言程序设计4.ALIGN伪操作伪操作ALIGN伪操作为保证双字类型数组边界从4的倍数开始创造了条件,其格式为ALIGN BOUNDARY其中,BOUNDARY必须是2的幂,例如:.DATAALIGN4ARRAYDB100DUP(?)就可保证ARRAY的值为4的倍数。当然,ALIGN 2和EVEN是等价的。第4章 汇编语言程序设计4.3 汇编语言源程序结构汇编语言源程序结构1.完整段定义的程序结构完整段定义的程序结构存储器的物理地址是由段地址和偏移地址组合而成的,汇编程序在把源程序转换为目标程序时

33、,必须确定标号和变量(代码段和数据段的符号地址)的偏移地址,并且需要把有关信息通过目标模块传送给连接程序,以便连接程序把不同的段和模块连接在一起,形成一个可执行程序。为此,需要用段定义伪操作,其格式如下:第4章 汇编语言程序设计SEGMENT_NAMESEGMENT SEGMENT_NAMEENDS其中,语句体部分对于数据段、附加段和堆栈段来说,一般是存储单元的定义、分配等伪操作,对于代码段则是指令及伪操作。此外,在代码段还必须明确段和段寄存器的关系,这可用ASSUME伪操作来实现,其格式为ASSUME :段名,:段名,ASSUME :NOTHING第4章 汇编语言程序设计其中,段寄存器名必须

34、是CS、DS、ES和SS(对于386及其后继机型还有FS和GS),而段名则必须是由SEGMENT定义的段中的段名。ASSUME NOTHING则可取消前面由ASSUME所指定的段寄存器的对应关系。第4章 汇编语言程序设计第4章 汇编语言程序设计由于ASSUME伪操作只是指定某个段分配给哪一个段寄存器,它并不能把段地址装入段寄存器中,要把段地址装入段寄存器中,就要求在代码段中必须有对段地址装入相应的段寄存器中的指令。例如,在上面的程序中,分别用两条MOV指令完成这一操作。如果程序中有堆栈段,也需要把段地址装入SS中。但是,代码段CS不需要这样做,这一操作是在程序初始化时完成的。第4章 汇编语言程

35、序设计为了对段定义作进一步的控制,SEGMENT伪操作添加了类型及属性说明,其格式如下:SEGMENT 定位类型组合类型使用类型类别 ENDS在一般情况下,这些说明可以不用。但是,当需要用连接程序把本程序与其他程序模块相连接时,就需要使用这些说明。第4章 汇编语言程序设计2对段定义的进一步说明1)定位类型(ALIGN_TYPE)定位类型用于说明段的起始地址应有怎样的边界值,其取值可以是:PARA:指定段的起始地址必须从小段边界开始,即段起始地址最低位必须为0。这样,偏移地址可以从0开始。BYTE:该段可以从任何地址开始,这样,起始偏移地址可能不是0。WORD:该段必须从字的边界开始,即段起始地

36、址必须为偶数。第4章 汇编语言程序设计 DWORD:该段必须从双字边界开始,即段起始地址的最低位必须为4的倍数。PAGE:该段必须从负的边界开始,即段起始地址的最低两个十六进制数位必须为0(该地址能被256整除)。定位类型的默认项是PARA,即未指定定位类型时,汇编程序默认为PARA。第4章 汇编语言程序设计 2)组合类型(COMBINE_TYPE)组合类型用于说明程序连接时段的合并方法,其取值可以是:PRIVATE:该段为私有段,在连接时不与其他模块中的同名段合并。PUBLIC:该段连接时可以把不同模块中的同名段相连接而合并为一个段,其连接次序由连接命令指定。COMMON:该段在连接时可以把

37、不同模块中的同名段重叠而形成一个段,由于各同名分段有相同的起始地址,因此会产生覆盖。第4章 汇编语言程序设计 AT EXPRESSTION:使段地址为表达式所计算出来的16位值,但它不能用来指定代码段。MEMORY:与PUBLIC同义。STACK:把不同模块中的同名段组合而形成一个堆栈段,该段的长度为原有各堆栈段长度的总和,原有各段之间并无PUBLIC所连接段中的间隙,而且栈顶可自动指向连接后形成的大堆栈段的栈顶。组合类型的默认项是PRIVATE。第4章 汇编语言程序设计 3)使用类型(USE_TYPE)使用类型只适用于386及其后继机型,它用来说明是使用16位寻址方式还是使用32位寻址方式。

38、其取值可以是:USE16:使用16位寻址方式。USE32:使用32位寻址方式。当使用16位寻址方式时,段长不超过64KB,地址的形式是16位段地址和16位偏移地址组合;当使用32位寻址方式时,段长可达4GB,地址的形式是16位段地址和32位偏移地址组合。可以看出,在实模式下,应该使用USE16。使用类型的默认项是USE16。第4章 汇编语言程序设计 4)类别名(CLASS)在单引号中给出连接时组成段组的类型名。类别说明并不能把相同类别的段合并起来,但在连接后形成的装入模块中,可以把它们的位置靠在一起。第4章 汇编语言程序设计4.4 汇编语言程序的上机过程汇编语言程序的上机过程在计算机上运行汇编

39、语言程序的步骤是:(1)用编辑程序建立.ASM源文件;(2)用MASM程序把.ASM文件汇编成.OBJ文件;(3)用LINK程序把.OBJ文件连接成.EXE文件;(4)用DOS命令直接键入文件名就可执行该程序。第4章 汇编语言程序设计目前常用的汇编程序有Microsoft公司推出的宏汇编程MASM(MACRO ASSEMBLER)和BORLAND公司推出的TASM(TURBO ASSEMBLER)两种。本书采用MASM5.0版来说明汇编程序所提供的伪操作和操作符,操作流程(汇编语言程序的建立及汇编过程)如图4.6所示。第4章 汇编语言程序设计图4.6 汇编语言程序的建立及汇编过程编辑程序文件E

40、XMP.ASMEDLINEWPSWORDEDIT汇编程序ASMMASMTASM文件EXMP.OBJ(EXMP.LST)(EXMP.CRF)连接程序LINK文件EXMP.EXE(EXMP.MAP)(EXMP.LIB)DEBUG出错出错出错第4章 汇编语言程序设计说明:图4.6中表示操作使用的工具;表示操作得到的文件。汇编程序的主要功能是:(1)检查源程序语法是否正确。(2)测出源程序中的语法错误,并给出出错信息。(3)产生源程序的目标程序,并可给出列表文件(同时列出汇编语言和机器语言的文件,称为.LST文件)。(4)展开宏指令。第4章 汇编语言程序设计4.4.1 建立汇编语言的工作环境建立汇编语

41、言的工作环境为运行汇编语言程序,至少要在磁盘上提供以下文件:(1)编辑程序,如EDIT.EXE;(2)汇编程序,如MASM.EXE;(3)链接程序,如LINK.EXE;(4)调试程序,如DEBUG.COM。必要时,还要提供CREF.EXE、EXR2BIN.EXE等文件。第4章 汇编语言程序设计4.4.2 汇编语言源程序上机过程汇编语言源程序上机过程1.建立汇编源程序建立汇编源程序.ASM文件文件【例4-7】把40个字母A的字符串从源缓冲区传送到目的缓冲区。可以用编辑程序EDIT在磁盘上建立如下的源程序EXAM.ASM。第4章 汇编语言程序设计第4章 汇编语言程序设计2.汇编产生汇编产生.OBJ

42、文件文件源文件建立后,就要用汇编程序对源文件汇编,汇编后产生二进制的目标文件(.OBJ文件),其操作与汇编程序回答如下:第4章 汇编语言程序设计3.链接产生链接产生.EXE文件文件汇编程序已产生出二进制的目标文件(.OBJ),但.OBJ文件并不是系统可执行的文件,因此还必须使用链接程序(LINK)把.OBJ文件转换为系统可执行的.EXE文件。当然,如果一个程序是由多个模块组成,也应该通过LINK把它们链接在一起,操作方法及机器回答如下:第4章 汇编语言程序设计第4章 汇编语言程序设计LINK程序有两个输入文件.OBJ和.LIB。.OBJ是我们需要链接的目标文件,.LIB则是程序中需要用到的库文

43、件,如无特殊需要,则应对.LIB:直接回车。LINK程序有两个输出文件,一个是.EXE文件,这是我们所需要的,应对EXAM.EXE:直接回车,这样就在磁盘上建立了该可执行文件。LINK的另一个输出文件为.MAP文件,它是链接程序的列表文件,又称为链接映像(LINK MAP),它给出了每个段在存储器中的分配情况。链接程序给出的无堆栈段的警告性错误并不影响程序的运行。所以,到此为止,链接过程已经结束,可以在操作系统下执行EXAM程序了。第4章 汇编语言程序设计4.程序的调试和执行程序的调试和执行在建立了.EXE文件后,就可以直接在操作系统中执行程序,程序如下:C:EXAMC:_ 程序运行结束并返回

44、DOS。如果用户程序已直接把结果在终端上显示出来,那么程序已经运行结束,结果也已经得到。但是,如果EXAM程序并未显示出结果,这就要使用调试程序进行分析。常用的调试工具软件为DEBUG,见附录2。第4章 汇编语言程序设计5.生成生成.COM文件文件.COM文件也是一种可执行文件,由程序本身的二进制代码组成,它没有.EXE文件所具有的包括有关文件信息的标题区(HEADER),因此它占有的存储空间比.EXE文件要小。.COM文件不允许分段,它所占有的空间不允许超过64 KB,因而只能用来编制较小的程序。由于其小而简单,因此其装入速度比.EXE文件要快。使用.COM文件时,程序不分段,其入口点(开始

45、运行的起始点)必须是100H(其前的256个字节为程序段前缀所在地),且不必设置堆栈段。在程序装入时,由系统自动把SP建立在该段之末。对于所有的过程,则应定义为NEAR。第4章 汇编语言程序设计用户可以通过操作系统下的EXE2BIN程序来建立.COM文件,操作方法如下:C:EXE2BIN FILENAME FILENAME.COM注意,上行中的第一个FILENAME给出了已形成的.EXE文件的文件名,但不必给出文件扩展名;第二个FILENAME即为所要求的.COM文件的文件名,它必须带有文件扩展名.COM,这样就形成了所要的.COM文件。此外,.COM文件还可以直接在调试程序DEBUG中用A或

46、E命令建立,对于一些短小的程序,这也是一种相当方便的方法。第4章 汇编语言程序设计4.5 汇编语言程序设计汇编语言程序设计4.5.1 流程图的组成流程图的组成借助于流程图可以清晰地把程序思路表达出来,有助于编写正确的程序。流程图对程序设计人员,特别是初学者来说是一种非常有用的工具。流程图用一些图框表示各种操作,用图形表示算法,直观形象,易于理解。美国国家标准化协会ANSI(American National Standard Institute)规定了一些常用的流程图,已被世界各国程序工作者普遍采用。第4章 汇编语言程序设计流程图一般由六种成分组成,如图4.7所示。图4.7 流程图的组成成分执

47、行框条件判别框开始结束开始框结束框1连接点指向线第4章 汇编语言程序设计1)执行框(矩形框)执行框的作用是表示一段程序或一个模块的功能,对于结构化程序,一个执行框只有一个入口和一个出口。2)判别框(菱形框)判别框的作用是对一个给定的条件进行判断,根据给定的条件是否成立来决定如何执行其后的操作。它有一个入口,两个出口,表示比较、判断条件。3)开始框和结束框开始框和结束框表示程序的起始和结束。第4章 汇编语言程序设计4)指向线指向线表示程序执行的顺序。5)连接点(小圆圈)连接点用于将画在不同地方的流程线连接起来。例如,图4.8中,有两个以为标志的连接点,它表示这两个点是互相连接在一起的。实际上它们

48、是同一个点,只是当在纸张上画不下时才分开来画。使用连接点可以避免流程线的交叉或过长,使流程图清晰。第4章 汇编语言程序设计图4.8 流程图的绘制示意开始X0?结束Y0?NYYN第4章 汇编语言程序设计可以看出,流程图是表示算法的较好工具。一个流程图包括以下几部分:(1)表示相应操作的框;(2)带箭头的流程线;(3)框内外必要的文字说明。绘制流程线时不要忘记画箭头,因为它反映了流程执行的先后次序,如不画出箭头则难以判定各框的执行次序。第4章 汇编语言程序设计4.5.2 顺序程序结构顺序程序结构顺序程序结构是指完全按顺序逐条执行的指令序列,这种程序结构在程序段中大量存在。顺序结构程序是最简单的程序

49、。在顺序结构程序中,指令按照先后顺序一条一条执行。第4章 汇编语言程序设计第4章 汇编语言程序设计注意:(1)本程序采用了DOS中断调用的4CH号功能来退出程序段运行,返回DOS现场。这是一种常用的执行程序返回DOS现场的方法。(2)本例可显示输出。第4章 汇编语言程序设计4.5.3 分支程序设计分支程序设计1.分支程序结构形式分支程序结构形式分支程序结构可以有两种形式,如图4.9所示。它们分别相当于高级语言中的IF_THEN_ELSE语句和CASE语句,适用于要求根据不同条件作不同处理的情况。IF_THEN_ELSE语句可以引出两个分支,CASE语句则可以引出多个分支。不论哪一种形式,它们的

50、共同特点是:运行方向是向前的,在某一种特定条件下,只能执行多个分支中的一个分支。第4章 汇编语言程序设计(a)IF_THEN_ELSE结构 (b)CASE结构图4.9 分支程序的结构形式判定条件YN(a)判定条件(b)第4章 汇编语言程序设计2.分支程序设计方法分支程序设计方法程序的分支一般用条件转移指令来产生,利用转移指令不影响条件码的特性,连续地使用条件转移指令可使程序产生多个不同的分支。【例4-9】TABLE是一字节数组的首地址,长度为100。统计此数组中正数、0及负数的个数,并分别放在COUNT1、COUNT2和COUNT3变量中。其流程图如图4.10所示。第4章 汇编语言程序设计图4

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 大学
版权提示 | 免责声明

1,本文(《微机原理与接口技术》课件第4章.pptx)为本站会员(momomo)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|