1 / 39

第8章 高级汇编语言技术

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

alain
Télécharger la présentation

第8章 高级汇编语言技术

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  2. 基本内容 宏汇编 重复汇编 条件汇编

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

  4. 8.1.1 宏指令的定义、调用和展开 宏定义 宏定义用一组伪操作实现: 宏名 MACRO [形参列表] … (宏体) ENDM

  5. 例:用宏指令实现将DL寄存器右移3位 SHRT MACRO MOV CL,3 SAR DL,CL ENDM 注意:宏定义可出现在源程序的任何位置, 但必须出现在宏调用之前,也就是必须先定义 后调用。

  6. 宏调用 经过宏定义后,宏指令就可以在源程序中调 用,即宏调用。 宏调用的格式是: 宏名 [实参1,实参2,实参3,…] 宏展开 当汇编程序对源程序进行汇编时,汇编程序 每个宏调用作宏展开。宏展开就是用宏体代源程 序中的宏名,用实参取代宏定义中的形参。

  7. 例:用宏指令定义两个字节数据相加,并存放到一个单元中 ,并作宏调用和宏展开。 ADDB MACRO AD1,AD2,RESULT ;宏定义 PUSH AX MOV AL,AD1 ADD AL,AD2 MOV RESULT,AL POP AX ENDM

  8. … ADDB 5CH,43H,DL ;宏调用 … 1PUSH AX ;宏展开 1 MOV AL,5CH 1 ADD AL,43H 1 MOV DL,AL 1 POP AX …

  9. 8.1.2 宏操作符 操作符 & 操作符 % 操作符〈〉 操作符 !

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

  11. 例:宏定义:DSEG MACRO NUM, LETTER LAS&NUM DB ‘WRITING&LETTER’ ENDM宏调用:DSEG 1, ERROR DSEG 2, RIGHT宏展开: 1 LAS1 DB ‘WRITINGERROR’ 1 LAS2 DB ‘WRITINGRIGHT’ 在这里,第一个参数合并成标号,第二个参数用于字 符串中。

  12. 操作符 % 汇编程序将操作符%后的表达式的值而不是表达式 文本本身作为当前值,宏展开时,用该值取代形参,%操 作符不允许出现在形参前面。

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

  14. 宏调用:…SARF2 2 SARF2 4… 宏展开: … 1 MOV CL,2 1 SAL AL,CL 1 MOV CL,4 1 SAL AL,CL …

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

  16. 例: 宏定义: 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’

  17. 操作符 ! 汇编程序将操作符 ! 后的字符只作字符含义进行处 理。如“!%”表示%只作百分号使用。在宏调用时,为使实 参中的一些特殊字符作一般字符处理,就要在其前加上该 操作符。

  18. 例: 宏定义: HELLOW MACRO DSG,SENTENS DSG DB ‘&SENTENS’ ENDM 宏调用:HELLOW !%(2+9-1) 宏展开: 1 DB ‘%(2+9-1)’

  19. 8.1.3 局部符号伪指令 汇编程序中提供伪指令LOCAL,解决标号的多重定义 问题。 伪指令LOCAL格式: LOCAL 标号表 在每次宏展开时,汇编程序对LOCAL伪指令说明的 标号或变量用唯一的符号“??XXXX”(XXXX表示0000-FFFF的十六进制数)代替。

  20. 例: 宏定义: 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

  21. 宏展开: 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

  22. 须要说明的是,LOCAL伪指令只用于宏定义体内,且必须是宏定义伪指令MACRO之后的第一条语句,在MACRO和LOCAL伪指令之间不允许有注释和分号标志。须要说明的是,LOCAL伪指令只用于宏定义体内,且必须是宏定义伪指令MACRO之后的第一条语句,在MACRO和LOCAL伪指令之间不允许有注释和分号标志。 如果伪指令LOCAL后有多个标号,如: LOCAL NEXT1,NEXT2 宏展开时,汇编程序分别用??0000、??0001取代第一次宏 调用中NEXT1、NEXT2。用??0002 、??0003分别取代第二 次宏调用中的NEXT1、NEXT2,依次类推。

  23. SHRF MACRO X MOV CL,X SAR AL,CL ENDM SHRFQ MACRO Y,Z,RESU PUSH AX PUSH CX MOV AL,Z SHRF Y AND AL,Z MOV RESU,AL POP CX POP AX ENDM 宏定义中使用宏调用例:宏定义SHRFQ中使用宏调用 8.1.4 宏嵌套

  24. 宏定义中定义宏指令例:宏定义SHEAT中定义宏指令INMOV宏定义中定义宏指令例:宏定义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

  25. 8.1.5 宏库的建立与使用 为了节约编程时间和减少错误,我们可以将常用的 宏定义集中放在一个文件中,这个文件称为宏库。调用 宏库中的宏时,只需在源文件前面用伪指令INCLUDE将 宏库加入到自己的源文件中。

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

  27. 伪指令REPT 格式: REPT 表达式 … … (重复语句序列) … ENDM 其中,表达式包含的项必须有定义,不能包含外部 变量,且必须可求出常数值,表达式的值给出重复块的 重复次数。

  28. 例:将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

  29. 伪指令IRP 格式: IRP 形参,〈实参1,实参2,……〉 … … (重复语句序列) … ENDM 其中实参个数确定重复汇编的次数,重复汇编语句序列时,依次用尖括号中的实参取代形参 。

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

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

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

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

  34. IF和IFE IF 表达式的值不为0,则满足条件, 即条件为真,其表达式的值应该是一个常 数。IFE 表达式的值为0,则条件为真。

  35. 例:宏MOVSN判断参数N是否为0,如果不为0,则将N右移两位,否则将AL寄存器置0。 MOVSN MACRO N IF N MOV AL,N MOV CL,2 SAR AL,CL ELSE MOV AL,0 ENDIF ENDM

  36. IFB和IFNB 伪指令IFB和IFNB测试宏定义中的参 数,如果参数是空格,则IFB条件为真。否 则IFNB条件为真。

  37. 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 例:宏MOVSM在汇编时,测试参数HANDLE的值,判断对MOV BX,HANDLE或 MOV BX,1 进行汇编。

  38. IFIDN和IFDIF 伪指令IFIDN和IFDIF比较字符串参数1和字 符串参数2的值是否相等,如果相等则IFIDN条件 为真,否则IFDIF条件满足。

  39. 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 例: 宏FILEOP 将参数OPREATE作为判断条件。

More Related