




已阅读5页,还剩45页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第七章高级宏汇编语言 宏指令重复汇编条件宏汇编 宏的引入 例如 经常需要显示单个字符movah 2movdl c int21h若使用过程实现 太短了开销过大若定义了OUTPUT宏 则使用OUTPUT c 好处 代码简洁清晰 减少重复代码 7 1宏的概念 宏使用过程 定义 调用和展开宏指的是具有命名的汇编语言语句的指令块 一次定义 可以被多次调用 在汇编器预处理的过程中 将各个宏展开拷贝到程序中 展开后的代码在汇编过程中处理 7 1 1宏定义 定义格式无参数和有参数 宏名MACRO 形参1 形参2 宏体ENDM 例1 INPUT宏 从键盘输入0 9数字 保存在AL中 例2 OUTPUT宏 从屏幕输出一个字符 displaymacrostringpushaxpushdxmovah 9movdx offsetstringint21hpopdxpopaxendmmsg1db beginoftest 0Dh 0Ah msg2db endoftest 0Dh 0Ah 调用displaymsg1displaymsg2 例3 显示字符串的宏 需要保存寄存器 7 1 2宏调用 7 1 3宏展开 当调用宏时 各个实参和形参要对应当宏展开时 各个形参以对应的实参替换当宏展开时 产生汇编语言的源代码宏定义本身不生成任何目标代码 宏指令语句 即宏调用 本身也不生成目标代码 它仅表示宏调用出现的位置举例 INPUTMACROMOVAH 01HINT21HANDAL 0FHENDMCHANGEMACROBYI BY2PUSHAXMOVAL BY1XCHGAL BY2 MOVBY1 ALPOPAXENDMDATASEGMENTDA BY1DB10HDA BY2DB20HDATAENDSSTACKSEGMENTPARASTACKDW20HDUP 0 STACKENDS CODESEGMENTASSUMECS CODE DS DATA SS STACKSTARTPROCFARINPUT MOVAH 01H INT21H ANDAL 0FHCHANGEDA BY1 DA BY2 PUSHAX MOVAL DA BY1 XCHGAL DA BY2 MOVDA BY1 AL POPAX RETSTARTENDPCODEENDSENDSTART形式参数 哑元 可以是操作码或操作码的一部分 例如 宏定义 FOOMACROP1 P2 P3MOVAX P1P2P3ENDM宏调用 FOOWORD VAR INC AX宏展开 MOVAX WORD VAR INCAX宏定义 LEAPMACROCOND LABJ CONDLABENDM宏调用 LEAPZ THERE LEAPNZ HERE 宏展开 JZTHERE JNZHERE 是一个操作符 它在宏定义中可以作为哑元的前缀 展开时可以把 前后两个符号合并而形成一个符号 这个符号可以是操作码 操作数或是一个字符串 我们在看一个例子 宏定义 MEGMACROLAB NUM XYZLAB NUMDB HELLOMR XYZ ENDM宏调用 MEGMSG 1 JACK宏展开 MSG1DB HELLOMR JACK 7 1 4 与 expression汇编程序把跟在 之后的表达式的值转换成当前基数下的数 在展开期间 用这个数来取代哑元 当一个实参包含空格 逗号等时 用包装起来作为整体传递替换 宏定义 MSGMACROCOUNT STRINGMSG COUNTDBSTRINGENDMERRMSGMACROTEXTCNTR CNTR 1MSG CNTR TEXTENDM宏调用 CNTR 0ERRMSG SYNTAXERROR ERRMSG INVALIDOPERAND 宏展开 2MSG1DB SYNTAXERROR 2MSG2DB INVALIDOPERAND 其中2表示它是第二层展开 两层展开如下 CNTR 0CNTR CNTR 11MSG CNTR SYNTAXERROR 2MSG1DB SYNTAXERROR 1CNTR CNTR 11MSG CNTR INVALIDOPERAND 2MSG2DB INVALIDOPERAND 在宏调用时 有时一个实参是由字符 空格或逗号组成 这是把带空格或逗号的实参用 括起来 例如 SHIFTMACROAR REG SHF NUM DESTMOVREG VARMOVCL NUMS SHFREG CLMOVDEST REGENDMDATASEGMENTDA BYTEDB12H DA WORDDW3400HCONTDB2 3DEST1DB10HDUP DATAENDS SHIFTDA BYTE AL HL CONT DESTI MOVAL DA BYTE MOVCL CONT SHLAL CL MOVDEST1 ALSHIFTDA WORD AX AR CONT 1 MOVAX DA WORD MOVCL CONT 1 SARAX CL MOVWORDPTRDEST1 2 AX 在上面的宏定义中有 符号 SHF是一个形参 宏调用的时候 形参SHF用HL和AR实参代替 宏汇编程序把S与实参直接连接起来 构成SHL和SAR指令助记符 7 1 5局部符号伪指令LOCAL 当宏定义中有变量名或标号 且它在同一源程序中多次被调用 那么宏汇编程序在宏展开时 将产生多个相同的变量名或标号 这不满足变量名和标号在同一程序中必须唯一的要求 为了避免宏展开时标识符的重复定义 可使用伪指令LOCAL LOCAL形式变量1 形式变量2 这样 宏展开时 自动生成 的符号 后四位依次是0000 0001 0002 例如 某程序实现 MULT3 MULT1 MULT2 MULTIPMACROMULT1 MULT2 MULT3LOCALLOP EXITOMOVDX MNLT1MOVCX MULT2XORAX AXJCXZEXITOLOP ADCAX DXLOOPLOPEXITO MOVMULT3 AXENDMDATASEGMENT DA1DW34H 78HDA2DW20H 10HDA3DW DATAENDSSTACK1SEGMENTPARASTACKDW20HDUP 0 STACK1ENDSCODESEGMENTASSUMECS CODE DS DATA SS STACK1BEGIN MOVAX DATAMOVDS AX MULTIPDA1 DA2 DA3 MOVDX DA1 MOVCX DA2 XORAX AX JCXZ 0001 0000 ADDAX DX LOOP 0000 0001 MOVDA3 AXMULPITDA1 2 DA2 2 DA3 2 MOVDX DA1 2 MOVCX DA2 2 XORAX AX JCXZ 0003 0002 ADDAX DX LOOP 0002 0003 MOVDA3 2 AXMOVAH 4CHINT21HCODEENDSENDBEGIN 7 1 6在宏定义内使用宏 宏定义中允许使用宏调用 其限制条件是 必须先定义后调用 例如 宏定义 DIFMACROX YMOVAX XSUBAX YENDMDIFSQRMACROOPR1 OPR2 RESULTPUSHDXPUSUAX DIFOPR1 OPR2IMULAXMOVRESULT AXPOPAXPOPDXENDM宏调用 DIFSORVAR1 VAR2 VAR3宏展开 1PUSHDX1PUSHAX2MOVAX VAR12SUBAX VAR21IMULAX1MOVVAR3 AX1POPAX1POPDX有例如 宏定义 INT21MACROFUNCTNMOVAH FUNCTNINT21HENDMDISPMACROCHARMOVDL CHARINT2102HENDM宏调用 DISP 宏展开 1MOVDL 2MOVAH 02H2INT21H有关列表伪操作请参考教材255页 同学们可以在实验中验证 7 1 7宏库 有时我们花费精力编写了一些好的 宏 能为较多的程序服务 不必在每个程序中去重新定义把一些常用的宏集中在相应的文件中 称为库文件 若干宏定义组成宏库 存放在扩展名为MAC的文件中 使用时 只需在开始处利用INCLUDE包含宏伪指令 INCLUDE文件名 比如MACRO LIB文件包括三个宏定义 MACRODEFINELIBINPUTMACROMOVAH 01HINT21HANDAL 0FHENDM OUTPUTMACROADDRMOVDX OFFSETADDRMOVAH 09HINT21HENDM MULTIPMACROMULT1 MULT2 MULT3LOCALLOP EXITOMOVDX MNLT1MOVCX MULT2XORAX AXJCXZEXITOLOP ADDAX DXLOOPLOPEXITO MOVMULT3 AXENDM 当某源程序需要使用MACRO MAC文件中已经定义的 宏 时 用伪指令INCLUDE打开文件 INCLUDE文件名例 INCLUDEMACRO MACSTACK1SEGMENTPARASTACKDW20HDUP 0 STACK1ENDSDATASEGMENTSTRING1DB INPUTCHAR STRING2DB0DH 0AH OUTPUTSTRING BUFDB10HDUP 24H DATAENDSCODESEGMENTASSUMECS CODE DS DATA SS STACK1START MOVAX DATAMOVDS AXOUTPUTSTRING1MOVDI OFFSETBUFMOVCX 10HLOP1 INPUTMOV DI ALINCDI LOOPLOP1OUTPUTSTRING2MOVAH 4CHINT21HCODEENDSENDSTART 7 1 8宏与子程序的异同 相同点相异点参考教材P248页 7 2重复汇编 REPT伪指令IRP伪指令IRPC伪指令 7 2 1定重复REPT伪指令 REPT伪指令重复执行指定次数的语句块语法 REPT表达式ENDM 表达式为无符号整数表达式 决定了重复的次数 例1 例1 M 0MUM 5REPT5M M 1DBMUM MENDM它们等效于DB5 0AH 0FH 14H 19H 例2 iVal 0REPT100iVal iVal 10DWiValENDM 以下的代码产生100个DW数据序列 10 20 30 例如 用重复汇编可以在81个连续字节单元中存放一个九九表的数值 N 0REPT9N N 1M 0REPT9M M 1DBM NENDMENDM 7 2 2不定重复IRP 重复的次数由实参的个数决定 每次循环时以相应的实参代替形参 IRP形参 ENDM 例 例1NUM 5IRPM DBNUM MENDM例2PUSHREGMACROIRPREG PUSHREGENDMENDM 7 2 3不定重复字符IRPC 重复的次数由字符串的字符个数决定 每次循环时以
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年事业单位笔试-云南-云南职业能力倾向测验(医疗招聘)历年参考题库典型考点含答案解析
- 2025年事业单位笔试-云南-云南医学技术(医疗招聘)历年参考题库典型考点含答案解析
- 2025年事业单位笔试-上海-上海公共基础知识(医疗招聘)历年参考题库典型考点含答案解析
- 2026届云南省怒江市化学高三第一学期期末联考模拟试题含解析
- 2026届北京市西城区市级名校化学高一上期中复习检测试题含解析
- 化妆培训课件模板
- 高中新生开学家长会课件
- 团队文化面试题目及答案
- 新解读《GB-T 36110-2018文物展柜密封性能及检测》
- 连云港苍梧小学数学试卷
- 安庆汇辰药业有限公司高端原料药、医药中间体建设项目环境影响报告书
- 关于术中知晓预防和脑功能监测专家共识
- 河道修防工高级工试题
- 女性生殖脏器
- 保障农民工工资支付协调机制和工资预防机制
- GB/T 9258.1-2000涂附磨具用磨料粒度分析第1部分:粒度组成
- GB/T 4458.3-2013机械制图轴测图
- GB/T 311.2-2013绝缘配合第2部分:使用导则
- GB/T 13912-2002金属覆盖层钢铁制件热浸镀锌层技术要求及试验方法
- GB/T 13890-2008天然石材术语
- 重症急性胰腺炎急性反应期液体复苏策略课件
评论
0/150
提交评论