收藏 分享(赏)

微机原理与接口技术——第4章.ppt

上传人:dzzj200808 文档编号:3313990 上传时间:2018-10-12 格式:PPT 页数:83 大小:277KB
下载 相关 举报
微机原理与接口技术——第4章.ppt_第1页
第1页 / 共83页
微机原理与接口技术——第4章.ppt_第2页
第2页 / 共83页
微机原理与接口技术——第4章.ppt_第3页
第3页 / 共83页
微机原理与接口技术——第4章.ppt_第4页
第4页 / 共83页
微机原理与接口技术——第4章.ppt_第5页
第5页 / 共83页
点击查看更多>>
资源描述

1、1,第四章 汇编语言,汇编语言基础 汇编语言的指令与伪指令 PC机汇编语言程序的基本结构 汇编语言程序设计基本技术,2,汇编语言,汇编语言是面向机器的程序设计语言。因计算机而异 汇编语言的一条可执行语句对应机器语言的一条指令。 汇编语言比机器语言更易阅读、编写和修改。是面向编程人员的最低级语言。 汇编语言能全面地反映计算机硬件的功能与特点。 汇编语言编写的程序的优点是,运行速度快、能充分利用硬件资源、占用存储空间少。 汇编语言广泛用于计算机系统的硬件操作程序和核心系统软件,是一切高级语言编译程序的开发工具。 汇编语言程序开发周期长,对人员素质要求高。,3,高级语言,脱离了(微)处理器硬件,更符

2、合人们的习惯。 与(微)处理器硬件无关,具有很好的通用性和可移植性。 采用高级语言编程,具有比用汇编语言编程高得多的程序设计效率。 高级语言是面向应用的语言。容易学习和使用。,4,汇编语言程序,汇编语言:用指令的助记符、符号地址、标号等符号书写程序的一种计算机语言。一般情况下,汇编语言程序的一条语句就是计算机的一条指令。 汇编语言源程序:用汇编语言编写的程序(简称源程序)。.asm 汇编:把源程序翻译成机器语言程序(目的程序)的过程。.obj 汇编程序(assembler):完成汇编任务的程序。 连接(LINK):将程序的各个组成部分结合成一整体的程序。.exe,5,汇编过程,(1) 输入汇编

3、语言的源文件。其扩展名为:.asm。 (2) 用汇编程序把.asm源文件汇编成目标文件,其扩展名为.obj, (3) 用连接程序(LINK)把目标文件.Obj,及所用到的库文件或其它目标文件转换成可执行文件.EXE。,6,基本汇编程序和宏汇编 (Macro ASseMbler),汇编程序是将汇编语言源程序翻译成机器语言的程序。 按用户要求自动分配存储区(包括程序区、数据区、堆栈区等);数制转换;计算常数表达式的值;对源程序进行语法检查,给出错误信息等功能。基本汇编程序。 宏汇编(Macro ASseMbler):在基本汇编程序的基础上,允许将一组汇编语言语句序列定义为一条宏指令的汇编程序。,7

4、,宏指令或宏命令,将一组汇编语言语句序列定义为一个功能块,并赋予一个名字,其表示形式尤如一条计算机指令,并且在随后的汇编语言源程序中,可以象CPU的其它指令一样使用。 宏指令或宏命令简称为 “宏” MACRO。 宏可以用与原来的计算机指令一样的符号。,8,宏汇编程序的主要功能,1)检查和编排源程序,2)对源程序中的宏指令进行展开,3)检查源程序中的语法错误,并给出出错信息,4)把源程序翻译成目标程序.obj,并产生源程序列表文件。 .lst,9,连接程序(LINK),把目标文件.obj,及所用到的库文件或其它目标文件转换成可执行文件,.exe文件(IBM PC) .exe文件为可执行文件,在D

5、OS操作系统下,直接键入该文件名即开始执行。 库文件:独立的函数过程等文件。 集成环境WAVE6000:将汇编,连接、调试、运行等集成在一个系统中。,10,汇编程序结构,汇编语言语句结构:标号: 指令语句 ;注解A1: MOV AX,1234H ;立即数寻址汇编程序结构(8088MASM为例)数据段(扩展数据段)堆栈段执行代码段结束,11,最简单的汇编程序结构,code segmentassume cs:code start: mov ax, 100hadd ax, 100hmov bx,ax code endsend start,最简单的汇编程序只有一个段,即代码段。 完整的汇编程序可以有四

6、个段组成,分别是代码段,堆栈段,数据段和扩展数据段。,12,一般汇编程序结构,data segment a1 db 12h data ends exdata segment e1 dd 1234h exdata ends stack segment stackst dw 100hspoint equ 200h stack ends,code segmentassume cs:code, ds:data, es:exdata,ss:stack start:mov ax,datamov ds,axmov ax,exdatamov es, axmov ax, stackmov ss, axmov s

7、p, spoint code endsend start,13,dos汇编程序结束,MOV AH, 4CH ;DOS功能调用INT 21H ;返回DOS操作系统 在DOS操作系统下运行程序的过程: 输入运行程序名(.exe)文件,按返回键,开始运行。 运行到程序结束时执行上面指令后,DOS重新获得控制权。实验系统没有DOS操作系统,为了防止系统崩溃,程序的最后一条为:JMP $ ;等待,14,汇编程序,汇编程序中一部分语句即为用助记符表示的计算机指令系统所组成,它经过汇编后成为计算机能执行的语句。 另一部分语句不是由计算机指令组成。但它控制和指导汇编程序的工作过程。这类非计算机可直接执行的汇编

8、语言指令称伪指令。伪指令中最值得提到的就是所谓的宏定义。,15,段定义伪指令,一个完整的汇编语言源程序,通常有三个部分组成,即代码部分,数据部分和堆栈部分。8086/8088的数据部分还可进一步分为(基本)数据部分(DS)和扩展数据部分(ES)。 段定义伪指令用于对它们进行定义。 汇编时,按段生成浮动目标代码;连接时,将各模块中同名段进行组合。 8088/8086中有四个段寄存器:CS,DS,ES,SS。,16,段定义伪指令的格式,段名 segment 定位类型 组合类型 类别名 段名 ends 其中,segment和ends 是段定义伪指令,表示段的起始和结束,必须联合使用。由 括起来的部分

9、可有可无。省略号部分表示的是段主体部分。segment 前的段名必须有,而 ends前的段名可省略。段名只是一个符号。,17,段定位类型,Byte: 本段可以从任意一个字节边界起始。 Word: 本段必须从字的边界起始。 Para: 段基址的最低4位的二进制数值必须为全0。隐含为该类型。 Page: 段基址的最低8位的二进制数值必须为全0。,18,段类型说明,public :与其它同名段连接在一起,形成一个新的逻辑段 common :与其它的同名段具有相同的起始地址 ,重叠,按最大的分配空间。 None:与其它段没有关系 at expression:本段的起始地址为由 at expressio

10、n计算出来的值。它不能用来指定代码段的段基址。 stack :产生堆栈段,并把所有同名段连成一个新的逻辑段。 Memory: 表示本段应被放置在所有其它段的前面(最高地址处)。第一个段作为memory段,其他段都作为common段,19,代码段定义伪指令,code segment public code ;定义一个代码段assume cs:code Start: code endsend start,20,数据段定义伪指令,DATA SEGMENNTM DB 2 DUP(0,0);定义两个两字节的单元,并赋初值 0,0X DB 2 DUP(30H,2DUP(4) ;定义两个以字节为单元的空间,

11、每个空间又定义为,1个字节单元,并赋初值3;和两次重复的2个字节单元,赋初值4。因此共定义了6个字节的存储空间。Y DW 100 DUP(?) ;定义100个字的单元。 DATA ENDS,21,堆栈段,stack segment stack ;定义一个堆栈段dw 100dup(?)stack ends 定义一个堆栈段,并赋100字(200个字节)空间的。 注意堆栈在存储器中的位置。,22,其它有关段的伪指令,assume 段寄存器名:段名,段寄存器名:段名 8088/8086中,段寄存器名必须是CS,DS,ES 或SS之一。段名必须是用 segment/ends伪指令定义过的段名。 本伪指令

12、的功能是将定义的段与段寄存器关联起来。在assume语句中,对于CS段寄存器,它不仅把相应的段分配给CS寄存器,还由操作系统直接将段基址装入到CS寄存器中。对于其它段寄存器(DS,ES,SS),则是指定把某个段分配给哪一个寄存器,而没有将段基址装入到相应的段基址中,因此,要在程序中对DS,ES,SS赋值。 程序中不必也不能对CS寄存器赋值,23,程序结束标志伪指令 :END,END 标号 END表示程序结束。其中,标号用来告诉操作系统,本程序开始执行的起始地址。若有多个程序模块,连接时,只有主模块的END要带标号。其它仅用END,不带标号。 汇编程序应尽量按照程序规定的格式编写。,24,等值语

13、句伪指令,等值语句是为常量、变量、表达式等定义的符号名,它并不分配存储单元,换句话说等值语句定义的是一个常数值。 语句格式:名字(符号) EQU 表达式完成操作:把 EQU右边表达式的值赋给其左边的名字(符号)。表达式可以是常数、数值表达式、地址表达式、变量、标号名或助记符等。 EQU 语句左边的符号名不能使用已定义过的符号名。,25,等值语句伪指令,data segment a1 db 12h b1 equ a1 c1 equ 12h+34 one = 1 close = 0 night =1 d1 = c1 VAR1 EQU BP-10 data ends,code segmentassu

14、me cs:code, ds:data start:mov ax,datamov ds,axmov bp, 14mov ax, var1nop code endsend start,26,等值语句伪指令,符号名以字母开头,可以包括字母、数字、下划线等。汇编语言中有一些保留的关键词,不能用作符号名。 等值语句最简单的用法是定义常数。,27,数据定义伪指令,数据定义伪指令用于定义符号的数据类型,并且可以指明元素个数,在各分段中的相对位置,以及数据的初值等属性。 它不仅定义符号,并且还分配存储单元。因此定义的是变量。 数据定义语句格式: 变量名 数据定义伪指令 表达式1,表达式2, ;注释 定义数据

15、类型有字节变量、字变量、双字变量、字符串变量、8个字节和10个字节的变量等。,28,DB 伪指令,以字节为单位分配或保留若干个连续存储单元。如果定义的数据是字符串,则字符串中字符的个数要小于255个。字符串用引号括起来,每一个字符分配一个字节的存储单元。按照地址递增顺序依次分配。 DATA1 DB 15, 10 ;定义两个字节单元,并赋初值15和10 (0fh,0ah) CHAR DB HELLO ;定义一个5个字节的字符串,并赋初值 char db abcde, ABCDE, 1,2,3,4 , 1,2,3,4,29,DW 伪指令,以字(两个字节)为单位分配或保留若干连续存储单元。对一个字来

16、说,低位字节存放在低地址中,高位字节在高地址中。 DATA2 DW 4H,3010H ;定义两个字单元,并赋初值 0004H,3010H DATA3 DW 2 DUP(4888H) ;定义两次重复的字单元,并赋初值 4888H。 CHAR DW 2 DUP(4000H, 5000H) ASCII DW A,AB,ABCD,30,DD 伪指令,以双字(4个字节)为单位分配或保留若干个连续存储单元。同样,最高字节在内存的最高地址,依次存储。 DDATA2 DD 4H,3010H ;定义两个双字单元,并赋初值 。00000004H,00003010H DDATA DD 0, 0, ?, ?,31,D

17、Q 、DT 伪指令,DQ:以4个字(8个字节)为单位分配或保留若干连续存储单元。 DT:以5个字(10个字节)为单位来定义或分配若干个连续的存储单元。 CHAR DQ ABCDEFGH,78H CHAR DB ABCDEFGH,78H,32,data segment a db 10h, 2 dup(0EEH), 2 dup(?)db 2 dup(30h,0afh) str dbabcde, hello w dw 0abcdh, 2345h, 2 dup(8765h) qq dq 012345678h tt dt 0112233445566778899aah data ends,code seg

18、mentassume cs:code, ds:data start:mov ax, datamov ds, axnopnop code endsend start,33,过程定义伪指令,专门的程序块称为过程,也称为子程序。在需要的时候通过调用指令(CALL)调用。在汇编语言中,过程用过程定义伪指令来定义和实现。其语法为:过程名 PROC 类型属性 (FAR/NEAR) 过程名 ENDP 过程名是一个标号,也是过程入口的符号地址,在程序中用此名调用。 PROC /ENDP是过程定义伪指令。表示过程的开始和结束。 在同一段内为NEAR,不同段内为FAR。,34,其它伪指令语句,1)NAME 名字:

19、在程序开始时,为模块命名 2)TITLE 正文:在列表文件中打印出标题,正文最多为60字符。 3)对准伪指令 (1)EVEN:使下一个字节地址成为偶数。 (2)ORG 常数表达式 使下一个内存单元的地址成为该常数表达式的值。 jt3,35,DATA SEGMENT D1 DB 56H (EVEN) D2 DW 7890H DATA ENDS, ORG 1000H 定位一新的起始地址。,对准伪指令,36,基数控制伪指令,汇编程序中默认的数的表达形式是十进制数,若无专门说明,汇编程序将程序中出现的数均看作是十进制数。若其它进制数用后缀注明,如二进制数用后缀B,十六进制数用H,八进制数用O或Q表示。

20、十进制数也可用后缀D注明, 伪指令: .RADIX 数值表达式 用于改变默认的基数。它可为216 范围内的任一基数。 例: .radix 16 .radix 10mov ax, 1a mov ax, 1a (h),37,PUBLIC 和EXTRN伪指令,PUBLIC 名字 ,名字, EXTRN 名字:类型,名字:类型, 汇编程序可以分为几个程序模块,分别编写和汇编,然后通过连接程序组成一个完整的程序。PUBLIC和EXTRN伪指令提供实现的方法。PUBLIC说明在本模块内或本段内定义的变量或过程,可被别的模块或段引用。 EXTRN伪指令说明在本模块或段内用到的变量或过程,是在其它模块或段中定义

21、的。jt4,38,public aaa, extrn bbb, data segment data ends code segmentassume cs:code, ds:data aaa:call bbb ,39,取值运算符,OFFSET:得到一个标号或变量的偏移地址 SEG:得到一个标号或变量的段地址值; TYPE:如果是变量,得到它的类型值(DB为1,DW为2,DD为4,DQ为8,DT为10。如果是标号,得到该标号的类型值(NEAR为-1,FAR为-2)。 LENGTH:只对变量有效,回送分配给该变量的单元数 SIZE:变量占用的字节数。SIZE = TYPE*LENGTH jt5,40

22、,DATA SEGMENT DT DW 8 DUP(11h) NUM DW 980,435H,4,547DH,1234HDW 320H,456H,7890H,234,128 d1 db 20 dup(22h,11h) d2 dw 5 dup(8800h) double dd 12345678h dten dt abcdefghij DATA ENDS,CODE SEGMENTASSUME CS:CODE, DS:DATA MAIN:mov ax, datamov ds, axmov bx, offset num ;10hlea bx, num ;10hmov ax, seg num ;DATA

23、mov cx, seg dten ;DATAmov cx, type num ;2mov cx type abc ;FFFFH Abc: mov dx, length num ;1mov ax, length dt ;8,41,属性运算符:PTR,赋予地址表达式一个新的类型,而原来的段属性和偏移属性均不改变。PTR 本身不占内存。 d1 db 20 dup(22h,11h) d2 dw 5 dup(8800h)mov ax, d1 错 mov ax, word ptr d1 mov bl, d2 错 mov al, byte ptr d2mov al, byte ptr d2+1,42,关于堆

24、栈段,堆栈也是一个存储区,但它不按存储单元编号使用。 堆栈组成:段地址:SS堆栈指针:SP指向当前栈顶。 堆栈操作:减二,再压栈。8088先压栈顶,再压下一个字节。,43,堆栈段,stack segment stack ;定义一个堆栈段dw 100dup(?)stack ends 定义一个堆栈段,并赋100字(200个字节)空间的。 注意堆栈在存储器中的位置。,44,汇编语言程序设计的基本技术,程序是为了完成特定任务的一系列指令的有序集合。一个好的程序,除能正常运行,实现要求的功能外,还应具有结构清晰、可读性强、执行速度快、占用内存少等特点。 汇编语言程序中,最常见的程序形式有顺序程序、分支程

25、序、循环程序和子程序。这几种程序的设计方法是汇编程序设计的基础。 此外宏汇编程序中还有“宏”定义。,45,顺序程序设计,顺序程序是最简单的程序,它的执行顺序和程序中指令的排列顺序完全一致。也就是从程序的第一条指令开始,依次执行,直到程序的最后一条指令,执行完成,退出。,Add:pop ax pop bxadd ax, bxpush axjmp $,46,;- ;例4-5-1 顺序程序设计 ;求 Y= 3X4 + 5X3 + 6X2 + 4X+2 的值 ;计算过程:Y=3*X+5 ; Y=Y*X+6 ; Y=Y*X+4 ; Y=Y*X+2 ;- DSEG SEGMENT ;数据段定义X DB 5

26、H ;假定 X=5HY DW 0 DSEG ENDS,47,CODE SEGMENTASSUME CS:CODE,DS:DSEG BEGIN: MOV AX, DSEG MOV DS, AXMOV AL, 3MOV BH, 0MOV BL, X ;BL = X MUL BX ADD AX, 5 ;AX= 3*X +5 MUL BX ADD AX, 6 ;AX=MUL BXADD AX, 4MUL BXADD AX, 2MOV Y, AX ;保留结果MOV AH, 4CH INT 21H ;返回DOS jmp $CODE ENDS END BEGIN,48,分支程序设计,根据程序运行的结果采取不

27、同的处理,这时,就需要分支程序来实现。 分支程序有两个分支和多个分支两种。两分支结构是根据二值判断条件,转入其中的一支执行。 采用条件转移指令实现分支程序。 对分支程序,尽量在分支运行结束再汇合到一处,继续执行。也就是说,一个功能段只有一个入口与一个出口。,pop axand ax, 0ffffhjs, negative positive:jmp finish negative: finish:,49,50,JL X1 JE X2 JG X3JLE JGE,三分支体开始JL X1 JE X2 X3: ;执行大于程序段JMP X4 X1: ;执行小于程序段JMP X4 X2: ;执行等于程序段

28、X4: ;三分支体结束,51,CODE SEGMENTASSUME CS:CODE BEGIN:MOV AH, 01H ;读键盘输入INT 21HTEST AL, 1JZ EVNjnz odd odd:MOV AL, 31HJMP DISP EVN:MOV AL, 30H,DISP:PUSH AXMOV AH, 01HMOV DL, 0AH ;换行INT 21HMOV DL, 0DH ;回车INT 21HPOP AXMOV DL,AL ;显示INT 21HMOV AH,4CHINT 21H CODE ENDSEND BEGIN,52,循环程序设计,重复执行某一计算过程 循环程序由初始化部分、主

29、循环体(工作部分)、循环修改部分、循环控制部分和结束处理部分组成。 循环控制的方法有计数控制法和条件控制法 。 LOOP 指令,DEC +JZ(JNZ) Dec cx inc cx Jnz xxx cmp cx, xxjne xxx,53,search,54,循环程序设计,循环程序设计要注意循环层次,循环寄存器的使用。 CX为LOOP指令指定的寄存器,当需要多重循环时,其它的循环次数不能用CX。 如何解决多重循环?,55,MOV CX, ? LP1:PUSH CXMOV CX, ? LP2:(JMP QQQ ?)LOOP LP2POP CXLOOP LP1,56,子程序设计,子程序是一种相对独

30、立的程序段,它实现某一特定的功能,比如求sin(X)等。 子程序是用过程定义伪指令PROC/ENDP定义的程序段。 主程序和子程序是相对的,子程序也可以通过CALL指令调用子程序,称为子程序嵌套调用。 子程序通过RET指令返回调用它的主程序。 参数的传递一般有三种方式,寄存器传递参数、堆栈传递参数和存储器传递参数 。 堆栈传递参数如何处理? 子程序嵌套调用的层数只受堆栈深度的影响。,57,子程序定义,子程序是用过程定义伪指令PROC/ENDP定义的程序段。定义时要注意类型属性的选择,一般原则为在伪指令中已介绍过: (1) 主程序和子程序在同一代码段,可定义为NEAR属性或FAR属性。 (2)

31、主程序和子程序在不同代码段,定义为FAR属性。 (3) 主程序一般定义为FAR属性。 PC机上的应用程序(.exe文件)看作是DOS调用的一个子程序,而DOS对应用程序的调用和返回都是FAR属性的。,58,子程序调用和工作过程,用CALL指令调用子程序,将IP(CS)内容压入堆栈,此时IP(CS)内容是什么? 将调用的子程序的第一条指令起始的地址送IP(CS) 执行子程序 所有子程序最后一条执行指令必须为RET 当执行到RET指令时 将保留的(CS)IP从堆栈中弹出, 从紧随调用指令的下一条指令继续执行。实验:设计子程序,并分析执行时序,59,子程序调用和工作过程,子程序保护执行时所使用的寄存

32、器的内容(作为主程序和子程序传递参数的寄存器除外) 在返回主程序之前再恢复这些寄存器的内容。 一般,子程序用PUSH指令将寄存器的内容保存在系统堆栈中,在返回前用指令POP指令将保护内容弹出堆栈,恢复寄存器的内容。 注意堆栈的先进后出的特点,最先压进堆栈的数据最后弹出。,60,子程序调用和工作过程,主程序调用子程序时,向子程序提供需要的数据(即入口参数), 子程序执行完毕返回主程序时,要将执行的结果(即出口参数)传递回主程序。 参数的传递一般有三种方式,寄存器传递参数、堆栈传递参数和存储器传递参数。 此外,传递的既可以是参数本身,也可以是参数的地址。,61,子程序嵌套调用,子程序还可以调用其它

33、子程序,称为子程序的嵌套调用, 有些子程序还能调用自身,这种调用称为递归调用。 子程序嵌套调用的的层数不受限制,只要堆栈空间允许。但递归调用要注意递归的出口条件,防止发生死循环和陷入无限嵌套。,62,子程序嵌套调用,63,子程序库,子程序是完成某个特定功能的程序。如三角函数计算,如浮点-定点转换等 可以事先设计和调试好,并将它们集中组织成为子程序库,供应用程序中调用。如C库函数。 (在汇编语言程序中如何实现?),64,宏功能程序设计,宏指令是另一种具有独立功能的程序段。 宏指令也称宏命令(宏功能,简称“宏”)它与子程序的功能与组成十分相似,但是两个完全不同的程序技术,并且一般它们的应用领域也不

34、同。 宏基本上用于核心功能程序的开发。,65,宏与子程序的区别,子程序:在程序中只有一段程序代码。宏:每调用一次,产生一段程序代码。 2. 子程序:在执行时,跳转到子程序代码处执行。执行完,再返回紧随调用指令后的指令继续执行。宏:在程序汇编时用执行代码替换宏命令。没有跳转和返回过程。 3. 子程序可以在程序的任何地方定义,只要在生成执行程序前定义完成。宏必须在第一次调用前定义。,66,宏指令,宏指令象指令操作助记符一样,定义后便可在程序中用这个名字来代替这段指令序列。 宏指令同样允许传递参数,传递方式也比子程序简单。 可以将经常使用的宏指令集中在一起建立宏指令库,在程序中只需按规定的条件调用即

35、可。 宏指令可以与CPU指令助记符同名,因而可以替代原来的CPU指令。,67,宏指令的使用,宏指令的调用要经过宏定义、宏调用和宏扩展三个步骤。 宏定义和宏调用由用户完成。宏扩展则由宏汇编程序在汇编期间完成。,68,宏指令的定义,宏指令定义用伪指令MACRO和ENDM来实现。 宏定义的格式: 宏指令名 MACRO 形参1 ,形参2,ENDM MACRO和ENDM间的程序段称为宏体。 宏体是宏指令的程序段,它由一系列指令和伪指令组成。,69,宏指令的定义,形参是临时变量的名字,可有可无、个数不限。 宏定义中的形式参数不仅可以出现在指令的操作数部分,也可以出现在指令的助记符部分。在宏扩展时,若形参是

36、某助记符的一部分,则在形参前面加上符号“”。高级语言的子程序也有参数,(形式参数) 调用时,用实参代替。汇编语言中子程序(PROC)定义时,没有参数,70,宏指令,CODE SEGMENT SHIFT MACRO A, B, C ;宏定义MOV CL, CS&A B, CL ;形参为指令助记符的一部分,加前缀&ENDM MAIN:NOPMOV BX, 0FFH SHIFT HL, BX, 3 ;宏调用,实现左移功能NOP ;无作用,为两次显示宏扩展进行隔离NOPMOV AX, 055H SHIFT HR, AX, 2 ;宏调用,实现右移功能 NOP CODE ENDS END MAIN,71,

37、取消宏定义伪指令PURGE,宏指令可以与原指令系统中指令相同。 可以替换原来的指令。伪指令PURGE的格式: PURGE 宏指令名,宏指令名,恢复原指令的功能。 PURGE SHIFT,,72,宏调用和宏扩展,宏指令名在源程序中的出现称为宏调用。 宏调用的格式 宏指令名 实参量,实参, 宏指令名必须与宏定义中的宏指令名一致,其后的实参可以是数字、字符串、符号名或尖括号括起来的带间隔符的字符串。 实参在顺序、属性、类型上要同形参保持一致,个数与形参应相等。 用实参代替形参,并将宏体插到宏调用处称为宏扩展。,73,例:宏扩展,0450H 90 NOP 0451H BBFF00 MOV BX, 00

38、FFH 0454H B103 MOV CL, 03H ;宏扩展* 0456H D3E3 SHL BX, CL ; * 0458H 90 NOP 0459H 90 NOP 045AH B85500 MOV AX, 0055H 045DH B102 MOV CL, 02H 045FH D3E8 SHR AX, CL ;宏扩展 0461H 90 NOP,74,宏体中的标号和变量,每调用一次宏指令都生成一段代码(宏扩展)。 宏体中允许定义标号,也允许定义变量(这个变量不是形参)。 宏指令在程序中多次调用时,在进行宏汇编时就会产生多个重名的标号和变量,造成多次定义错误。,75,宏汇编伪指令LOCAL,伪

39、指令LOCAL的格式: LOCAL 符号表 LOCAL的功能是,在宏扩展时,宏汇编将按其调用顺序和符号表中的符号顺序自动为其后的符号指定特殊的符号(?0000?FFFF),并用这些特殊的符号替换宏体中相应的符号,从而避免了符号多重定义的错误。 LOCAL伪指令只能用在宏定义中,且必须是宏体中指令或伪指令的第一条。 在宏定义时,凡宏体中定义的标号和变量均用LOCAL伪指令说明,这样,即使没有多次调用也无关系,76,条件汇编与宏库的使用,使用的宏指令,可将它们集中在一起,建成宏库,供自己或他人调用。当程序中需要调用时,应使用伪指令INCLUDE将宏库加入自己的源文件中,然后按宏库中各宏指令的规定调

40、用即可。 伪指令INCLUDE的格式: INCLUDE 宏库名 该伪指令的功能是先将宏库进行汇编,将宏库汇编完后再继续汇编后面的程序。,77,宏功能程序,通用功能块有两种不同的编程方式:子程序,宏指令。 子程序:每一个子程序,只对应也只能有一个可执行程序段。在程序运行时调用。 宏指令(功能):程序中每调用一次宏指令,就产生一段执行代码程序。在程序汇编时进行替代(宏扩展)。,78,宏指令的特点,先定义,后调用。 汇编时进行扩展。 形式参数不仅可以出现在指令的操作数部分,也可以出现在指令的助记符部分。 定义的宏指令可以与CPU指令助记符相同。并且替代原指令。 设计新的指令集。,jmacro,79,

41、动态连接库概念,早期的计算机系统在一个时刻只能有一个程序运行,这种操作系统称为单任务操作系统。比如DOS系统。 为了提高计算机处理效率,一个CPU可同时处理许多程序,这种操作系统称为多任务操作系统。比如UNIX系统,WINDOWS系统。 每一个程序要运行都要占用一定的存储器空间,80,动态连接库概念,现在许多程序功能的实现是通过调用系统提供的模块程序(子程序库)。 若有几个程序要用到子程序库中的同一个子程序,则要通过连接程序,将该段代码拷贝到可执行程序中。多次占用存储器。 动态连接库改变这种运行方式,不在编译时将程序段代码直接拷贝到可执行程序中,而是在执行时,将其连接。这样不管有多少任务(程序)用该子程序,在内存中只有一个代码副本。,81,动态连接库概念,及时调入、调出 使用任务计数 任务状态管理 操作系统任务,82,本章小结,什么是(宏)汇编语言? 汇编语言程序工作过程: 8086/8088汇编语言程序的结构。 程序设计基本方法。 子程序与宏指令的概念、编程和使用,它们的相同点和不同点。 汇编语言语句结构与指令系统的关系,寻址方式,如何确定它们的物理地址。 通过本章学习,应掌握了基本汇编程序设计、调试技术。,83,实验3:汇编语言程序设计。(要求采用尽量少的代码) 实验4:分析宏功能与子程序的执行过程 习题: 1、2、3、4,

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

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报