0软件——汇编语言程序设计_6.ppt
文本预览下载声明
汇编语言程序设计Assembly Language Programming 宏指令 宏:一段有独立功能的代码或者动作的组合 一次书写,多次调用 汇编程序汇编到该宏指令时,进行宏展开 C宏函数 #define MAX(a,b,c) {c = (ab)?a:b;} 宏定义 MacroName MACRO [形参表] …… (宏定义体) …… ENDM 参数可以是任意内容 形式参数表:可以有多个,用“,”分开 同样注意要保护和恢复现场 宏调用 MacronName [实参表] 实参表中的实参与形参表中的形参在位置上一一对应 若实参数形参数,则多余的实参无效; 若实参数形参数,则多余的形参作“空(NUL)”处理; 对宏指令必须先定义后调用。 宏定义通常放在源程序的开头。 宏展开 源程序被汇编时,汇编程序把宏调用展开,也就是把宏定义体复制到调用宏指令的位置上,同时用实参取代形参 展开后必须语法正确 标号问题? 与子程序差别 子程序只有一段目标代码 而宏指令完全展开、替换 宏指令更灵活,但不做错误检查 子程序: 优点:节省内存,可被多次调用。 缺点:额外开销(保存返回地址,计算转向地址,传递参 数等)大,增加了执行时间。适用于代码较长的情况。 宏调用: 优点:参数传送简单。 缺点:不节省空间,适用于子功能代码较短的情况。 An Example Another Example 宏伪指令 LOCAL——定义局部的变量,标号和符号 由LOCAL定义的标号由??0000~ FFFF替代(??字符开头) EXITM:宏结束,用于条件编译 宏操作符 ——定界符,参数包括空格、逗号 —— 字符连接功能,MSTR %——强迫后面表达式先计算 !——转移字符前缀(如、、等) ;;——宏注释 Notice 的正确使用 Notice 参数检查! 条件编译 条件汇编——不符条件,不会编译 格式: IFxx 表达式 语句序列1 [ ELSE 语句序列2 ] ENDIF Examples 多模块程序设计 多个模块:多个源文件 开发并行 容易维护 方式: 源文件包含 目标文件连接 问题 模块间组合 模块间通讯 源文件包含 INCLUDE common.asm 将定义或者申明放在一个源文件中,可重复利用。 采用插入相应文件的方式完成合并,所以被包含的文件不要有END语句。 INCLUDE common.inc 目标文件的连接 独立编译为obj文件 将目标文件连接成一个EXE文件 link module1.obj + module2.obj ml module1.asm module2.asm …. 完整段定义 段名 SEGMENT [对齐属性] [组合属性] [‘类别’] 段名 ENDS 段的对齐属性:用来指定段的起始地址 BYTE, WORD, DWORD, PARA, PAGE PARA—缺省,16字节 缺省属性可能会使段之间留有缝隙 完整段定义 段名 SEGMENT [对齐属性] [组合属性] [‘类别’] 段名 ENDS 段的类别属性:单引号之内,不同模块中类别属性相同的段放在相邻的位置 常用的有’code’, ‘data’, ‘stack’ 完整段定义 段名 SEGMENT [对齐属性] [组合属性] [‘类别’] 段名 ENDS 段的组合属性:用来控制不同模块中同名且类别相同的模块的组合方式。 PRIVATE : DEFAULT,不组合 PUBLIC:将所有模块中同名且类别相同的PUBLIC段连接成一个段。 STACK:将所有模块中同名且类别相同的STACK段连接成一个段。 模块之间的组合 一个模块中段名和属性相同的两个段按先后顺序进行合并 模块间同名且类型相同的PUBLIC(或STACK)段组合成一个段 组合规则: 对齐属性最好用PARA 数据段可以适当组合 堆栈段最好组合 代码段不宜组合,通过过程调用方式进行交互 Examples(188 7-18) Sseg :由模块1、3的Sseg组合而成,类别是stack Dseg :由模块1、3的Dseg组合而成 Dseg :模块2的私有段 三个独立的Cseg 模块之间的通讯 PUBLIC:本模块定义的,外模块想访问的变量,标号,过程,符号等。 PUBLIC 公共符号1,2,3…….. EXTRN/EXTERN: 本模块引用的,外模块中定义的变量,标号,过程,符号等。 EXTRN 外部符号1:属性1,外部符号2:属性2…… * * 第六章 宏与多模块程序设计 PRINTSTR MSG PRINTSTR MACRO STR PUSH DX PUSH AX
显示全部