在编写源程序时,有时会出现连续相同或相似的语句(组)。当出现这种情况时,可利用重复伪指令来重复语句,从而达到简化程序的目的。
重复汇编伪指令所定义的重复块是宏的一种特殊形式,也是由伪指令ENDM来结束重复块。用重复汇编伪指令定义的重复块也可带有参数,并在汇编过程中参数被实参代替,但重复块不会被命名,不能在程序的其它地方引用。
伪指令REPT的作用是把一组语句重复指定的次数,该重复次数由伪指令后面的数值表达式来确定。其一般使用格式如下:
| REPT | 数值表达式 | |
| 重复的语句组 | ||
| ENDM | 
例9.8 定义100个初值为32的字节单元,该存储单元的起始符号地址为Table。
| 解: | |||
|    
     方法1:用伪指令REPT来实现  |  
    左边重复块的汇编结果如下: | ||
| Table LABEL TYPE | Table LABEL TYPE  |  
  ||
| REPT | 100 | DB 32  |  
  |
| DB 32 | …  |  
  ||
| ENDM | DB 32 ;上述字节定义重复100次  |  
  ||
方法2:用重复操作符DUP来实现
Table DB 100 DUP(32)
从上例来看,用伪指令REPT重复定义的存储单元可以用重复操作符DUP来代替,其实前者的功能会更灵活、更强大。
例9.9 定义100个初值分别为1,2,…,100的字节单元,该存储单元的起始符号地址为Table。
| 解: | ||||
| Table LABEL TYPE | 左边重复块的汇编结果相当于: | |||
| COUNT = 1 | Table LABEL TYPE | |||
| REPT | 100 | DB 1 | ||
| DB COUNT | DB 2 | |||
| COUNT = COUNT + 1 | … | |||
| ENDM | DB 100 | |||
上面定义了100个字节,其初值为1,2,…,100。本例好象不能用重复操作符DUP来说明字节存储单元。
例9.10 计算1+2+…+1000,并把其值存入寄存器AX。
| 解: | |||
|  
 方法1:用伪指令REPT来实现  |     
    左边重复块的汇编结果与下面程序段相一致: | ||
| … | … | ||
| MOV AX, 0 | MOV AX, 0 | ||
| COUNT = 1 | ADD AX, 1 | ||
| REPT | 1000 | ADD AX, 2 | |
| ADD AX, COUNT | … | ||
| COUNT = COUNT + 1 | ADD AX, 1000 ;把AX从1累加到1000 | ||
| ENDM | … | ||
| … |  
 虽然上面这些语句的执行能完成本例所指定的功能,但它是用1000条加法指令来直接计算的,这1000条指令无疑会大大增加目标代码的长度。  |  
  ||
|  
 方法2:用循环指令LOOP来实现  | 
  ||
| … | ||
| MOV | AX, 0 | |
| MOV | CX, 1000 | |
| again: | ADD | AX, CX | 
| LOOP | again | |
| … | ||
由例9.10,不难看出:伪指令REPT与循环指令起作用的时期和方式是截然不同的。它们之间的主要差异如表9.1所列。
表9.1 伪指令REPT与循环指令LOOP之间的主要差异
| 
         伪指令REPT  | 
      
         循环指令LOOP  | 
    |
| 
         起作用的时期  | 
      
         汇编程序把源文件翻译成目标文件时期  | 
      
         程序的执行时期  | 
    
| 
         起作用的方式  | 
      
         把被重复的指令(组)直接重复写入目标文件  | 
      
         通过反复执行同一指令(组)来实现重复  | 
    
| 
         重复次数对目标文件的影响  | 
      
         由于重复次数决定着被重复指令(组)写入目标文件的次数,所以,改变重复次数一定会改变目标文件的字节数  | 
      
         由于重复的指令数与重复次数无关,所以,改变重复次数不会改变目标文件的字节数  |