安徽理工太骨计算机科学与技术系李兆 《汇编语言》第7章 71宏汇编 什么是宏? 宏(或宏指令)是源程序中一段有独立功能 的程序代码,只需定义一次,可以多次调用。 为什么使用宏汇编? 在编制汇编语言程序过程中,有些功能程序段需要 多次重复使用,所不同的只是参与操作的操作数。 为了减少编程的工作量,通常采用两种方法 ①将程序段编写为独立的子程序 ②将程序段定义成宏 大家想一下子程序有什么优缺点? ch7 2
安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》第7章 ch7 2 7.1 宏汇编 为什么使用宏汇编? 在编制汇编语言程序过程中,有些功能程序段需要 多次重复使用,所不同的只是参与操作的操作数。 为了减少编程的工作量,通常采用两种方法: ①将程序段编写为独立的子程序 ②将程序段定义成宏 大家想一下 子程序有什么优缺点? •什么是宏? 宏(或宏指令)是源程序中一段有独立功能 的程序代码,只需定义一次,可以多次调用。 第7章
安徽理工太骨计算机科学与技术系李兆 《汇编语言》第7章 711宏定义、宏调用和宏展开 1宏定义 用伪指令 MACROZENDM实现,其语句格式是: 宏指令名 MACRO[形参1,形参2,…,形参 宏定义体 ENDM ch7
安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》第7章 ch7 3 1.宏定义 用伪指令MACRO/ENDM实现,其语句格式是: 宏指令名 MACRO [形参1,形参2,…,形参n] ┇ 宏定义体 ENDM 7.1.1 宏定义、宏调用和宏展开
安徽理工太骨计算机科学与技术系李兆 《汇编语言》第7章 说明 宏指令名是该宏定义的名称。调用时使用宏指令名 对该宏定义进行调用。 宏指令符合标识符规定。宏指令名不能重复,并且 指令的第一个字符必须是字母。但可以和源程序中的 其他变量、标号、指令、伪指令名相同,在这种情况 下宏指令的优先级最高。 MACRO必须与ENDM成对出现。 MACRO标识宏 定义的开始。 形式参数(即形参,也称哑元、虚参)是可选项 宏可以不带参数;带参数时,多个形参间用逗号分隔
说明 • 宏指令名是该宏定义的名称。调用时使用宏指令名 对该宏定义进行调用。 • 宏指令符合标识符规定。宏指令名不能重复,并且 指令的第一个字符必须是字母。但可以和源程序中的 其他变量、标号、指令、伪指令名相同,在这种情况 下宏指令的优先级最高。 • MACRO必须与ENDM成对出现。MACRO标识宏 定义的开始 。 • 形式参数(即形参,也称哑元、虚参)是可选项, 宏可以不带参数;带参数时,多个形参间用逗号分隔。 安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》第7章
安徽理工太骨计算机科学与技术系李兆 《汇编语言》第7章 2宏调用 宏调用的格式为 宏指令名[实参1,实参2,…,实参n 说明:实参可以是常数、寄存器、存储单元、地 址表达式、指令的操作码或者是操作码的一部分。 3.宏展开 宏展开就是宏定义体取代源程序中的宏指 令名,而且用实元取代哑元。汇编源程序时, 宏汇编程序将对每条宏指令语句进行宏展开, 用实参替代相应的形参,对宏体目标代码作相 应改变
2.宏调用 宏调用的格式为: 宏指令名 [实参1,实参2,…,实参n] 3. 宏展开 宏展开就是宏定义体取代源程序中的宏指 令名,而且用实元取代哑元。汇编源程序时, 宏汇编程序将对每条宏指令语句进行宏展开, 用实参替代相应的形参,对宏体目标代码作相 应改变。 说明:实参可以是常数、寄存器、存储单元、地 址表达式、指令的操作码或者是操作码的一部分。 安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》第7章
安徽理工大骨计算机科学与技术系李兆 《汇编语言》第7章 子程序调用和宏调用的工作方式 主程序 主程序 主程序 展开 Q A B Call Q 子程序Q QCD Q QE,F Call Q RET Q MACRO X,Y Call Q ENDM
Call Q Call Q Call Q Q: RET 子程序Q Q A,B Q C,D Q E,F Q MACRO X,Y ENDM 主程序 主程序 主程序 展开 子程序调用和宏调用的工作方式 安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》第7章
安徽理工太骨计算机科学与技术系李兆 《汇编语言》第7章 用一个例子来说明宏定义、宏调用和宏展开的情况 例:将两个16位数相加,结果存入16位 RESULT单 元中。 对两数相加功能进行宏定义
用一个例子来说明宏定义、宏调用和宏展开的情况 例:将两个16位数相加,结果存入16位 RESULT 单 元中 。 ;对两数相加功能进行宏定义 安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》第7章
安徽理工太骨计算机科学与技术系李兆 《汇编语言》第7章 BCDADD MACRO VARX, VARY, RESULT MOV AL, VARX ADD AL, VARY MOV RESULT, AL MOV AL, VARX+1 ADC AL, VARY+1 MOV RESULT+1,AL, ENDM DATA SEGMENT A1 D1234H A2 D5678H A3 DWI B1 D1357H B2 D2468H B3 DW DATA ENDS CODE SEGMENT ASSUME CS: CODE, DS: DATA START: PUSH DS MOv AX, 0 PUSH AX
BCDADD MACRO VARX,VARY,RESULT MOV AL,VARX ADD AL,VARY MOV RESULT,AL MOV AL,VARX+1 ADC AL,VARY+1 MOV RESULT+1,AL ENDM DATA SEGMENT A1 DW 1234H A2 DW 5678H A3 DW ? B1 DW 1357H B2 DW 2468H B3 DW ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:PUSH DS MOV AX,0 PUSH AX 安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》第7章
安徽理工大学计算机科学与技术系李兆 《汇编语言》第7章 MOV A, A1 Mov A%, DATA 1 ADD AL, A2 Mov DS, AX BCDADD1,n2,A3;宏调 1 Mov A3, A 用 1 MOV AL, A1+1 BCDADD B1,B2,B3;再 1 ADC AL, A2+1 次宏调用 1 Mov A3+1, AT RET CODE ENDS 1 MOV AL, B1 1 ADD AL, B2 AND SART 1 Mov B3, AL 1 MOV AL, B1+1 1 ADC AL,B2+1 经宏展开后: 1 MOV B3+1, AT PUSH DS Mov A%, 0 PUSH AX Mov A, DATA 宏汇编程序在所展开的 Mov DS, AX 指令前标识以“1′号以 示区别。较早的版本用
MOV AX,DATA MOV DS,AX BCDADD A1,A2,A3;宏调 用 BCDADD B1,B2,B3 ;再 次宏调用 RET CODE ENDS END START 经宏展开后: PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX 1 MOV AL,A1 1 ADD AL,A2 1 MOV A3,AL 1 MOV AL,A1+1 1 ADC AL,A2+1 1 MOV A3+1,AL 1 MOV AL,B1 1 ADD AL,B2 1 MOV B3,AL 1 MOV AL,B1+1 1 ADC AL,B2+1 1 MOV B3+1,AL • 宏汇编程序在所展开的 指令前标识以‘1’号以 示区别。较早的版本用 ‘+’ 安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》第7章
安徽理工太骨计算机科学与技术系李兆 《汇编语言》第7章 712宏定义中的参数: 2参数可以是操作码 1宏定义可以无参数 a macro p1, p2, p3 moy ax,p savereg macro p2 p ush ax endim push bx 调用: push cK a word var nc.ax IS endm 展开: 1 mov ax, word var nc ax
7.1.2 宏定义中的参数: 1 宏定义可以无参数 savereg macro push ax push bx push cx push si endm 2 参数可以是操作码 a macro p1, p2,p3 mov ax,p1 p2 p3 endm 调用: a word_ var ,inc,ax 展开: 1 mov ax,word_var 1 inc ax 安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》第7章