1.程序模块
多模块程序结构
程序分段、子程序等实现了程序模块化
开发大型应用程序时常使用
▶多个源程序文件
▶目标代码模块等
组成完整的程序形成多模块程序结构
源文件包含
大型源程序可以合理地分放在若干个文本文件中
▶各种常量定义、声明语句等组织在包含文件(*.INC)
▶常用的或有价值的宏定义存放在宏定义文件(*.MAC)
▶常用的子程序形成汇编语言源文件(*.ASM)
▶任何文本文件
源文件包含的使用
被包含文件
▶文件名要符合操作系统规范
▶操作过程make32 eg0508
▶只能是文本文件
▶内容被插入源文件包含include语句所在的位置
实质仍然是一个源程序
▶只是分开在若干个文件中
▶只需针对主体源程序文件进行汇编、连接
模块连接
子程序单独编写一个源程序文件
▶使用共用伪指令PUBLIC和外部伪指令EXTERN
▶声明子程序在代码段,与主程序文件采用相同的存储模型
▶没有开始执行和结束执行点,但有汇编结束语句
▶处理好子程序与主程序之间的参数传递问题
子程序源文件汇编形成目标模块OBJ文件
连接时输入子程序目标模块文件名
模块连接的操作过程
▶子程序单独编写一个源程序文件
▶子程序源文件汇编形成目标模块OBJ文件
▶连接时输入子程序目标模块文件名
子程序库
子程序库是子程序模块的集合,便于统一管理子程序
编写存入库文件的子程序
▶遵循更加严格的子程序模块要求
▶应该遵循一致的规则(以免在使用时造成混乱)
子程序文件编写完成、汇编形成目标模块
利用库管理工具程序把子程序模块加入到子程序库
子程序库的使用
子程序单独编写一个源程序文件
子程序源文件汇编形成目标模块OBJ文件
利用库管理工具把子程序模块加入到子程序库
在连接主程序时提供子程序库文件名
库文件包含
要使用已存入库文件中的子程序
在主程序源文件中用库文件包含伪指INCLUDELIB声明
使用库文件包含伪指令INCLUDELIB
includelib 文件名
;使用库文件中的子程序
库文件包含的使用
将子程序源文件汇编、模块文件加入子程序库
ML lc lcoff eg0508es.asm
LIB32/OUT:eg0508.lib eg0508es.obj
源文件中用库文件包含伪指令INCLUDELIB声明
正常对主程序汇编、连接,无需在连接时输入库文件名
▶编写主程序、子程序更加独立
▶子程序使用更方便
操作过程
make32 eg0508e
2.宏汇编
宏汇编
宏(Macro)是具有宏名的一段汇编语句序列
宏需要先使用MACRO/ENDM伪指令进行定义
然后在程序中使用宏名(带参数)进行宏调用
源程序进行汇编时
▶宏名被汇编程序用宏定义的
▶代码序列替代,实现宏展开
这个过程就是“宏汇编”
▶宏定义
宏名 macro [形参表]
…. ;宏定义体endm
endm
宏汇编的特点
宏需要先定义后使用,且不必在任何段中
▶常书写于源程序开始位置
▶常用的宏定义可以单独写成一个宏定义文件
宏定义中更改了寄存器内容,最好进行保护和恢复
宏定义的参数灵活,宏定义允许嵌套和递归调用
宏调用不需要控制的转移与返回
▶宏调用将相应的语句序列复制到宏指令的位置
▶宏展开被嵌入源程序,成为一体
宏与子程序:简化程序
宏仅是源程序级的简化
▶宏调用在汇编时进行程序语句的展开,不需要返
▶回不减小目标程序,执行速度没有改变
子程序不仅简化源程序,还是目标程序级的简化
▶子程序调用在执行时由CALL指令转向、RET指令返回
▶形成的目标代码较短,执行速度减慢
宏与子程序:传递参数
宏通过形参、实参结合实现参数传递
▶使用软件方法,简洁直观、灵活多变
▶传递出错多体现为语法错误,易于发现
子程序利用寄存器、存储单元或堆栈等实现
▶运用硬件本身,规则严格、方法固定
▶传递出错常反映为逻辑或运行错误,较难排除
宏与子程序:选用原则
▶当程序段较短或要求较快执行时
选用宏
▶宏常依附于源程序,适合进行全局性预处理
▶当程序段较长或为减小目标代码时
选用子程序
▶子程序更具有独立性,可以分别编写