第8章 高级汇编语言技术

39
IBM PC 80X86 汇汇汇汇汇汇汇汇汇汇汇汇汇汇汇 第8第 第第第第第第第第 第8第 第第第第第第第第

description

第8章 高级汇编语言技术. 基本内容. 宏汇编 重复汇编 条件汇编. 8.1 宏汇编. 宏指令的定义、调用和展开 宏操作符 局部符号伪指令 宏嵌套 宏库的建立与使用. 8.1.1 宏指令的定义、调用和展开. 宏定义 宏定义用一组伪操作实现: 宏名 MACRO [ 形参列表] … (宏体) ENDM. 例 :用宏指令实现将 DL 寄存器右移3位. - PowerPoint PPT Presentation

Transcript of 第8章 高级汇编语言技术

Page 1: 第8章   高级汇编语言技术

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 8章 高级汇编语言技术

第 8 章 高级汇编语言技术

Page 2: 第8章   高级汇编语言技术

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 8章 高级汇编语言技术

基本内容

宏汇编

重复汇编

条件汇编

Page 3: 第8章   高级汇编语言技术

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 8章 高级汇编语言技术

8.1 宏汇编

宏指令的定义、调用和展开 宏操作符 局部符号伪指令 宏嵌套 宏库的建立与使用

Page 4: 第8章   高级汇编语言技术

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 8章 高级汇编语言技术

8.1.1 宏指令的定义、调用和展开

宏定义 宏定义用一组伪操作实现: 宏名 MACRO [ 形参列表 ] … (宏体) ENDM

Page 5: 第8章   高级汇编语言技术

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 8章 高级汇编语言技术

SHRT MACRO MOV CL , 3 SAR DL , CL ENDM

例:用宏指令实现将 DL 寄存器右移 3 位

注意:宏定义可出现在源程序的任何位置,

但必须出现在宏调用之前,也就是必须先定义

后调用。

Page 6: 第8章   高级汇编语言技术

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 8章 高级汇编语言技术

宏调用 经过宏定义后,宏指令就可以在源程序中调

用,即宏调用。

宏调用的格式是:

宏名 [ 实参 1 ,实参 2 ,实参 3 ,… ]

宏展开 当汇编程序对源程序进行汇编时,汇编程序

每个宏调用作宏展开。宏展开就是用宏体代源程

序中的宏名,用实参取代宏定义中的形参。

Page 7: 第8章   高级汇编语言技术

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 8章 高级汇编语言技术

例:用宏指令定义两个字节数据相加,并存放到一个单元

中 ,并作宏调用和宏展开。

ADDB MACRO AD1 , AD2 , RESULT ;宏定义

PUSH AX MOV AL , AD1 ADD AL , AD2 MOV RESULT , AL POP AX ENDM

Page 8: 第8章   高级汇编语言技术

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 8章 高级汇编语言技术

… ADDB 5CH , 43H , DL ;宏调用 …

1 PUSH AX ;宏展开1 MOV AL , 5CH1 ADD AL , 43H1 MOV DL , AL1 POP AX …

Page 9: 第8章   高级汇编语言技术

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 8章 高级汇编语言技术

8.1.2 宏操作符

操作符 &

操作符 %操作符〈〉操作符 !

Page 10: 第8章   高级汇编语言技术

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 8章 高级汇编语言技术

操作符 &

操作符 & 在宏定义中使用时可以在形参之前,也可 以出现在形参之后,宏展开时将 & 前后两个符号合并成 一个符号,该符号可以是操作码、操作数,也可以是字 符串。

Page 11: 第8章   高级汇编语言技术

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 8章 高级汇编语言技术

例 :宏定义: DSEG MACRO NUM , LETTER LAS&NUM DB ‘WRITING&LETTER’ ENDM宏调用: DSEG 1 , ERROR DSEG 2 , RIGHT宏展开: 1 LAS1 DB ‘WRITINGERROR’ 1 LAS2 DB ‘WRITINGRIGHT’

在这里,第一个参数合并成标号,第二个参数用于字符串中。

Page 12: 第8章   高级汇编语言技术

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 8章 高级汇编语言技术

操作符 %

汇编程序将操作符 % 后的表达式的值而不是表达式文本本身作为当前值,宏展开时,用该值取代形参, %

作符不允许出现在形参前面。

Page 13: 第8章   高级汇编语言技术

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 8章 高级汇编语言技术

例例::

宏定义: SARF1 MACRO CON1 , DECT MOV CL , CON1 S&DECT AL , CL ENDM SARF2 MACRO CON2 CNT= CON2 SARF1 %CNT , AL ENDM

Page 14: 第8章   高级汇编语言技术

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 8章 高级汇编语言技术

宏调用: … SARF2 2 SARF2 4 …

宏展开: … 1 MOV CL , 2 1 SAL AL , CL 1 MOV CL , 4 1 SAL AL , CL …

Page 15: 第8章   高级汇编语言技术

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 8章 高级汇编语言技术

操作符〈〉 汇编程序将操作符〈〉括起的内容作为一个字符串处 理。宏调用中,实参如果含有空格、逗号等间隔符,就用 操作符〈〉将实参括起,作为一个单一完整的实参。若将 一个特殊字符作为实参,也可以用该操作符处理,如

〈 & 〉 表示一个字符“ &” ,而不是操作符。

Page 16: 第8章   高级汇编语言技术

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 8章 高级汇编语言技术

例:宏定义: HELLOW MACRO DSG , SENTENS DSG DB ‘&SENTENS’ ENDM宏调用: HELLOW MASG ,〈 HOW ARE YOU 〉

HELLOW MASG , HOW ARE YOU宏展开: 1 MASG DB ‘HOW ARE YOU’ 1 MASG DB ‘HOW’

Page 17: 第8章   高级汇编语言技术

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 8章 高级汇编语言技术

操作符 ! 汇编程序将操作符 ! 后的字符只作字符含义进行处 理。如“! %” 表示 % 只作百分号使用。在宏调用时,为使

实 参中的一些特殊字符作一般字符处理,就要在其前加上该 操作符。

Page 18: 第8章   高级汇编语言技术

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 8章 高级汇编语言技术

例: 宏定义: HELLOW MACRO DSG , SENTENS DSG DB ‘&SENTENS’ ENDM 宏调用:

HELLOW ! % ( 2+9-1 ) 宏展开: 1 DB ‘% ( 2+9-1 ’)

Page 19: 第8章   高级汇编语言技术

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 8章 高级汇编语言技术

8.1.3 局部符号伪指令

汇编程序中提供伪指令 LOCAL, 解决标号的多重定义 问题。 伪指令 LOCAL 格式: LOCAL 标号表 在每次宏展开时,汇编程序对 LOCAL 伪指令说明的 标号或变量用唯一的符号“ ??XXXX” ( XXXX 表示 0

000-FFFF 的十六进制数)代替。

Page 20: 第8章   高级汇编语言技术

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 8章 高级汇编语言技术

例:宏定义: ROTAE MACRO NUM LOCAL NEXT MOV CL , NUM SAR AL , CL CMP AL , 9 JNBE NEXT NEXT : AND AL , 0FH ENDM宏调用: ROTAE 1 ROTAE 2

Page 21: 第8章   高级汇编语言技术

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 8章 高级汇编语言技术

宏展开: 1 MOV CL , 1 1 SAR AL , CL 1 CMP AL , 9 1 JNBE ??0000 1 ??0000 : AND AL , 0FH 1 MOV CL , 2 1 SAR AL , CL 1 CMP AL , 9 1 JNBE ??0001 1 ??0001: AND AL,0FH

Page 22: 第8章   高级汇编语言技术

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 8章 高级汇编语言技术

须要说明的是, LOCAL 伪指令只用于宏定义体内,且

必须是宏定义伪指令 MACRO 之后的第一条语句,在MACRO 和 LOCAL 伪指令之间不允许有注释和分号标志。

如果伪指令 LOCAL 后有多个标号,如: LOCAL NEXT1 , NEXT2

宏展开时,汇编程序分别用 ??0000 、 ??0001 取代第一次宏调用中 NEXT1 、 NEXT2 。用 ??0002 、 ??0003 分别取代

第二次宏调用中的 NEXT1 、 NEXT2 ,依次类推。

Page 23: 第8章   高级汇编语言技术

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 8章 高级汇编语言技术

宏定义中使用宏调用例:宏定义 SHRFQ 中使用宏调用

SHRF MACRO X MOV CL , X SAR AL , CL ENDMSHRFQ MACRO

Y , Z , RESU PUSH AX PUSH CX

MOV AL , Z SHRF YAND AL , ZMOV RESU , ALPOP CXPOP AXENDM

8.1.4 宏嵌套

Page 24: 第8章   高级汇编语言技术

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 8章 高级汇编语言技术

宏定义中定义宏指令例:宏定义 SHEAT 中定义宏指令 INMOV SHEAT MACRO INMOV , OPTR INMOV MACRO X , Y , RESULT PUSH AX PUSH CX MOV CL , X MOV AL , Y S&OPTR AL , CL MOV RESULT , AL POP CX POP AX ENDM ENDM

Page 25: 第8章   高级汇编语言技术

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 8章 高级汇编语言技术

8.1.5 宏库的建立与使用

为了节约编程时间和减少错误,我们可以将常用的 宏定义集中放在一个文件中,这个文件称为宏库。调用 宏库中的宏时,只需在源文件前面用伪指令 INCLUDE

将 宏库加入到自己的源文件中。

Page 26: 第8章   高级汇编语言技术

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 8章 高级汇编语言技术

8.2 重复汇编

重复汇编指源程序中用重复伪指令定义需要重复 的语句序列,汇编程序对该语句序列进行多次汇编。

伪指令 REPT

伪指令 IRP

伪指令 IRPC

Page 27: 第8章   高级汇编语言技术

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 8章 高级汇编语言技术

伪指令REPT

格式: REPT 表达式 …

… (重复语句序列) …

ENDM

其中,表达式包含的项必须有定义,不能包含外部 变量,且必须可求出常数值,表达式的值给出重复块的 重复次数。

Page 28: 第8章   高级汇编语言技术

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 8章 高级汇编语言技术

例 : 将 0-50 中 5 的倍数存放到 10 个字节单元中

N=0 REPT 10 N=N+5 DB N ENDM汇编产生如下结果 1 DB 5 1 DB 10 1 DB 15 …

1 DB 50

Page 29: 第8章   高级汇编语言技术

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 8章 高级汇编语言技术

伪指令伪指令 IRPIRP

格式: IRP 形参,〈实参 1 ,实参 2 ,……〉 … … (重复语句序列) … ENDM

其中实参个数确定重复汇编的次数,重复汇编语句序列时,依次用尖括号中的实参取代形参 。

Page 30: 第8章   高级汇编语言技术

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 8章 高级汇编语言技术

例: IRP R ,〈 A , B , C , D 〉 PUSH R&X ENDM汇编期间得到如下结果: 1 PUSH AX 1 PUSH BX 1 PUSH CX 1 PUSH DX

Page 31: 第8章   高级汇编语言技术

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 8章 高级汇编语言技术

伪指令 IRPC

格式: IRPC 形参,字符串 … … (重复语句序列) … ENDM 与伪指令 IRP 相似,但实参必须是字符串,其中字符串中字符个数确定重复汇编的次数,重复汇编语句序列时,依次用字符串中的一个字符取代形参,直到用完字符串中的所有字符。

Page 32: 第8章   高级汇编语言技术

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 8章 高级汇编语言技术

例: IRPC S , ABCDEFGHI DB S ENDM汇编期间得到如下结果: 1 DB ‘A’ 1 DB ‘B‘ … 1 DB ‘I’

Page 33: 第8章   高级汇编语言技术

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 8章 高级汇编语言技术

8.3 条件汇编

条件汇编的作用是使汇编程序能根据条件有选择的对程序段进行汇编。源程序中依需要设定条件,汇编时汇编程序根据条件是否满足,对该段程序进行汇编或不进行汇编,以得到所需的目标代码。

IF 和 IFE IFB 和 IFNB IFIDN 和 IFDIF

Page 34: 第8章   高级汇编语言技术

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 8章 高级汇编语言技术

IF 和 IFE

IF 表达式的值不为 0 ,则满足条件,

即条件为真,其表达式的值应该是一个常

数。 IFE 表达式的值为 0 ,则条件为真。

Page 35: 第8章   高级汇编语言技术

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 8章 高级汇编语言技术 例:宏例:宏 MOVSNMOVSN 判断参数判断参数 NN 是否为是否为 00 ,如果,如果

不为不为 00 ,则将,则将 NN 右移两位,否则将右移两位,否则将 ALAL 寄存器置寄存器置00 。。

MOVSN MACRO N IF N MOV AL,N MOV CL,2 SAR AL,CL ELSE MOV AL , 0 ENDIF ENDM

Page 36: 第8章   高级汇编语言技术

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 8章 高级汇编语言技术

IFB 和 IFNB

伪指令 IFB 和 IFNB 测试宏定义中的参

数,如果参数是空格,则 IFB 条件为真。否

则 IFNB 条件为真。

Page 37: 第8章   高级汇编语言技术

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 8章 高级汇编语言技术 例:宏 MOVSM 在汇编时,测试参数 HANDLE 的值,

判断对 MOV BX , HANDLE 或 MOV BX , 1 进行汇

编。 MOVSM MACRO

BYTE , HANDLE MOV AH , 42H MOV AL , 00 IFNB 〈 HANDLE 〉 MOV BX , HANDLE ELSE

MOV BX , 1

ENDIF MOV CX , 00 MOV DX , BYTE INT 21H ENDM

Page 38: 第8章   高级汇编语言技术

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 8章 高级汇编语言技术

IFIDN 和 IFDIF

伪指令 IFIDN 和 IFDIF 比较字符串参数 1 和字

符串参数 2 的值是否相等,如果相等则 IFIDN 条件

为真,否则 IFDIF 条件满足。

Page 39: 第8章   高级汇编语言技术

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 8章 高级汇编语言技术

例: 宏 FILEOP 将参数 OPREATE 作为判断条件。 FILEOP MACRO FILENAME

OPREATE IFIDN 〈 OPREATE 〉 ,

〈 CREAT 〉 MOV AH , 16H MOV DX , SEG FILENAME MOV DS , DX MOV DX , OFFSET

FILENAME INT 21H ENDIF

IFIDN 〈 OPREATE 〉 ,〈 ENDSS 〉

MOV AH , 10H MOV DX , SEG FILENAME MOV DS , DX MOV DX , OFFSET

FILENAME INT 21H ENDIF ENDM