汇编学习笔记47
三、 重复汇编
有时程序会连续地重复完成相同或几乎相同的一组语句,当出现这种情况时,可考虑用重复伪指令定义的重复块,以简化源程序。
重复块是允许建立重复语句的宏的一种特殊形式,它们与宏的不同之处在于它们没有被命名,并因而不能被调用。
1. 伪指令 REPT
伪指令REPT用于创建重复块,重复块的重复次数由一个数值表达式的值给定。一般格式如下:
REPT 数值表达式
需重复的语句组
ENDM
宏汇编程序把“需要重复的语句组”连续地重复汇编由表达式所决定的次数。
例1:
CHAR = 'A'
TABLE LABEL BYTE
REPET 26
DB CHAR
CHAR=CHAR+1
ENDM
汇编为:
+ TABLE LABEL BYTE
+ DB 'A'
+ DB 'A'+1
+ …
+ DB 'A'+24
+ DB 'A'+25
例2:
要求建立一个100D字的数组,其中每个字的内容是下一个字的地址,而最后一个字的内容是第一个字的地址
ARRAY LABEL WORD
REPET 99
DW $+2
ENDM
DW ARRAY
汇编后:
+ ARRAY ABBEL WORD
+ DW $+2
+ DW $+2
+ …
+ DW $+2
+ DW ARRAY
2. 伪指令IRP
伪指令IRP用于创建重复块。重复次数和每次重复使用的实参由参数列表决定。一般格式如下:
IRP 形式参数, <实参1, 实参2, ……, 实参n>
需重复的语句
ENDM
其中实参的个数决定了重复的次数
例3:
下面重复块实现把0~9的平方存入数值QUART中
QUART LABEL BYTE
IRP X, <0, 1, 2, 3, 4, 5, 6, 7, 8, 9>
DB X*X
ENDM
例4:
下面的重复块实现了把若干寄存器压入堆栈
IRP REG, <AX, BX, CX, DX>
PUSH REG
ENDM
+ PUSH AX
+ PUSH BX
+ PUSH CX
+ PUSH DX
3. 伪指令 IRPC
伪指令IRPC和IRP相似, 但实参列表是一个字符串,一般格式如下:
IRPC 形式参数 字符串
需要重复的语句组
ENDM
字符串的长度规定了重复的次数,如果字符串包含了空格, 逗号等分隔符, 那么字符串需用一对尖括号括起来。
例5:
TABLE LABEL BYTE
IRPC X, 0123456789
DW (X+1)*2
ENDM
例6:
下面重复语句块实现把AX, BX, CX, DX四个寄存器依次压入堆栈
IRPC REG, ABCD
PUSH REG&X
ENDM