- 1、本文档共78页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第8章 汇编语言高级编程技术 8.1 宏 8.2 汇编高级语法 8.3 模块化程序设计 8.4 C和汇编的混合编程 8.5 程序优化 8.1 宏 8.1.1 宏指令的定义和使用 宏指令的使用有3个步骤: 宏定义 宏调用 宏扩展 宏定义 格式: 宏指令名 MACRO [形式参数表] … ;宏指令体 ENDM 形式参数表给出形参,形参之间用逗号隔开。 宏调用和宏扩展 宏调用的格式 : 宏指令名 [实参数表] 实参应和形参顺序一致 宏扩展 : 用宏指令体的语句序列替换宏指令名 并用实参替换形参 2.LOCAL伪操作 程序中多次调用宏指令,展开时其中的标 号重复,导致编译出错。 解决办法 :将宏定义体中的标号说明为局 部标号 格式:local 标号1[,标号2, 标号3, …] 3.PURGE伪指令 PURGE伪指令取消已定义的宏指令 格式为: PURGE 宏指令名 [, 宏指令名, …] 注意: 宏指令被取消的程序就不能再使用这个宏指令 指令取消之前的宏调用已经被展开,不受影响 8.1.2 宏指令中参数的使用 1.MOVE宏指令 MOV指令不允许源操作数和目标操作数同时为内存操作数,我们如此定义: dwVarA DWORD ? dwVarB DWORD 50 ?MOVE MACRO X, Y PUSH Y POP X ENDM 调用MOVE dwVarA,dwVarB,可将后者内容赋给前者 2.SUBX宏指令 SUB指令执行后,目标操作数中的被减数被“差” 替换掉。我们可以定义一个新的宏指令,它包括 3个参数:被减数(minuend)、减数 (subtrahend)、差(difference)。 SUBX MACRO minuend, subtrahend, difference PUSH EAX MOV EAX, minuend SUB EAX, subtrahend MOV difference, EAX SUBX宏指令(续) ;接上页程序 POP EAX ENDM 要计算ECX=EDX–8,就调用SUBX宏: SUBX EDX, 8, ECX 3.Idx宏指令 对给定的数组下标i, j,元素的地址为: 数组首地址 + (i * RowSize + j) * ElementSize RowSize表示为数组每行的大小 ElementSize表示为每个元素的大小 横线部分可以用宏指令表示: Idx MACRO I, J, RowSize IMUL EBX,I, RowSize ADD EBX, J Idx宏指令(续) ;接上页程序 ADD EBX, EBX SHL EBX, 2 ENDM 调用上述Idx宏指令就可求得数组元素的位置 8.1.3 特殊的宏操作符 1.操作符 宏定义体中将放在形参前面 宏扩展时把后面的形参和前面的符号合并成一个符号 通过把前后两个符号合并成一个变量名: DefData MACRO Name, Value byteName BYTE Value ENDM 调用宏: DefData Temp, 0 DefData 1, -5 展开宏,形成以下语句: 1 byteTemp BYTE 0 1 byte1 BYTE -5 用连接的符号还可以形成一条指令 2.文本原样传递操作符 把实参原封不动地传递到定义体中去替换形参 可以保证实参的完整性 用DefData定义一个5字节的数组Array5: DefData Array5, -2, -1, 0, 1, 2 3.表达式操作符% 用%可以取得符号常量的值 宏调用时,%操作符后面的表达式立即求值 后作为实参 4.字符原意操作符! 在宏的定义和调用时,“ ! %”这些字符有其特殊的用途。 如果要使用原意,就在字符前加!。 !字符后面跟的一个字符被原样传送。 !字符类似于C语言字符串中的转义字符\ 宏调用DefStr Boo
文档评论(0)