9.4.重复汇编伪指令

9.4 重复汇编伪指令

在编写源程序时,有时会出现连续相同或相似的语句(组)。当出现这种情况时,可利用重复伪指令来重复语句,从而达到简化程序的目的。

重复汇编伪指令所定义的重复块是宏的一种特殊形式,也是由伪指令ENDM来结束重复块。用重复汇编伪指令定义的重复块也可带有参数,并在汇编过程中参数被实参代替,但重复块不会被命名,不能在程序的其它地方引用。

9.4.1 伪指令REPT

伪指令REPT的作用是把一组语句重复指定的次数,该重复次数由伪指令后面的数值表达式来确定。其一般使用格式如下:

REPT数值表达式

 重复的语句组

ENDM

 

 

 

 

 

 

 

 

 

 

 

 

例9.8 定义100个初值为32的字节单元,该存储单元的起始符号地址为Table。

解:

方法1:用伪指令REPT来实现

Table LABEL TYPE

REPT 100

DB  32

ENDM

左边重复块的汇编结果如下:

Table LABEL TYPE

DB 32

DB 32 ;上述字节定义重复100次

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

方法2:用重复操作符DUP来实现

Table DB 100 DUP(32)

从上例来看,用伪指令REPT重复定义的存储单元可以用重复操作符DUP来代替,其实前者的功能会更灵活、更强大。

例9.9 定义100个初值分别为1,2,…,100的字节单元,该存储单元的起始符号地址为Table。

解:

Table LABEL TYPE

COUNT = 1

REPT 100

DB  COUNT

COUNT = COUNT + 1

ENDM

左边重复块的汇编结果相当于:

Table 

LABEL TYPE

DB 1

DB 2

DB 100

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

上面定义了100个字节,其初值为1,2,…,100。本例好象不能用重复操作符DUP来说明字节存储单元。

例9.10 计算1+2+…+1000,并把其值存入寄存器AX。

解:

方法1:用伪指令REPT来实现左边重复块的汇编结果与下面程序段相一致:

MOV AX, 0

COUNT = 1

REPT 1000

ADD AX, COUNT

COUNT = COUNT + 1

ENDM

MOV AX, 0

ADD AX, 1

ADD AX, 2

DD AX, 1000  ;

A把AX从1累加到1000

虽然上面这些语句的执行能完成本例所指定的功能,但它是用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

起作用的时期 汇编程序把源文件翻译成目标文件时期 程序的执行时期

起作用的方式 把被重复的指令(组)直接重复写入目标文件 通过反复执行同一指令(组)来实现重复

重复次数对目标文件的影响由 于重复次数决定着被重复指令(组)写入目标文件的次数,所以,改变重复次数一定会改变目标文件的字节数 由于重复的指令数与重复次数无关,所以,改变重复次数不会改变目标文件的字节数

9.4.2 伪指令IRP

伪指令IRP的作用是用每个参数创建一组语句,其重复次数由伪指令后面参数表中参数的个数来确定。其一般使用格式如下:

IRP形式参数, <实参1, 实参2, ……, 实参n>

重复的语句组

ENDM

例9.11 把16位通用寄存器之值相加,并把结果存入寄存器AX。

解:由于16位通用寄存器名是一些不同的符号,不能用计数的方法来依次访问它们,所以,我们需要用伪指令IRP来实现。

IRP REG, <BX, CX, DX, SP, BP, SI, DI>

ADD  AX, REG

ENDM

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

9.4.3 伪指令IRPC

伪指令IRPC的作用与IRP相似,其实参表是一个字符串,并对字符串中的每个字符创建一组语句,所以,其重复次数是由该字符串中的字符数来确定。其一般使用格式如下:

IRPC 形式参数, 字符串

重复的语句组

ENDM

 

 

 

 

 

 

 

 

 

 

 

 

例9.12 定义10个字节存储单元,保存数字0~9的平方数。

解:

IRPC X, 0123456789

DB X*X

ENDM

 

 

 

 

 

 

 

 

 

 

 

 

例9.13 把16位数据寄存器之值相加,并把结果存入寄存器DI。

解:由于16位数据寄存器是AX、BX、CX和DX,它们的名称中只有第一个字符不同,所以,可以用伪指令IRPC来实现。

XOR DI, DI

IRPC REG, ABCD

ADD  DI, REG&X ;符号&是连接运算符

ENDM

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值