汇編语言程序设计 第8章高级语言汇编技术 宏汇编 重复汇编 条件汇编伪指令
汇编语言 程序设计 第8章 高级语言汇编技术 ◆ 宏汇编 ◆ 重复汇编 ◆ 条件汇编伪指令
汇編语言程序设计 8.1宏汇编 在编写汇编语言程序的过程中,有时某个程序 段要出现许多次,有时只是参数不同,但功能完全 羊,则这样的程序段可以定义成一个指令,并且 称它为宏指令。 8.1.1宏定义 若想在汇编语言中使用宏指令,就要定义一个 宏。按照是否使用参数,可以将宏指令分为如下两 种格式。 1.不带参数的宏定义 宏指令名 MACRO 宏体
汇编语言 程序设计 8.1 宏汇编 在编写汇编语言程序的过程中,有时某个程序 段要出现许多次,有时只是参数不同,但功能完全 一样,则这样的程序段可以定义成一个指令,并且 称它为宏指令。 8.1.1 宏定义 若想在汇编语言中使用宏指令,就要定义一个 宏。按照是否使用参数,可以将宏指令分为如下两 种格式。 1. 不带参数的宏定义 宏指令名 MACRO ┇ 宏体 ENDM
汇編语言程序设计 2.带参数的宏定义 宏指令名 MACRO形参1,形参2 宏体 ENDM 例8.2】将两个存储单元数据交换的程序段定义成一个宏指 令 EXCH MEM。 EXCH MEM MACRO MEM 1 MEM 2. REG MOV REG MEM 1 XCHG REG. MEM 2 MOV MEM 1. REG ENDM MEM1.MEM2.REG是形式参数。形参可以是多个,各个形参 之间用逗号相隔。对于带参数的宏定义,宏体中程序段有些部分允 许宏调用时作适当修改。在宏定义中,把允许修改的分用形式参数 (称形参)来表示,当宏调用时就用相应的实参数来取代
汇编语言 程序设计 2.带参数的宏定义: 宏指令名 MACRO 形参1,形参2,… ┇ 宏体 ENDM 【例8.2】将两个存储单元数据交换的程序段定义成一个宏指 令EXCH_MEM。 EXCH_MEM MACRO MEM_1,MEM_2,REG MOV REG,MEM_1 XCHG REG,MEM_2 MOV MEM_1,REG ENDM MEM_1,MEM_2,REG是形式参数,形参可以是多个,各个形参 之间用逗号相隔。对于带参数的宏定义,宏体中程序段有些部分允 许宏调用时作适当修改。在宏定义中,把允许修改的分用形式参数 (简称形参)来表示,当宏调用时就用相应的实参数来取代
汇編语言程序设计 8.1.2宏调用和宏展开 宏调用 在汇编语言中使用已定义过的宏指令,称 为宏调用。按照宏指令定义的格式,宏调用也 可分为两种格式。 (1)无参数宏调用:宏指令名 (2)带参数宏调用:宏指令名实参1,实参2
汇编语言 程序设计 8.1.2 宏调用和宏展开 1. 宏调用 在汇编语言中使用已定义过的宏指令,称 为宏调用。按照宏指令定义的格式,宏调用也 可分为两种格式。 (1) 无参数宏调用:宏指令名 (2) 带参数宏调用:宏指令名 实参1,实参2,…
汇編语言程序设计 2.宏展开 当宏汇编程序扫描到宏指令语旬(即宏调 用)时,宏汇编程序就把宏指令定义中宏体的 程序段代码替代宏指令语句。若是带参数的宏 调用.则同时用相应的实参替代宏体中对应形 参的位置,并对原有宏体代码作修改。 下面是一个源程序的列表文件,它展示了 宏定义、宏调用和宏展开的全部过程。在列表 文件中,左边带“+”号的指令是宏汇编程序 在宏展开时自动生成的指令。宏定义本身不生 成任何目标代码,宏指令语句本身也不生成目 标代码,它仅表示宏调用出现的位置
汇编语言 程序设计 2. 宏展开 当宏汇编程序扫描到宏指令语句(即宏调 用)时,宏汇编程序就把宏指令定义中宏体的 程序段代码替代宏指令语句。若是带参数的宏 调用,则同时用相应的实参替代宏体中对应形 参的位置,并对原有宏体代码作修改。 下面是一个源程序的列表文件,它展示了 宏定义、宏调用和宏展开的全部过程。在列表 文件中,左边带“+”号的指令是宏汇编程序 在宏展开时自动生成的指令。宏定义本身不生 成任何目标代码,宏指令语句本身也不生成目 标代码,它仅表示宏调用出现的位置
汇編语言程序设计 EXCH MEM macro mem 1, MEM 2, REG MOV REG, MEM 1 XCHG REG, MEM 2 MOV mEM 1, REG ENDM DATA SEGMENT DA W1 DW 55AAH DA W2 DW 6688H DATA ENDS CODE SECMENT ASSUME CS: CODE, DS: DatA, SS: STACK START MOV AX, DATA MOV DS, AX ;宏调用和宏展开 EXCH MEM DAW1,DAW2,AX;宏指令语句 +++ Mov AX, Da WI XCHG AX, DA W2 Mov DA W1, REG MOv AH, 4CH INT 21H CODE ENDS END START
汇编语言 程序设计 EXCH_MEM MACRO MEM_l,MEM_2,REG MOV REG,MEM_1 XCHG REG,MEM_2 MOV MEM_1,REG ENDM DATA SEGMENT DA_W1 DW 55AAH DA_W2 DW 6688H DATA ENDS CODE SECMENT ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX ┇ ;宏调用和宏展开 EXCH_MEM DA_W1,DA_W2,AX ;宏指令语句 + MOV AX ,DA_Wl + XCHG AX,DA_W2 + MOV DA_W1,REG ┇ MOV AH,4CH INT 21H CODE ENDS END START
汇編语言程序设计 8.1.3宏调用中的参数使用 为了宏定义和引用的某些特殊需要,有时实参 是由字符、空格等特殊符号组成的,因此汇编程 序支持几个具有特定含义的运算符。 连接远算符& 在宏定义中,如果形式参数与其它字符连接在 起。或形式参数出现在字符串之中,那么,就 必须使用连接运算符(&)。在宏指令定义的具体使 用时,连接操作&可以在形参的前面,也可在形 参的后面。在宏指令展开时,对应形参的实参就 与它前面或后面的符号连接在一起构成一个新的 符号
汇编语言 程序设计 8.1.3 宏调用中的参数使用 为了宏定义和引用的某些特殊需要,有时实参 是由字符、空格等特殊符号组成的,因此汇编程 序支持几个具有特定含义的运算符。 1.连接运算符& 在宏定义中,如果形式参数与其它字符连接在 一起,或形式参数出现在字符串之中,那么,就 必须使用连接运算符(&)。在宏指令定义的具体使 用时,连接操作符&可以在形参的前面,也可在形 参的后面。在宏指令展开时,对应形参的实参就 与它前面或后面的符号连接在一起构成一个新的 符号
汇編语言程序设计 【例8.3】宏指令SHFN功能是:对某一个寄存器选行 由COUN确定的移位次数,由 DIRECT确定逻辑或算术左/右 移位,移位的方向可通过&将S和DRC对应的实参连接起来。 SHIFT N MARCO REG DIRECT. COUNT MOV CL COUNT S&DIRECt REg. ci ENDM 如 SHIFTN B,皿,3的宏指令的展开为: t mov cl. 3 t SHR BX. CL 这样就实现了使B逻辑右移3位。形参DRCT被寥參H 代瞽,通过连接苛&将S和连接成SR。同理 SHIFT N AX H,5可奥现AX逻辑左移5位
汇编语言 程序设计 【例8.3】宏指令SHIFT_N功能是:对某一个寄存器进行 由COUNT确定的移位次数,由DIRECT确定逻辑或算术左/右 移位,移位的方向可通过&将S和DIRECT对应的实参连接起来。 SHIFT_N MARCO REG,DIRECT,COUNT MOV CL,COUNT S&DIRECT REG,CL ENDM 如SHIFT_N BX,HR,3的宏指令的展开为: + MOV CL,3 + SHR BX,CL 这样就实现了使BX逻辑右移3位。形参DIRECT被实参HR 代替,通过连接符&将S和HR连接成SHR。同理SHIFT_N AX, HL,5可实现AX逻辑左移5位
汇編语言程序设计 2.大本操作符〈> NUMBER MACRO THEDATA DB THEDATA ENDM 假设在程序中调用此宏指令 DATA SEGMENT NUMBER,则在宏展开为: t db 1 ;而3,5按规则被忽略
汇编语言 程序设计 2. 文本操作符 文本操作符是一对尖括号<>,用它括起来的内容将作为一个 字符串来进行形式参数的整体替换。在宏引用时,如果实参内包 含逗号、空格等间隔符,则必须使用该操作符,以保证实参的完 整性。如果实参是某个具有特殊含义的字符,为了使它只表示该 字符本身,也需要用该运算符括起来。 NUMBER MACRO THEDATA DB THEDATA ENDM 假设在程序中调用此宏指令: DATA SEGMENT NUMBER DATA ENDS 则宏展开为: DATA SEGMENT + DB 1,3,5 DATA ENDS 如果不加,则在宏展开为: + DB 1 ; 而3,5按规则被忽略
汇編语言程序设计 3.表达式操作等% 选行宏调用时,如要在实參中使用“%”,则在宏指令调用 时宏汇編程序将获取“%”后常数褒达式的值作为参数,而非表 达式本身,如 NUMBER MACRO X Y Z DBⅩYZ ENDM 若宏调用为: EQU 10 EQU 50 NUMBER 16, %I+J, %J-I 则相应的宏展开为: +DB16。60.40
汇编语言 程序设计 3.表达式操作符% 进行宏调用时,如要在实参中使用“%” ,则在宏指令调用 时宏汇编程序将获取“%”后常数表达式的值作为参数,而非表 达式本身,如: NUMBER MACRO X,Y,Z, DB X,Y,Z ENDM 若宏调用为: I EQU 10 J EQU 50 NUMBER 16,%I+J,%J-I 则相应的宏展开为: + DB 16,60,40