- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第10页
汇编语言程序设计
第 13 章 高级宏汇编语言技术
2.宏调用 含义:用宏指令名来代替原来的程序段
不带参数 宏名
数字,符号 名等。
格 式
带参数
宏名 实参1,实参2,.....
第11页
汇编语言程序设计
第 13 章 高级宏汇编语言技术
3.宏展开
含义:宏汇编程序在汇编源程序时自动用宏指令的内容代替宏指令
多个符号之间用逗号间隔
第17页
汇编语言程序设计
【例】用连续相加的办法实 现无符号数乘法运算,编制宏定 义MULTIP MULTIP MACRO MULT1,MULT2,MULT3 LOCAL LOP,EXIT0 MOV DX,MULT1 ;乘数1 MULTIP DA1+2,DA2+2,DA3+4 MOV ;乘数2 + CX,MULT2 MOV DX,DA1+2 XOR + BX,BX MOV CX,DA2+2 XOR + AX,AX XOR BX,BX JCXZ EXIT0 + XOR AX,AX LOP:ADD + BX,DX JCXA ??0003 ADC AX,0 +??0002:ADD BX,DX LOOP LOP ADC AX,0 EXIT0:MOV MULT3,BX LOOP ??0002 MOV MULT3+2,AXDA3+4,BX +??0003:MOV ENDM + MOV DA3+6,AX
第16页
汇编语言程序设计
第 13 章 高级宏汇编语言技术
13.3.3 LOCAL伪指令
意义:在宏定义中使用变量名和标号,为了避免在宏展开时产生多个相 在宏定义中定义的变量名和标号,
同的变量名或标号。 格式: LOCAL <符号表> 注意:宏展开时,LOCAL伪指令指定的变量、标号自动生成格式为 “??ⅩⅩⅩⅩ” 的符号,其中后四位顺序使用0000~FFFF的十 六进制数字。
第14页
汇编语言程序设计
第 13 章 高级宏汇编语言技术
3.文本操作符<> 含义:把一个完整的实参括起来,作为一个单一的实参 。 【例】:EXCHANGE <BYTE PTR DA_WORD1>,<BYTE PTR DA_WORD2>,AL 宏展开时,替换的三条指令是: MOV AL,BYTE PTR DA_WORD1 XCHG AL,BYTE PTR DA_WORD2 MOV BYTE PTR WORD1,AL 注意:文本操作符还可以用来处理某些特殊字符:如“;”和 “&”。 【例】:<;>就表示一个分号“;”的实参,而不是注释 符。
汇编语言程序设计
第 13 章 高级宏汇编语言技术
第13章 高级宏汇编语言技术
13.1 结构
13.2 记录 13.3 宏汇编 13.4 重复汇编 11.5 条件汇编
第 1页
汇编语言程序设计
第 13 章 高级宏汇编语言技术
13.1 结构
MASM支持结构,其直接引用高级语言的结构数据概念。 13.1.1 结构的定义 结构名 STRUC 【例】 定义一个与时间有关的结构。 TIMERS STRUC YEAR_STR DB 'CURRENT DATE:','$' YEAR DW ? MONTH DB ? DAY DB ? TIME_STR DB 'CURRENT TIME:','$' HOUR DB ? MINUTE DB ? SEC DB ? TIMERS ENDS
第15页
汇编语言程序设计
第 13 章 高级宏汇编语言技术
4.字符操作符! 含义: “!” 后的字符不作特别的操作符使用,而是以字符本身的 意义进行处理。如: “!&” 表示 & 不作连接操作符用,只作符号 & 使 用。“!%” 表示 % 不作表达式操作符使用,只作百分号用。 【例】字符操作符!的使用: ;宏定义: PROMPT MACRO NUM ,TEXT PROMP&NUM DB '& TEXT &' ENDM 宏调用:PROMPT 23,<Expression !> 255> 宏展开:PROMP23 DB 'Expression >255' 5.宏注解符;; 含义:说明后面的文本是注解。
YEAR MONTH DAY HOUR MINUTE DW ? DB ? DB ? DB ? DB ?
TIME_STR DB 'The current time is ','$'
SEC
DB ?
TIMERS ENDS
第 4页
汇编语言程序设计
第 13 章 高级宏汇编语言技术
INCLUDE USER.MAC DISP_T MACRO X DISP_CHAR ':' MOV AL,X MOV AH,0 MOV BX,10 CALL NUM_DEC ENDM DATA SEGMENT TIMES TIMERS <> DATA ENDS ;以十进制输出字节内容
;输出年份
;输出月 ;输出日
RET
DISP_DATE ENDP
第 8页
汇编语言程序设计
第 13 章 高级宏汇编语言技术
DISP_TIME PROC NEAR ; 显示系统时间 DISP_STR TIMES.TIME_STR
DISP_T TIMES.HOUR
DISP_T TIMES.MINUTE DISP_T TIMES.SEC
;设置代码段 【例】宏指令使用的过程 : 注意:宏指令的使用不会减少程序的目标代码长度 ;宏定义 PUSH4 MACRO PUSH AX PUSH BX PUSH CX PUSH DX ENDM EXCHANGE MACRO MEM1,MEM2,REG MOV REG,MEM1 XCHG REG,MEM2 MOV MEM1,REG ENDM ;设置数据段 DATA SEGMENT DA_W01 DW 1234H DA_W02 DW 5678H DATA ENDS ;设置堆栈段 STACK1 SEGMENT PARA STACK DW 20H DUP(?) STACK1 ENDS
┇
第 13 章 高级宏汇编语言技术 设某数据段有如下定义的变量: DA1 DW 1234H,5678H DA2 DW 120H,210H DA3 DW 4 DUP(?) 在代码段中:如有两次宏调用,则两次的宏 展开如下: ┇ MULTIP DA1,DA2,DA3 + MOV DX,DA1 + MOV CX,DA2 + XOR BX,BX + XOR AX,AX + JCXZ ?? 0001 +??0000:ADD BX,DX + ADC AX,0 + LOOP ??0000 +??0001:MOV DA3,BX + MOV DA3+2,AX ┇
RET
DISP_TIME ENDP INCLUDE NUM_DEC.ASM CODE ENDS
第 9页
汇编语言程序设计
第 13 章 高级宏汇编语言技术
13.3 宏汇编
13.3.1 宏功能的使用过程 宏汇编的意义:避免了重复编写,使源程序更加简洁、易读。 宏指令:将在源程序中多次使用到同一个程序段定义成一个“指令” 1.宏定义
第13页
汇编语言程序设计
第 13 章 高级宏汇编语言技术
2.表达值,而不是获取表达式文本本身 格式:%表达式
注意:这个操作符一般是出现在宏调用中,不允许出现在形参的前面。 【例】表达式%的使用: ;宏定义 SHIF0 MACRO CNT MOV CL,CNT ENDM SHIF1 MACRO REG,DIRECT,NUM COUNT=NUM SHIF0 %COUNT S&DIRECT REG,CL ENDM ;宏调用 SHIF1 AX,HL,2 SHIF1 BL,AR,3 ;宏展开 SHIF1 AX,HL,2 + MOV CL,2 + SHL AX,CL SHIF1 BL,AR,3 + MOV CL,3 + SAR BL,CL
COSEG SEGMENT ASSUME CS:COSEG,DS:DATA,SS:STACK1 START:MOV AX,DATA MOV DS,AX ┇ PUSH4 ;宏指令语句 + PUSH AX + PUSH BX + PUSH CX + PUSH DX ┇ EXCHANGE DA_W01,DA_W02,CX ;宏指令语句 + MOV CX, DA_W01 + XCHG CX, DA_W02 + MOV DA_W01,CX ┇ COSEG ENDS END START
宏名 MACRO ┇ }宏体 不带参数 ENDM 带参数
不可缺省, 且名字唯一
格 式
语句序列
宏名 MACRO 形参1,形参2,..... ┇}宏体 ENDM
【例】对两个存储单元(字节/字)的内容相互交换的程序段进行宏定义: EXCHANGE MACRO MEM1,MEM2,REG MOV REG,MEM1 形参 XCHG REG,MEM2 MOV MEM1,REG ENDM
第 6页
汇编语言程序设计
第 13 章 高级宏汇编语言技术
GET_DATE PROC NEAR ;取系统日期 MOV AH,2AH INT 21H MOV TIMES.YEAR,CX ;年信息 MOV TIMES.MONTH,DH ;月 MOV TIMES.DAY,DL ;日 RET GET_DATE ENDP GET_TIME PROC NEAR ;取系统时间 MOV AH,2CH INT 21H MOV TIMES.HOUR,CH MOV TIMES.MINUTE,CL MOV TIMES.SEC,DH RET GET_TIME ENDP