- 1、本文档共39页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
课次14_第5章_ASM_Step课件
第 5 章 作业;5.4 宏指令语句;例 4.11 (Page 125); 宏调用的格式为:
宏指令名 [实际参数]
这就是说,只要在源程序中写上已定义过的宏指令名就算是调用该宏指令了。
具有宏调用的源程序被汇编时,每个宏调用将被MASM进行宏展开。宏展开实际上是用宏定义式设计的宏体去代替相应的宏指令,并用实际参数一一取代形参。;使用 “宏” 的过程共有三步:① 进行宏定义; ② 进行宏调用; ③ 汇编时由 MASM 进行宏展开。
[例] 若源程序中多处需要将 AL 和 CL 寄存器中的两位压缩型的 BCD 数相加,并将和送回 BL 寄存器,则可象下述这样定义宏指令,然后在需要的地方进行调用。
DECADD MACRO ;宏定义
ADD AL,CL
DAA
ENDM ;宏定义结束
显而易见,这是一个无形式参数的宏定义。;如果对分别存放在任意8位寄存器或存储单元中的两个压缩型的BCD数进行加法运算,则可将上例宏定义改写为:
DECADD1 MACRO OPR1,OPR2 ;带有形参宏定义
MOV AL , OPR1
ADD AL , OPR2
DAA
MOV OPR1 , AL
ENDM ;宏定义结束
这是一个带有两个形式参数的宏定义。宏指令为DECADD1。例如有以下宏调用:
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
宏扩展后,宏体中的指令前都加上了符号“+”,以示区别。;宏指令与子程序的区别
宏指令和子程序都是由设计者根据需要按一定格式进行定义, 并在程序中可多次调用的独立功能程序段。
宏指令(MACROENDM)和子程序(PROC ENDP) 定义方法不同。
调用方式、汇编程序处理方式不同。
⑴ 子程序由CALL指令调用,由RET指令返回,汇编后子程序的机器码只有一个片段,节约内存。宏指令在每次宏调用处宏展开时,宏体都形成一个片段,占用内存多。
⑵ 子程序调用时,都要保护和恢复返回地址(断点)及寄存器内容(现场)等,宏指令调用时不需要。;5.5 汇编语言程序上机过程;5.5.1 用编辑程序建立汇编语言源程序文件(.ASM);5.5.2 将.ASM文件汇编成 .OBJ(目标程序文件);MASM 宏汇编的提示信息及回答;5.5.3 生成可执行程序文件(.EXE 文件);LINK 程序的提示信息及回答;5.5.5 汇编语言和DOS操作系统的接口; 可执行程序和 DOS 之间的接口通过 INT 20H 软 中断指令来实现。
在 PSP 区的前几个单元中即存放了INT 20H 指 令操作码。用户在组织程序时,使程序运行 完后,能去执行存放于PSP区开始位置的 INT 20H 指令,方可返回DOS 管理的状态。
⑵ 把要执行的程序从磁盘上装入到内存中并为其 定位。在程序定位时,内存分配见下图。;中断向量表;程序段前缀区(PSP)结构说明:;⑶ 设置段寄存器的值;(DOS系统初始化执行现场)
①使DS和ES指向PSP的段基址,即INT 20H的存放地址;
②将CS设置为PSP后面代码段的段基址,IP设置为指向代码段中第一条要执行的指令位置;
③把SS设置为指向堆栈段的段基址,让SP指向堆栈段的栈底。
⑷ 开始执行程序。;DOS 环境下执行程序的过程:;☆ 用户程序执行完后返回 DOS 的两种方法:
① 标准方法 (INT 20H)
A、将用户程序的主程序定义成一个FAR过程,用户在汇 编程序中用 RET 指令返回 DOS。
B、在代码段的主程序的开始部分用如下三条指令将PSP中 INT 20H 指令的段基址及偏移地址压入堆栈:
PUSH DS
MOV AX, 0
PUSH AX
这样,当程序执行到指令 RET 时,INT 20H 指令得以 执行,保证了控制返回 DOS 状态。;② 非标准方法
不将用户的主程序定义为过程段,只在需要返回 DOS 处增加下两条指令:(完成返回 DOS 的操作)
MOV AH , 4CH
INT 21H
则程序执行
文档评论(0)