汇编与宏指令
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第九章
ARG1 ARG2
条件汇编与宏指令
9.1 条件汇编伪操作
条件汇编举例:
EQU 35H = NOT ARG1 IF (ARG1 OR ARG2) EQU 0FFFFH MOV AX,ARG1 MOV BX,ARG2 ADD AX,BX IF (ARG1 AND ARG2) EQU 0FFFFH SUB AX,CX IFE ARG1 ADD AX,DX ENDIF MOV [SI],AX ENDIF MOV [DI],AX ENDIF
SHIFT 1 1 AX, 4, ROL MOV CL, 4 ROL AX, 4
0005 B1 04 0007 C0
宏中的标号处理 将标号定义为形参 在宏定义中声明标号为局部标号
将标号定义为形参 例:定义一个宏,求一个数的绝对值 宏的定义 ABSB MACRO LABEL, DEST CMP DEST, 0 JGE LABEL NEG DEST ;DEST<-- 0-DEST LABEL: NOP ENDM 宏的调用 ABSB OK1,DATA1 ABSB OK2, DATA2
讨论、交流是弄清 问题、深入学习的 好方法。
宏展开之后: MOVBL 1 1 1 1 1 MOVBL 1 1 1 1 1 SRC1, DEST1, 100, B MOV SI, OFFSET DEST1 MOV DI, OFFSET SRC1 CLD MOV CX, 100 REP MOVSB SRC2, DEST2, 100, W MOV SI, OFFSET DEST2 MOV DI, OFFSET SRC2 CLD MOV CX, 100 REP MOVSW
0005 80 3E 0000 R 00 000A 7D 04 1 000C F6 1E 0000 R 0010 90
0011 80 3E 0001 R 00 0016 7D 04 1 0018 F6 1E 0001 R 001C 90
1
1 1 1
1 1
观察运行结果,第一次宏展开时使用??0000代替了 LABEL,第二次宏展开时使用??0001代替了LABEL。
宏定义的一般格式如下: MNAME MACRO [形参1][,形参2]...... : : 宏体 : ENDM 其中,MNAME是宏指令(宏名字),MACRO是宏定义伪 操作命令,ENDM是宏结束伪操作命令。MARCO和 ENDM之间使用一组汇编语言语句,称为宏体。方括号中 的是形参,可选项,不需要时可以省略,多个形参之间用 逗号隔开,在宏展开时形参会被实参代替。
第九章 条件汇编与宏指令
9.1 条件汇编伪操作 9.2 宏伪操作
第九章 条件汇编与宏指令
9.1 条件汇编伪操作
9.1 条件汇编伪操作
条件汇编伪操作和宏伪操作也是为指令操作的一部分,具有条件宏伪操作功 能的汇编程序成为宏伪汇编程序。 条件汇编伪操作允许用户在编写的汇编语言程序中规定某种条件,汇编程序 在汇编的过程中,对条件进行测试,如果测试条件成立,则将对应的条件块汇 编为目标程序,否则,不进行汇编。 条件汇编伪操作格式: IFx [condition] : 若干语句(称为条件块) : [ELSE](可选) : 若干语句(称为条件块) : ENDIF 说明:IFx是条件汇编伪操作。其中x可以是1,2,E,DEF,B,NB, IDN和DIF。 condition是条件表达式。 ELSE是选择项。 ENDIF是条件汇编结束命令。
9.1 条件汇编伪操作 上述程序有3个条件汇编块,即设置了3个条件伪操作,只有第一 个条件为真,所以只将它所包含的条件块汇编为目标代码。 汇编结果:
=0035 =FFCA 002D B8 0035 0030 8B FFCA 0033 03 C3 0035 89 05 ARG1 EQU 35H ARG2 = NOT ARG1 IF (ARG1 OR ARG2) EQU 0FFFFH MOV MOV AX,ARG1 BX,ARG2
% 表达式操作符 宏调用如下: DEFSTR 34+2 DEFSTR %34+2 宏展开之后: 0005 33 34 2B 32 0009 33 36 DEFSTR 1 DB DEFSTR 1 DB 34+2 '34+2' %34+2 '36'
宏与子程序的区别
宏 处理者 宏汇编程序 子程序用 CPU程序运行时
SHLR 0008 B1 05 1 000A D3 E0 1
AX, 5
MOV SHL CL, 5 AX, CL
指令 参数可以是某条指令。如定义一个宏,将一个数据移动n位。 宏的定义如下: SHIFT MACRO DEST, n, CMD MOV CL, n CMD DEST, N ENDM 宏调用如下: SHIFT AX, 4, ROL;用ROL指令替代形参CMD 宏展开之后:
0005 BE 0001 R 0008 BF 0000 R 000B FC 000C B9 0064 000F F3/ A4
0011 0014 0017 0018 001B BE 0003 R BF 0002 R FC B9 0064 F3/ A5
% 表达式操作符 “%”的作用是告诉汇编程序将“%”后面的表达式的 值作为实参,而不是将表达式本身作为实参。 例如,定义一个宏,实现字符串的定义 宏定义如下: DEFSTR MACRO STRING DB '&STRING&' ENDM
宏的展开 ABSB 0005 80 3E 0000 R 00 000A 7D 04 000C F6 1E 0000 R 0010 90 ABSB 0011 80 3E 0001 R 00 0016 7D 04 0018 F6 1E 0001 R 001C 90 OK1,DATA1 1 CMP DATA1, 0 1 JGE OK1 1 NEG DATA1 1 OK1: NOP OK2, DATA2 1 CMP DATA2, 0 1 JGE OK2 1 NEG DATA2 1 OK2: NOP
第九章
条件汇编与宏指令
条件成立
ADD AX,BX ENDIF MOV [DI],AX ENDIF
第九章 条件汇编与宏指令
9.1 条件汇编伪操作 9.2 宏伪操作
第九章
条件汇编与宏指令
9.2 宏伪操作
9.2 宏伪操作
在程序设计中,对于多次重复使用的程序段,我 们可以采用子程序的办法。今天我们再介绍一种 办法,即采用宏指令的办法。 这种方法是:用宏伪操作将多次重复使用的程序 段定义为一个独立的程序段,并赋一个名字,称 为宏名字,每当使用这种功能时,就在该处写上 这个宏名字,称为宏调用。宏汇编程序对程序汇 编时,遇到宏名字就用其所代表的程序段复制到 该处,称为宏扩展。使用宏名字就如同使用指令 一样,所以也称宏名字为宏指令。
要求使用定义局部标号的方法重新实现上例的操作。 宏定义如下: ABSB MACRO DEST LOCAL LABEL ;定义局部标号 CMP DEST, 0 JGE LABEL NEG DEST LABEL: NOP ENDM 宏调用语句如下: ABSB DATA1 ABSB DATA2
宏展开之后: DATA1 CMP DATA1, 0 JGE ??0000 NEG DATA1 ??0000: NOP ABSB DATA2 CMP DATA2, 0 JGE ??0001 NEG DATA2 ??0001: NOP ABSB
9.2 宏伪操作
BLMOV宏的调用
ADR3,ADR4,20
宏扩展
MAIN1:…… BLMOV ADR1,ADR2,CNT1 1 LEA SI,ADR1 1 LEA DI,ADR2 1 MOV CX,CNT1 1 CLD 1 REP MOVSB …… BLMOV ADR3,ADR4,20 1 LEA SI,ADR3 1 LEA DI,ADR4 1 MOV CX,20 1 CLD 1 REP MOVSB
宏汇编操作符 & 合并操作符 % 表达式操作符
& 合并操作符 在宏展开时,汇编程序将“&”左边的或者右边的形 参用实参代替,然后将位于它两边的字符合并成一个 符号。合并后的符号应该是一个合法的指令操作符、 操作数或者字符串等。 例如,将位于存储单元某处的一块数据移动到另一块 空间中,而且数据既可以是字节数据,也可以是字数 据。
在宏定义中,使用局部标号伪指令LOCAL定义局部 标号,格式为: LOCAL 标号1[,标号2] ……
LOCAL只允许在宏定义中出现,而且是MACRO伪 指令后的第一条语句。如果要声明多个标号,标号之 间用逗号隔开。当宏展开时,汇编程序将为每一百度文库局 部标号顺序产生一个唯一的标号(从“??0000”~“?? FFFF” )。
宏定义:
MOVBL MACRO MOV MOV MOV CLD REP SRC, DEST, LEN SI, OFFSET SRC DI, OFFSET DEST CX, LEN MOVSB
ENDM
第九章
宏调用
MAIN1: : BLMOV : BLMOV :
条件汇编与宏指令
ADR1,ADR2,CNT1
建设优良学风——
从我做起
知识回顾:
♣ 子程序的引出 ♣ 过程定义伪指令 ♣ 过程(子程序)调用、返回指令 ♣ 保护现场、恢复现场 ♣ 子程序说明文件 ♣ 参数传送方法 – 约定寄存器法 – 约定存储单元法 – 堆栈法 – 传送参数指针 ♣ 子程序设计
第九章 条件汇编与宏指令
理论:1学时
实验:1学时
处理时间
处理方法 运行速度 灵活性
编译过程中
用宏体语句替换宏 指令 较快 高
CALL指令
调用 较慢 低
实验15
编制程序在屏幕上显示字符串。已知字符串存 放在数据段STR开始的单元,以回车符结束。 要求:
显示字符串用宏实现 程序结束返回系统用宏实现
本章教学要求
了解条件汇编的作用和用法; 了解宏定义、宏调用和宏展开; 了解宏参数的初步用法。
宏定义如下: MOVBL MACRO DEST, SRC, LEN, TYPE MOV SI, OFFSET SRC;SRC是目的源起始地址 MOV DI, OFFSET DEST;DEST是目的起始地址 CLD MOV CX, LEN ;LEN是移动的长度 REP MOVS&TYP;TYPE是数据的类型(字或字 节) ENDM 宏调用如下: MOVBL SRC1, DEST1, 100, B ;字节数据移动 MOVBL SRC2, DEST2, 100, W ;字数据移动
……
BLMOV宏体
宏扩展标记
BLMOV宏体
参数类型 自定义符号或者数值(如上例) 寄存器 指令
寄存器
例如,将一个寄存器逻辑左移n位。 宏的定义: SHLR MACRO REG, n MOV CL, n SHL REG, CL ENDM 宏的调用语句是: SHLR AX, 5 ; 用实参AX替代形参REG 宏展开后的语句是: