《微机原理与接口技术-第4章.ppt》由会员分享,可在线阅读,更多相关《微机原理与接口技术-第4章.ppt(83页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1第四章汇编语言汇编语言基础汇编语言的指令与伪指令PC机汇编语言程序的基本结构汇编语言程序设计基本技术2汇编语言汇编语言 汇编语言是面向机器的程序设计语言。因计算机而异汇编语言的一条可执行语句对应机器语言的一条指令。汇编语言比机器语言更易阅读、编写和修改。是面向编程人员的最低级语言。汇编语言能全面地反映计算机硬件的功能与特点。汇编语言编写的程序的优点是,运行速度快、能充分利用硬件资源、占用存储空间少。汇编语言广泛用于计算机系统的硬件操作程序和核心系统软件,是一切高级语言编译程序的开发工具。汇编语言程序开发周期长,对人员素质要求高。3高级语言脱离了(微)处理器硬件,更符合人们的习惯。与(微)处理
2、器硬件无关,具有很好的通用性和可移植性。采用高级语言编程,具有比用汇编语言编程高得多的程序设计效率。高级语言是面向应用的语言。容易学习和使用。4汇编语言程序 汇编语言汇编语言:用指令的助记符、符号地址、标号等符号书写程序的一种计算机语言。一般情况下,汇编语言程序的一条语句就是计算机的一条指令。汇编语言源程序汇编语言源程序:用汇编语言编写的程序(简称源程序)。.asm汇编汇编:把源程序翻译成机器语言程序(目的程序)的过程。.obj汇编程序汇编程序(assembler):完成汇编任务的程序。连接连接(LINK):将程序的各个组成部分结合成一整体的程序。.exe5汇编过程(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,并产生源程序列表文件。.lst9连接程序(LINK)把目标文件.obj,及所用到的库文件或其它目标文件转换成可执行文件,.exe文件(IBM PC).exe文件为可执行文件,在DOS操作系统下
5、,直接键入该文件名即开始执行。库文件:独立的函数过程等文件。集成环境WAVE6000:将汇编,连接、调试、运行等集成在一个系统中。10汇编程序结构汇编语言语句结构:标号:指令语句 ;注解 A1:MOV AX,1234H ;立即数寻址汇编程序结构(8088MASM为例)数据段(扩展数据段)堆栈段 执行代码段 结束11最简单的汇编程序结构code segment assume cs:codestart:mov ax,100h add ax,100h mov bx,axcode ends end start最简单的汇编程序只有一个段,即代码段。完整的汇编程序可以有四个段组成,分别是代码段,堆栈段,数
6、据段和扩展数据段。12一般汇编程序结构data segment a1 db 12h data endsexdata segment e1 dd 1234h exdata endsstack segment stack st dw 100h spoint equ 200hstack endscode segment assume cs:code,ds:data,es:exdata,ss:stack start:mov ax,data mov ds,ax mov ax,exdata mov es,ax mov ax,stack mov ss,ax mov sp,spoint code ends e
7、nd start13dos汇编程序结束 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 是段定义伪指令,表示段的起始和结束,必须联合使用。由 括起来的部分可有可无。省略号部分表示的是段主体部分。segment 前的段名必须有,而
9、 ends前的段名可省略。段名只是一个符号。17段定位类型Byte:本段可以从任意一个字节边界起始。Word:本段必须从字的边界起始。Para:段基址的最低4位的二进制数值必须为全0。隐含为该类型。Page:段基址的最低8位的二进制数值必须为全0。18段类型说明 public:与其它同名段连接在一起,形成一个新的逻辑段 common:与其它的同名段具有相同的起始地址,重叠,按最大的分配空间。None:与其它段没有关系at expression:本段的起始地址为由 at expression计算出来的值。它不能用来指定代码段的段基址。stack:产生堆栈段,并把所有同名段连成一个新的逻辑段。Me
10、mory:表示本段应被放置在所有其它段的前面(最高地址处)。第一个段作为memory段,其他段都作为common段 19代码段定义伪指令 code segment public code ;定义一个代码段 assume cs:code Start:code ends end start20数据段定义伪指令 DATA SEGMENNT M DB 2 DUP(0,0);定义两个两字节的单元,并赋初值 0,0 X DB 2 DUP(30H,2DUP(4);定义两个以字节为单元的空间,每个空间又定义为,1个字节单元,并赋初值3;和两次重复的2个字节单元,赋初值4。因此共定义了6个字节的存储空间。Y D
11、W 100 DUP(?);定义100个字的单元。DATA ENDS21堆栈段stack segment stack ;定义一个堆栈段 dw 100dup(?)stack ends 定义一个堆栈段,并赋100字(200个字节)空间的。注意堆栈在存储器中的位置。22其它有关段的伪指令 assume 段寄存器名:段名,段寄存器名:段名8088/8086中,段寄存器名必须是CS,DS,ES 或SS之一。段名必须是用 segment/ends伪指令定义过的段名。本伪指令的功能是将定义的段与段寄存器关联起来。在assume语句中,对于CS段寄存器,它不仅把相应的段分配给CS寄存器,还由操作系统直接将段基址
12、装入到CS寄存器中。对于其它段寄存器(DS,ES,SS),则是指定把某个段分配给哪一个寄存器,而没有将段基址装入到相应的段基址中,因此,要在程序中对DS,ES,SS赋值。程序中不必也不能对CS寄存器赋值 23程序结束标志伪指令:END END 标号 END表示程序结束。其中,标号用来告诉操作系统,本程序开始执行的起始地址。若有多个程序模块,连接时,只有主模块的END要带标号。其它仅用END,不带标号。汇编程序应尽量按照程序规定的格式编写。24等值语句伪指令 等值语句是为常量、变量、表达式等定义的符号名,它并不分配存储单元,换句话说等值语句定义的是一个常数值。语句格式:名字(符号)EQU 表达式
13、 完成操作:把 EQU右边表达式的值赋给其左边的名字(符号)。表达式可以是常数、数值表达式、地址表达式、变量、标号名或助记符等。EQU 语句左边的符号名不能使用已定义过的符号名。25等值语句伪指令data segment a1 db 12hb1 equ a1c1 equ 12h+34one=1close=0night=1d1=c1VAR1 EQU BP-10 data endscode segment assume cs:code,ds:data start:mov ax,data mov ds,ax mov bp,14 mov ax,var1 nop code ends end start2
14、6等值语句伪指令符号名以字母开头,可以包括字母、数字、下划线等。汇编语言中有一些保留的关键词,不能用作符号名。等值语句最简单的用法是定义常数。27数据定义伪指令 数据定义伪指令用于定义符号的数据类型,并且可以指明元素个数,在各分段中的相对位置,以及数据的初值等属性。它不仅定义符号,并且还分配存储单元。因此定义的是变量。数据定义语句格式:变量名 数据定义伪指令 表达式1,表达式2,;注释定义数据类型有字节变量、字变量、双字变量、字符串变量、8个字节和10个字节的变量等。28DB 伪指令 以字节为单位分配或保留若干个连续存储单元。如果定义的数据是字符串,则字符串中字符的个数要小于255个。字符串用
15、引号括起来,每一个字符分配一个字节的存储单元。按照地址递增顺序依次分配。DATA1 DB 15,10 ;定义两个字节单元,并赋初值15和10(0fh,0ah)CHAR DB HELLO ;定义一个5个字节的字符串,并赋初值 char db abcde,ABCDE,1,2,3,4,1,2,3,429DW 伪指令 以字(两个字节)为单位分配或保留若干连续存储单元。对一个字来说,低位字节存放在低地址中,高位字节在高地址中。DATA2 DW 4H,3010H ;定义两个字单元,并赋初值 0004H,3010HDATA3 DW 2 DUP(4888H);定义两次重复的字单元,并赋初值 4888H。CHA
16、R DW 2 DUP(4000H,5000H)ASCII DW A,AB,ABCD30DD 伪指令 以双字(4个字节)为单位分配或保留若干个连续存储单元。同样,最高字节在内存的最高地址,依次存储。DDATA2 DD 4H,3010H ;定义两个双字单元,并赋初值。00000004H,00003010H DDATA DD 0,0,?,?31DQ、DT 伪指令 DQ:以4个字(8个字节)为单位分配或保留若干连续存储单元。DT:以5个字(10个字节)为单位来定义或分配若干个连续的存储单元。CHAR DQ ABCDEFGH,78HCHAR DB ABCDEFGH,78H32data segmenta
17、db 10h,2 dup(0EEH),2 dup(?)db 2 dup(30h,0afh)str dbabcde,hellow dw 0abcdh,2345h,2 dup(8765h)qq dq 012345678hdata endscode segment assume cs:code,ds:datastart:mov ax,data mov ds,ax nop nopcode ends end start33过程定义伪指令 专门的程序块称为过程,也称为子程序。在需要的时候通过调用指令(CALL)调用。在汇编语言中,过程用过程定义伪指令来定义和实现。其语法为:过程名 PROC 类型属性(FA
18、R/NEAR)过程名 ENDP过程名是一个标号,也是过程入口的符号地址,在程序中用此名调用。PROC /ENDP是过程定义伪指令。表示过程的开始和结束。在同一段内为NEAR,不同段内为FAR。34其它伪指令语句 1)NAME 名字:在程序开始时,为模块命名2)TITLE 正文:在列表文件中打印出标题,正文最多为60字符。3)对准伪指令(1)EVEN:使下一个字节地址成为偶数。(2)ORG 常数表达式使下一个内存单元的地址成为该常数表达式的值。jt3 35DATA SEGMENT D1 DB 56H(EVEN)D2 DW 7890HDATA ENDSORG 1000H定位一新的起始地址。对准伪指
19、令36基数控制伪指令 汇编程序中默认的数的表达形式是十进制数,若无专门说明,汇编程序将程序中出现的数均看作是十进制数。若其它进制数用后缀注明,如二进制数用后缀B,十六进制数用H,八进制数用O或Q表示。十进制数也可用后缀D注明,伪指令:.RADIX 数值表达式用于改变默认的基数。它可为216 范围内的任一基数。例:.radix 16 .radix 10 mov ax,1a mov ax,1a (h)37PUBLIC 和EXTRN伪指令 PUBLIC 名字,名字,EXTRN 名字:类型,名字:类型,汇编程序可以分为几个程序模块,分别编写和汇编,然后通过连接程序组成一个完整的程序。PUBLIC和EX
20、TRN伪指令提供实现的方法。PUBLIC说明在本模块内或本段内定义的变量或过程,可被别的模块或段引用。EXTRN伪指令说明在本模块或段内用到的变量或过程,是在其它模块或段中定义的。jt4 38public aaa,extrn bbb,data segmentdata endscode segment assume cs:code,ds:dataaaa:call bbb39取值运算符OFFSET:得到一个标号或变量的偏移地址 SEG:得到一个标号或变量的段地址值;TYPE:如果是变量,得到它的类型值(DB为1,DW为2,DD为4,DQ为8,DT为10。如果是标号,得到该标号的类型值(NEAR为-
21、1,FAR为-2)。LENGTH:只对变量有效,回送分配给该变量的单元数 SIZE:变 量 占 用 的 字 节 数。SIZE=TYPE*LENGTH jt540DATA SEGMENTDT DW 8 DUP(11h)NUM DW 980,435H,4,547DH,1234H DW 320H,456H,7890H,234,128d1 db 20 dup(22h,11h)d2 dw 5 dup(8800h)double dd 12345678hdten dt abcdefghijDATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATAMAIN:mov ax,data
22、 mov ds,ax mov bx,offset num ;10h lea bx,num ;10h mov ax,seg num ;DATA mov cx,seg dten ;DATA mov cx,type num ;2 mov cx type abc ;FFFFHAbc:mov dx,length num ;1 mov ax,length dt ;841属性运算符:PTR 赋予地址表达式一个新的类型,而原来的段属性和偏移属性均不改变。PTR 本身不占内存。d1 db 20 dup(22h,11h)d2 dw 5 dup(8800h)mov ax,d1 错 mov ax,word ptr d
23、1mov bl,d2 错 mov al,byte ptr d2 mov al,byte ptr d2+142关于堆栈段堆栈也是一个存储区,但它不按存储单元编号使用。堆栈组成:段地址:SS 堆栈指针:SP指向当前栈顶。堆栈操作:减二,再压栈。8088先压栈顶,再压下一个字节。43堆栈段stack segment stack ;定义一个堆栈段 dw 100dup(?)stack ends 定义一个堆栈段,并赋100字(200个字节)空间的。注意堆栈在存储器中的位置。44汇编语言程序设计的基本技术汇编语言程序设计的基本技术 程序是为了完成特定任务的一系列指令的有序集合。一个好的程序,除能正常运行,实
24、现要求的功能外,还应具有结构清晰、可读性强、执行速度快、占用内存少等特点。汇编语言程序中,最常见的程序形式有顺序程序、分支程序、循环程序和子程序。这几种程序的设计方法是汇编程序设计的基础。此外宏汇编程序中还有“宏”定义。45顺序程序设计顺序程序设计 顺序程序是最简单的程序,它的执行顺序和程序中指令的排列顺序完全一致。也就是从程序的第一条指令开始,依次执行,直到程序的最后一条指令,执行完成,退出。Add:pop ax pop bx add ax,bx push ax jmp$46;-;例4-5-1 顺序程序设计;求 Y=3X4+5X3+6X2+4X+2 的值;计算过程:Y=3*X+5;Y=Y*X
25、+6;Y=Y*X+4;Y=Y*X+2;-DSEG SEGMENT ;数据段定义 X DB 5H ;假定 X=5H Y DW 0DSEG ENDS47CODE SEGMENT ASSUME CS:CODE,DS:DSEG BEGIN:MOV AX,DSEG MOV DS,AX MOV AL,3 MOV BH,0 MOV BL,X ;BL=X MUL BX ADD AX,5 ;AX=3*X+5 MUL BX ADD AX,6 ;AX=MUL BX ADD AX,4 MUL BX ADD AX,2 MOV Y,AX ;保留结果 MOV AH,4CH INT 21H ;返回DOS jmp$CODE E
26、NDSEND BEGIN48分支程序设计分支程序设计根据程序运行的结果采取不同的处理,这时,就需要分支程序来实现。分支程序有两个分支和多个分支两种。两分支结构是根据二值判断条件,转入其中的一支执行。采用条件转移指令实现分支程序。对分支程序,尽量在分支运行结束再汇合到一处,继续执行。也就是说,一个功能段只有一个入口与一个出口。pop ax and ax,0ffffh js,negativepositive:jmp finishnegative:finish:4950JL X1JE X2JG X3JLEJGE三分支体开始 JL X1 JE X2X3:;执行大于程序段 JMP X4X1:;执行小于程
27、序段 JMP X4X2:;执行等于程序段X4:;三分支体结束 51 CODE SEGMENT ASSUME CS:CODEBEGIN:MOV AH,01H ;读键盘输入 INT 21H TEST AL,1 JZ EVN jnz oddodd:MOV AL,31H JMP DISPEVN:MOV AL,30HDISP:PUSH AX MOV AH,01H MOV DL,0AH ;换行 INT 21H MOV DL,0DH ;回车 INT 21H POP AX MOV DL,AL ;显示 INT 21H MOV AH,4CH INT 21HCODE ENDS END BEGIN52循环程序设计循环
28、程序设计 重复执行某一计算过程 循环程序由初始化部分、主循环体(工作部分)、循环修改部分、循环控制部分和结束处理部分组成。循环控制的方法有计数控制法和条件控制法。LOOP 指令,DEC +JZ(JNZ)Dec cx inc cxJnz xxx cmp cx,xx jne xxx53search54循环程序设计循环程序设计循环程序设计要注意循环层次,循环寄存器的使用。CX为LOOP指令指定的寄存器,当需要多重循环时,其它的循环次数不能用CX。如何解决多重循环?55 MOV CX,?LP1:PUSH CX MOV CX,?LP2:(JMP QQQ?)LOOP LP2 POP CX LOOP LP1
29、 56子程序设计子程序设计 子程序是一种相对独立的程序段,它实现某一特定的功能,比如求sin(X)等。子程序是用过程定义伪指令PROC/ENDP定义的程序段。主程序和子程序是相对的,子程序也可以通过CALL指令调用子程序,称为子程序嵌套调用。子程序通过RET指令返回调用它的主程序。参数的传递一般有三种方式,寄存器传递参数、堆栈传递参数和存储器传递参数。堆栈传递参数如何处理?子程序嵌套调用的层数只受堆栈深度的影响。57子程序定义子程序是用过程定义伪指令PROC/ENDP定义的程序段。定义时要注意类型属性的选择,一般原则为在伪指令中已介绍过:(1)主程序和子程序在同一代码段,可定义为NEAR属性或
30、FAR属性。(2)主程序和子程序在不同代码段,定义为FAR属性。(3)主程序一般定义为FAR属性。PC机上的应用程序(.exe文件)看作是DOS调用的一个子程序,而DOS对应用程序的调用和返回都是FAR属性的。58子程序调用和工作过程用CALL指令调用子程序,1.将IP(CS)内容压入堆栈,此时IP(CS)内容是什么?2.将调用的子程序的第一条指令起始的地址送IP(CS)3.执行子程序4.所有子程序最后一条执行指令必须为RET当执行到RET指令时1.将保留的(CS)IP从堆栈中弹出,2.从紧随调用指令的下一条指令继续执行。实验:设计子程序,并分析执行时序59子程序调用和工作过程子程序保护执行时
31、所使用的寄存器的内容(作为主程序和子程序传递参数的寄存器除外)在返回主程序之前再恢复这些寄存器的内容。一般,子程序用PUSH指令将寄存器的内容保存在系统堆栈中,在返回前用指令POP指令将保护内容弹出堆栈,恢复寄存器的内容。注意堆栈的先进后出的特点,最先压进堆栈的数据最后弹出。60子程序调用和工作过程主程序调用子程序时,向子程序提供需要的数据(即入口参数),子程序执行完毕返回主程序时,要将执行的结果(即出口参数)传递回主程序。参数的传递一般有三种方式,寄存器传递参数、堆栈传递参数和存储器传递参数。此外,传递的既可以是参数本身,也可以是参数的地址。61子程序嵌套调用子程序还可以调用其它子程序,称为
32、子程序的嵌套调用,有些子程序还能调用自身,这种调用称为递归调用。子程序嵌套调用的的层数不受限制,只要堆栈空间允许。但递归调用要注意递归的出口条件,防止发生死循环和陷入无限嵌套。62子程序嵌套调用63子程序库子程序是完成某个特定功能的程序。如三角函数计算,如浮点-定点转换等可以事先设计和调试好,并将它们集中组织成为子程序库,供应用程序中调用。如C库函数。(在汇编语言程序中如何实现?)64宏功能程序设计宏功能程序设计 宏指令宏指令是另一种具有独立功能的程序段。宏指令宏指令也称宏命令(宏功能宏命令(宏功能,简称“宏宏”)它与子程序的功能与组成十分相似,但是两个完全不同的程序技术,并且一般它们的应用领
33、域也不同。宏基本上用于核心功能程序的开发。65宏与子程序的区别1.子程序:在程序中只有一段程序代码。宏:每调用一次,产生一段程序代码。2.子程序:在执行时,跳转到子程序代码处执行。执行完,再返回紧随调用指令后的指令继续执行。宏:在程序汇编时用执行代码替换宏命令。没有跳转和返回过程。3.子程序可以在程序的任何地方定义,只要在生成执行程序前定义完成。宏必须在第一次调用前定义。66宏指令 宏指令象指令操作助记符一样,定义后便可在程序中用这个名字来代替这段指令序列。宏指令同样允许传递参数,传递方式也比子程序简单。可以将经常使用的宏指令集中在一起建立宏指令库,在程序中只需按规定的条件调用即可。宏指令可以
34、与CPU指令助记符同名,因而可以替代原来的CPU指令。67宏指令的使用宏指令的调用要经过宏定义、宏调用和宏扩展三个步骤。宏定义和宏调用由用户完成。宏扩展则由宏汇编程序在汇编期间完成。68宏指令的定义宏指令的定义 宏指令定义用伪指令MACRO和ENDM来实现。宏定义的格式:宏指令名 MACRO 形参1,形参2,ENDMMACRO和ENDM间的程序段称为宏体。宏体是宏指令的程序段,它由一系列指令和伪指令组成。69宏指令的定义宏指令的定义形参是临时变量的名字,可有可无、个数不限。宏定义中的形式参数不仅可以出现在指令的操作数部分,也可以出现在指令的助记符部分。在宏扩展时,若形参是某助记符的一部分,则在
35、形参前面加上符号“”。高级语言的子程序也有参数,(形式参数)调用时,用实参代替。汇编语言中子程序(PROC)定义时,没有参数70宏指令宏指令CODE SEGMENTSHIFT MACRO A,B,C ;宏定义 MOV CL,C S&A B,CL ;形参为指令助记符的一部分,加前缀&ENDMMAIN:NOP MOV BX,0FFHSHIFT HL,BX,3 ;宏调用,实现左移功能 NOP ;无作用,为两次显示宏扩展进行隔离 NOP MOV AX,055H SHIFT HR,AX,2 ;宏调用,实现右移功能NOPCODE ENDSEND MAIN71取消宏定义伪指令PURGE 宏指令可以与原指令系
36、统中指令相同。可以替换原来的指令。伪指令PURGE的格式:PURGE 宏指令名,宏指令名,恢复原指令的功能。PURGE SHIFT,72宏调用和宏扩展宏调用和宏扩展 宏指令名在源程序中的出现称为宏调用。宏调用的格式 宏指令名 实参量,实参,宏指令名必须与宏定义中的宏指令名一致,其后的实参可以是数字、字符串、符号名或尖括号括起来的带间隔符的字符串。实参在顺序、属性、类型上要同形参保持一致,个数与形参应相等。用实参代替形参,并将宏体插到宏调用处称为宏扩展。73例:宏扩展宏扩展 0450H 90 NOP0451H BBFF00 MOV BX,00FFH0454H B103 MOV CL,03H;宏扩
37、展*0456H D3E3 SHL BX,CL ;*0458H 90 NOP0459H 90 NOP045AH B85500 MOV AX,0055H045DH B102 MOV CL,02H045FH D3E8 SHR AX,CL ;宏扩展0461H 90 NOP74宏体中的标号和变量宏体中的标号和变量 每调用一次宏指令都生成一段代码(宏扩展)。宏体中允许定义标号,也允许定义变量(这个变量不是形参)。宏指令在程序中多次调用时,在进行宏汇编时就会产生多个重名的标号和变量,造成多次定义错误。75宏汇编伪指令LOCAL 伪指令LOCAL的格式:LOCAL 符号表LOCAL的功能是,在宏扩展时,宏汇编
38、将按其调用顺序和符号表中的符号顺序自动为其后的符号指定特殊的符号(?0000?FFFF),并用这些特殊的符号替换宏体中相应的符号,从而避免了符号多重定义的错误。LOCAL伪指令只能用在宏定义中,且必须是宏体中指令或伪指令的第一条。在宏定义时,凡宏体中定义的标号和变量均用LOCAL伪指令说明,这样,即使没有多次调用也无关系 76条件汇编与宏库的使用条件汇编与宏库的使用 使用的宏指令,可将它们集中在一起,建成宏库,供自己或他人调用。当程序中需要调用时,应使用伪指令INCLUDE将宏库加入自己的源文件中,然后按宏库中各宏指令的规定调用即可。伪指令INCLUDE的格式:INCLUDE 宏库名该伪指令的
39、功能是先将宏库进行汇编,将宏库汇编完后再继续汇编后面的程序。77 宏功能程序宏功能程序 通用功能块有两种不同的编程方式:子程序,宏指令。子程序:每一个子程序,只对应也只能有一个可执行程序段。在程序运行时调用。宏指令(功能):程序中每调用一次宏指令,就产生一段执行代码程序。在程序汇编时进行替代(宏扩展)。78宏指令的特点先定义,后调用。汇编时进行扩展。形式参数不仅可以出现在指令的操作数部分,也可以出现在指令的助记符部分。定义的宏指令可以与CPU指令助记符相同。并且替代原指令。设计新的指令集。设计新的指令集。jmacro79动态连接库概念早期的计算机系统在一个时刻只能有一个程序运行,这种操作系统称
40、为单任务操作系统。比如DOS系统。为了提高计算机处理效率,一个CPU可同时处理许多程序,这种操作系统称为多任务操作系统。比如UNIX系统,WINDOWS系统。每一个程序要运行都要占用一定的存储器空间80动态连接库概念现在许多程序功能的实现是通过调用系统提供的模块程序(子程序库)。若有几个程序要用到子程序库中的同一个子程序,则要通过连接程序,将该段代码拷贝到可执行程序中。多次占用存储器。动态连接库改变这种运行方式,不在编译时将程序段代码直接拷贝到可执行程序中,而是在执行时,将其连接。这样不管有多少任务(程序)用该子程序,在内存中只有一个代码副本。81动态连接库概念及时调入、调出使用任务计数任务状态管理操作系统任务82本章小结什么是(宏)汇编语言?汇编语言程序工作过程:8086/8088汇编语言程序的结构。程序设计基本方法。子程序与宏指令的概念、编程和使用,它们的相同点和不同点。汇编语言语句结构与指令系统的关系,寻址方式,如何确定它们的物理地址。通过本章学习,应掌握了基本汇编程序设计、调试技术。83实验3:汇编语言程序设计。(要求采用尽量少的代码)实验4:分析宏功能与子程序的执行过程习题:1、2、3、4