第7章高级汇编语言技术 讲授要点 宏汇编 重复汇编 条件汇编 2021/2/19 80x86汇编语言程序设计
2021/2/19 80x86汇编语言程序设计 第7章 高级汇编语言技术 讲授要点 ▪ 宏汇编 ▪重复汇编 ▪条件汇编
7.1宏汇编 7.1.1宏定义、宏调用与宏展开 1.宏定义 宏指令名 MACRO[形式参数表 ;宏体 ENDM 2.宏调用 宏指令名[实参数表] 3.宏展开 当源程序被汇编时,MASM用相应的宏体取代每个宏调用,并用实 参数按位置替换宏定义中的形式参数。 2021/2/19 80x86汇编语言程序设计
2021/2/19 80x86汇编语言程序设计 7.1 宏汇编 7.1.1 宏定义、宏调用与宏展开 1. 宏定义 宏指令名 MACRO [形式参数表] ... ; 宏体 ENDM 2. 宏调用 宏指令名 [实参数表] 3. 宏展开 当源程序被汇编时,MASM用相应的宏体取代每个宏调用,并用实 参数按位置替换宏定义中的形式参数
4.说明 在参数的类型与顺序应与宏定义时的形式参数一致。 宏展开时,若实参数的个数多于形式参数,则忽略多余的实在 参数;若实参数的个数少于形式参数,则多余的形式参数为空。 宏定义只是告诉MASM用一个名字来表示一段语句序列,其 本身不被汇编。 宏指令的参数非常灵活,可以出现在指令的操作数或操作码部 分,MASM在宏展开时对参数进行文本替换。 宏定义可以写在程序的任何地方,但习惯上总是把宏定义写 在程序的最前面。 2021/2/19 80x86汇编语言程序设计
2021/2/19 80x86汇编语言程序设计 4. 说明 ▪在参数的类型与顺序应与宏定义时的形式参数一致。 ▪ 宏展开时,若实参数的个数多于形式参数,则忽略多余的实在 参数;若实参数的个数少于形式参数,则多余的形式参数为空。 ▪ 宏定义只是告诉MASM用一个名字来表示一段语句序列,其 本身不被汇编。 ▪ 宏指令的参数非常灵活,可以出现在指令的操作数或操作码部 分,MASM在宏展开时对参数进行文本替换。 ▪ 宏定义可以写在程序的任何地方,但习惯上总是把宏定义写 在程序的最前面
【例】参照汇编程序的处理方法,对下面程序中的宏 进行展开 back 4CH dosint EQU 21H disch MACro MOV AH.2 MOV DL. 1 INT 21H ENDM 2021/2/19 80x86汇编语言程序设计
2021/2/19 80x86汇编语言程序设计 【例】参照汇编程序的处理方法,对下面程序中的宏 进行展开。 back = 4CH dosint EQU 21H dispch MACRO MOV AH,2 MOV DL, '* ' INT 21H ENDM
code SEgMENt ASSUME CS: code main: disch disch MOV ah, back dosing code ENDs END main 2021/2/19 80x86汇编语言程序设计
2021/2/19 80x86汇编语言程序设计 code SEGMENT ASSUME CS:code main: dispch dispch MOV AH,back INT dosint code ENDS END main
解】宏展开后的结果是: T MOV AH 2 MOV DL, 21H T MOV AH, 2 MOV DL T INT 21H MOV ah, 4CH 21H 2021/2/19 80x86汇编语言程序设计
2021/2/19 80x86汇编语言程序设计 【解】宏展开后的结果是: + MOV AH,2 + MOV DL, '*' + INT 21H + MOV AH,2 + MOV DL, '*' + INT 21H MOV AH,4CH INT 21H
7.1.2与宏有关的伪指令 1.L0CAL伪指令用来指定宏内局部符号 LOCAL符号名, 符号名 作用:在宏展开时,MASM将源文件中的所有局部符号统一按出现次序 替换为唯一的标识符(?000?FFFF),以避免符号的重复定义。 2. EXITM伪指令 用来立即终止宏展开,通常与条件汇编结合使用。MASM忽略 EXITM 与ENDM之间的所有语句。 2021/2/19 80x86汇编语言程序设计
2021/2/19 80x86汇编语言程序设计 7.1.2 与宏有关的伪指令 1. LOCAL伪指令—用来指定宏内局部符号 LOCAL符号名,...,符号名 作用:在宏展开时,MASM将源文件中的所有局部符号统一按出现次序 替换为唯一的标识符(??0000 ~ ??FFFF),以避免符号的重复定义。 2. EXITM 伪指令 用来立即终止宏展开,通常与条件汇编结合使用。MASM忽略EXITM 与ENDM之间的所有语句
【例7:161设有如下宏定义 sum macro ab LOCAL next MOV CX.a LEA BX.b XOR AXAX next: ADD AX,BX ADD BX. 2 LOOP next ENDM 并已知buf和bu是已定义的两个变量,展开下面的宏调用 sum 5.buff sum 7.buf2 2021/2/19 80x86汇编语言程序设计
2021/2/19 80x86汇编语言程序设计 【例7.16】设有如下宏定义: sum MACRO a,b LOCAL next MOV CX,a LEA BX,b XOR AX,AX next:ADD AX,[BX] ADD BX,2 LOOP next ENDM 并已知buf1和buf2是已定义的两个变量,展开下面的宏调用: sum 5,buf1 sum 7,buf2
解】宏展开结果是 MOV CX. Lea BX buf1 T XOR AXAX t??0000: ADD AX,IBXI ++ ADD BX.2 LOOP?:0000 MOV CX. 7 ++ LEA BX.buf2 XOR AXAX t??0001: ADD AX,IBXI ADD BX. 2 DOOP?20001 2021/2/19 80x86汇编语言程序设计
2021/2/19 80x86汇编语言程序设计 【解】宏展开结果是: + MOV CX,5 + LEA BX,buf1 + XOR AX,AX + ??0000:ADD AX,[BX] + ADD BX,2 + LOOP ??0000 + MOV CX,7 + LEA BX,buf2 + XOR AX,AX + ??0001:ADD AX,[BX] + ADD BX,2 + LOOP ??0001
7.1.3宏操作符 在宏调用时,当实参数包含空格或逗号等间隔符时,必须使用""作为参数的定界符。 2.& 在宏定义时,当形式参数作为标识符或字符串的一部分时,必须使用 &作为分隔符。 当宏调用时,若在实参数中使用%,则MASM将%后常数表达式的值 作为参数,而非表达式本身 2021/2/19 80x86汇编语言程序设计
2021/2/19 80x86汇编语言程序设计 7.1.3 宏操作符 1. 在宏调用时,当实参数包含空格或逗号等间隔符时,必须使用""作为参数的定界符。 2. & 在宏定义时,当形式参数作为标识符或字符串的一部分时,必须使用 &作为分隔符。 3. % 当宏调用时,若在实参数中使用%,则MASM将%后常数表达式的值 作为参数,而非表达式本身