第六章汇编语言高级编程 1、宏汇编 2、结构和记录 3、32位字长编程 4、汇编语言混合编程
第六章 汇编语言高级编程 1、宏汇编 2、结构和记录 3、32位字长编程 4、汇编语言混合编程
宏类似于C语言中的预处理,在编译时进行宏展开。 条件汇编能避免使用过多的标号,使程序的结构 更清晰。C与汇编语言的联合编程以及W32下的汇 编编程,将使汇编语言和高级语言的优,点充分结 合起来。 888
宏类似于C语言中的预处理,在编译时进行宏展开。 条件汇编能避免使用过多的标号,使程序的结构 更清晰 。 C与汇编语言的联合编程以及 与汇编语言的联合编程以及W32下的汇 编编程,将使汇编语言和高级语言的优点充分结 合起来。 2
6.1宏汇编 宏或称宏指令是源程序中的具有独立功能的程序代码。它 只需要在源程序中定义一次,就可以多次调用,所以使 用宏可以加快编程速度和查错效率,从而为程序设计提 供极具特色的模块化程序设计工具和手段,使汇编语言 源程序同高级语言程序一样清晰、简洁,有利于阅读、 修改和调试。 80 888
6.1 宏汇编 宏或称宏指令是源程序中的具有独立功能的程序代码。它 只需要在源程序中定义一次,就可以多次调用,所以使 用宏可以加快编程速度和查错效率,从而为程序设计提 供极具特色的模块化程序设计工具和手段,使汇编语言 源程序同高级语言程序一样清晰 源程序同高级语言程序一样清晰、简洁,有利于阅读、 修改和调试。 3
6.1.1宏定义 MACR0[] 宏体 ENDM
6.1.1 宏定义 MACRO [] ┆ 宏体 ENDM 4
说明: ①宏名即宏指令名是用户给某段指令定义的符号名,调用时。● 可用该符号名来调用宏。 ②宏名不能互相重复且使用宏汇编语言中的合法符号,并且 允许与源程序中的其他变量、标号、指令、伪指令名相同。 此时,宏名具有更高的优先级。 ③MACRO:和ENDM是一对伪操作符号,MACRO标识宏定义的开始, ENDM标识宏定义的结束。MACRO和ENDM之间的语句组称为 宏体,宏体中允许有伪指令、注释语句“;” ④形式参数表是可选项,因此宏可以不带参数;带参数时, 参数表中的各形式参数(或称形参、哑元)用逗号分隔。 o8888 5
说明: ①宏名即宏指令名是用户给某段指令定义的符号名,调用时 可用该符号名来调用宏。 ②宏名不能互相重复且使用宏汇编语言中的合法符号,并且 允许与源程序中的其他变量 允许与源程序中的其他变量、标号、指令、伪指令名相同。 此时,宏名具有更高的优先级。 ③MACRO和ENDM是一对伪操作符号 是一对伪操作符号,MACRO标识宏定义的开始 标识宏定义的开始, ENDM标识宏定义的结束。MACRO和ENDM之间的语句组称为 宏体,宏体中允许有伪指令 宏体中允许有伪指令、注释语句“;”。 ④形式参数表是可选项,因此宏可以不带参数;带参数时, 参数表中的各形式参数(或称形参、哑元)用逗号分隔。 5
例如:CRLF MACRO MOV AH,2 MOV DL,OAH ;OAH是回车ASCII.码 Int 21h MOV DL,ODH ;ODH是换行ASCII码 INT 21H ENDM 该宏功能是实现回车换行。 888
例如:CRLF MACRO CRLF MACRO MOV AH,2 MOV DL,0AH ;0AH是回车ASCII码 INT 21H INT 21H MOV DL,0DH ;0DH是换行ASCII码 INT 21H INT 21H ENDM 该宏功能是实现回车换行。 6
6.1.2宏调用与宏展开 宏调用的格式为: [K实参表>] 说明: ①宏名为已定义过的宏,即必须先定义、后调用。 ②实参表中的参数将一一对应替换宏定义中形参表中的参 数。两处的参数个数可以不同。若实参个数多于形式参数 个数,则多余的实参忽略;若实参个数少于形式参数个数, 则多余的形式参数用零或空格代替。 ③汇编程序在汇编源程序时,若遇到宏调用,则用调用所 提供的实参数替代相应的形参数,并把宏体中的指令嵌入●● 到源程序中。这种嵌入操作称为宏展开
6.1.2 宏调用与宏展开 宏调用的格式为: [] 说明: ①宏名为已定义过的宏 宏名为已定义过的宏,即必须先定义 、后调用 。 ②实参表中的参数将一一对应替换宏定义中形参表中的参 数 。两处的参数个数可以不同 。若实参个数多于形式参数 个数,则多余的实参忽略;若实参个数少于形式参数个数, 则多余的形式参数用零或空格代替。 ③汇编程序在汇编源程序时,若遇到宏调用,则用调用所 提供的实参数替代相应的形参数,并把宏体中的指令嵌入 到源程序中 。这种嵌入操作称为宏展开 。 7
。 例题6.1应用宏功能,实现字符串的屏幕输出。● 1.宏定义 PROMPT MACRO MESSAGE MOV AH,09H LEA DX,MESSAGE INT 21H ENDM 00 。888
例题6.1 应用宏功能,实现字符串的屏幕输出 实现字符串的屏幕输出。 1.宏定义 PROMPT MACRO MESSAGE MOV AH,09H LEA DX,MESSAGE INT 21H ENDM 8
2.宏调用 DATA SEGMENT STRING1 DB“STRING 0 JTPUT!$ DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX PROMPT STRING1;宏调用 MOV AH,4CH INT 21H CODE ENDS END START .888 9
2.宏调用 DATA SEGMENT DATA SEGMENT STRING1 DB “STRING OUTPUT !$” DATA ENDS DATA ENDS CODE SEGMENT ASSUME CS ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS DS,AX PROMPT STRING1 ;宏调用 MOV AH, 4CH MOV AH, 4CH INT 21H CODE ENDS CODE ENDS END START 9
3.宏展开 经汇编宏展开后, 代码段指令如下(+表示为宏展开后的语句): CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX + mov ah,09h; 宏调用Prompt String1的宏展开 + lea dx,Stringl + int 21h MOV AH,4CH INT 21H CODE ENDS END START 10
3.宏展开 经汇编宏展开后, 代码段指令如下(+表示为宏展开后的语句 表示为宏展开后的语句): CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX ,DATA MOV DS,AX + mov ah, 09h ah, 09h;宏调用Prompt String1 Prompt String1的宏展开 + lea dx, String1 + int 21h MOV AH, 4CH INT 21H CODE ENDS CODE ENDS END START 10