1 / 21

5.4 宏指令语句

5.4 宏指令语句. 1. 宏指令、宏定义和宏调用 宏指令是源程序中具有独立功能的一段程序代码。在汇编语言中,如果在源程序中需要多次使用同一个程序段,可以将这个程序段定义(宏定义)为一个宏指令,然后每次需要是,即可简单地用宏指令名来代替(称为宏调用),从而避免了重复书写,使源程序更加简洁、易读。 宏定义由 MASM 宏汇编程序提供的伪指令实现,其格式为. …. 宏体. 宏指令名 MACRO [形式参数] ENDM 宏调用的格式为 宏指令名 [实际参数] 这就是说,只要在源程序中写上已定义过的宏指令名就算是调用该宏指令了。

pennie
Download Presentation

5.4 宏指令语句

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 5.4 宏指令语句 1.宏指令、宏定义和宏调用 宏指令是源程序中具有独立功能的一段程序代码。在汇编语言中,如果在源程序中需要多次使用同一个程序段,可以将这个程序段定义(宏定义)为一个宏指令,然后每次需要是,即可简单地用宏指令名来代替(称为宏调用),从而避免了重复书写,使源程序更加简洁、易读。 宏定义由MASM宏汇编程序提供的伪指令实现,其格式为

  2. 宏体 宏指令名 MACRO [形式参数] ENDM 宏调用的格式为 宏指令名 [实际参数] 这就是说,只要在源程序中写上已定义过的宏指令名就算是调用该宏指令了。 具有宏调用的源程序被汇编时,每个宏调用将被MASM进行宏展开。宏展开实际上是用宏定义式设计的宏体去代替相应的宏指令,并用实际参数一一取代形参。

  3. 由此可见,使用宏的过程共有三步:首先进行宏定义;然后可以进行宏调用;最后,汇编时由MASM进行宏展开。由此可见,使用宏的过程共有三步:首先进行宏定义;然后可以进行宏调用;最后,汇编时由MASM进行宏展开。 [例] 若源程序中多处需要将AL和CL寄存器中的两位压缩型的BCD数相加,并将和送回BL寄存器,则可象下述这样定义宏指令,然后在需要的地方进行调用。 DECADD MACRO ADD AL,CL DAA ENDM 显而易见,这是一个无形式参数的宏定义。

  4. 如果对分别存放在任意8位寄存器或存储单元中的两个压缩型的BCD数进行加法运算,则可将上例宏定义改写为如果对分别存放在任意8位寄存器或存储单元中的两个压缩型的BCD数进行加法运算,则可将上例宏定义改写为 DECADD1 MACRO OPR1,OPR2 MOV AL,OPR1 ADD AL,OPR2 DAA MOV OPR1,AL ENDM 这是一个带有两个形式参数的宏定义。宏指令为DECADD1。例如有以下宏调用:

  5. DECADD1 DL, BUFFER DECADD1 AREA1, AREA2 则汇编时进行宏展开,得到以下指令: DECADD1 DL, BUFFER + MOV AL, DL + ADD AL, BUFFER + DAA + MOV DL, AL DECADD1 AREA1, AREA2 + MOV AL, AREA1 + ADD AL, AREA2 + DAA + MOV AREA1, AL 宏扩展后,原来宏体中的指令前面都加上了符号“+”,以示区别。

  6. 宏指令与子程序的区别 在汇编语言程序设计中,宏指令和子程序都给设计者提供了很大方便。他们都是可悲程序多次调用的程序段,并且调用前必须由设计者袭击根据需要按一定格式进行定义。然而,宏指令和子程序由于定义方法和几个是不同,使用中患有许多不同之处,主要是空间和时间的差异。 ⑴ 子程序由CALL指令调用,由RET指令返回,所以汇编后子程序的机器码只占有一个程序段,不管调用多少次均如此,较为节约内存。宏指令在每次宏调用处宏展开时,宏体都要占一个程序段,调用次数愈多,占用内存愈多。因此从内存空间开销来说,子程序优于宏指令。

  7. 从程序的执行时间来分析,每调用一次子程序都要保护和恢复返回地址(断点)及寄存器内容(现场)等,要消耗较多的时间。宏指令调用时不需要这个过程,执行时间较短。因此,从执行时间来分析,宏指令又优于子程序。 综上所述,当某一需多次访问的程序段较长,访问次数又不是太多时,选用子程序结构较好。当某一需多次访问的程序段较段,访问次数又很频繁时,选用宏指令结构显然要更好些。

  8. 编辑程序 编辑 汇编程序 汇编 连接程序 连接 5.5 汇编语言程序上机过程 要想在计算机上 运行汇编语言程序,必须首先对源程序进行汇编和连接。下图表示了对汇编语言源程序的编辑、汇编和连接的过程。 手写程序 .ASM文件 .OBJ文件 .EXE文件 EDIT MASM LINK 汇编语言程序上机过程

  9. 5.5.1 用编辑程序建立汇编语言源程序文件 建立一个汇编语言源程序,可以使用Windows系统下的记事本程序来编写,也可以使用DOS操作系统下的EDIT程序来编写。 例如从键盘输入二个数存入内存以DATA开始的二个单元中,然后选出其中的大数输出。 设编辑后的汇编语言源程序名为:exp1.asm

  10. 5.5.2 用汇编程序将.ASM文件汇编成目标程序文件.OBJ 在对汇编语言源程序文件(简称ASM文件)汇编时,汇编程序将对ASM文件进行二遍扫描。若程序文件中有语法错误,则在结束汇编后将指出源程序中的错误语句及错误类型。否则将在汇编后生成目标程序文件(即OBJ文件) 完成汇编功能的是小汇编程序ASM或宏汇编程序MASM。 汇编过程如下表所示:

  11. 提 示 信 息 回 答 Source filename[.ASM]: (源文件名) 欲汇编的.ASM源文件名(缺省:命令中的文件名) Object filename[Source.OBJ]: (目标文件名) 可重新定位目标文件名(缺省:源文件名.OBJ) Source listing[NUL.LST]: (源列表文件名) 列表文件名(缺省:无列表文件) Cross reference[NUL.CRF]: (交叉参考文件名) 交叉参考文件用的文件名(缺省:无交叉参考文件) MASM宏汇编的提示信息及回答

  12. 5.2.3 用连接程序生成可执行程序文件(EXE 文件) 经汇编后产生的目标程序文件(OBJ文件)并不是可执行程序文件,必须经连接后才能成为可执行文件(EXE文件)。连接程序并不是专门为汇编语言程序设计的,如果一个程序是由若干个模块组成的,也可以通过连接程序把它们连接在一起。这些模块可以是汇编程序产生的目标程序文件,也可以是高级语言编译程序产生的目标程序文件。 完成连接功能的程序是LINK程序。连接过程如下表所示:

  13. 提 示 信 息 回 答 Oject Modules[.OBJ] (目标模块) 目标代码模块表(各模块之间用+号隔开) Run File [object.EXE] (运行文件) 连接后生成的执行文件名(缺省:目标文件名) List File [NUL.MAP] (列表文件) 列表文件名(缺省:无文件名) Libraries [.LIB] (库文件) 库文件名表(各文件之间用+号隔开) LINK程序的提示信息及回答

  14. 5.5.5 汇编语言和操作系统PC-DOS的接口 当我们编写的汇编语言源程序是在PC-DOS环境下运行时,必须了解汇编语言是如何同操作系统接口的。 当通过键盘键入的源程序经汇编和连接生成可执行的程序文件并欲执行该程序时,PC-DOS将按如下步骤操作: ⑴ 为该程序建立一个长度为256字节的程序前缀区PSP,以便存放所要执行程序的有关信息,并为程序和PC-DOS间提供一个接口。

  15. 程序和PC-DOS之间的接口是通过INT 20H软中断指令来实现的。该指令的两字节操作码存放在PSP的第0号及第1号单元内,其中断服务程序由PC-DOS提供。因此,用户在组织程序时必须是程序执行完后能去执行存放于PSP开始的INT 20H指令,这样便返回DOS管理的状态下,否则就无法继续键入、调试和执行其它程序。 ⑵ 把要执行的程序从磁盘上装入到内存中并为其定位。在微程序定位时,内存分配见下图。

  16. 1M地址空间 中断向量表 中断向量表 紧接在PSP之后的内存区域中依次存放代码段、数据段和堆栈段。 IBM BIOS IBM BIOS IBM DOS IBM DOS DOS 常驻部分 DOS 常驻部分 系统 RAM DS ES PSP CS IP 用户可 用空间 代码段 DS 数据段 SS 堆栈段 DOS 暂驻部分 SP DOS 暂驻部分 ROM BASIC ROM BASIC FFFF0H ROM BIOS ROM BIOS

  17. 设置段寄存器的值,使DS和ES指向PSP的段基址,即INT 20H的存放地址,同时将CS设置为PSP后面代码段的段基址,IP设置为指向代码段中第一条要执行的指令位置,把SS设置为指向堆栈段的段基址,让SP指向堆栈段的段底。 ⑷ 开始执行程序。 为了保证用户程序执行完后能回到DOS,可使用如下两种方法: ① 标准方法

  18. 首先将用户程序的主程序定义成一个FAR过程,其最后一条指令为RET。然后在代码段的主程序的开始部分用如下三条指令将PSP中INT 20H指令的段基址及偏移地址压入堆栈: PUSH DS MOV AX, 0 PUSH AX 这样,当程序执行到主程序的最后一条指令RET是,由于该过程具有FAR属性,故存在对战内的两个字就分别谈出到CS和IP中,INT 20H指令得以执行,保证了控制返回DOS状态。

  19. ② 非标准方法 也可在用户的程序中不定义过程段,只在代码段结束之前,增加两条指令: MOV AH, 4CH INT 21H 则程序执行完后也会自动返回DOS状态。 此外,由于开始执行用户程序时,DS和ES并未指向用户的数据段基址和附加段基址,故在程序的开始处应重新装填DS和ES的值。

  20. DATA SEGMENT … DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA, ES:DATA START: MOV AX, DATA MOV DS, AX MOV ES, AX … MOV AH, 4CH INT 21H CODE ENDS END START

  21. DATA SEGMENT … DATA ENDS CODE SEGMENT MAIN FROC FAR ASSUME CS:CODE, DS:DATA, ES:DATA START: PUSH DS XOR AX, AX PUSH AX MOV AX, DATA MOV DS, AX MOV ES, AX … RET MAIN ENDP CODE ENDS END START

More Related