汇编中的重复指令
- REP
- LOOP
- REP和LOOP的异同
- 不同
- 相同
- DUP
REP
rep是字符串操作指令MOVS,CMPS等的前缀,在CX不等于0的情况下,对字符串执行重复操作。
rep的重复次数也存在cx中,但是其实cx本身不具有让cx-1的功能,一般是rep后面跟着的指令执行之后自动让cx-1
还可以扩展出:
REPE(相等时重复)、REPNE(不相等时重复)、REPZ(为零时重复)及 REPNZ(不为零时重复)
老师上课的时候说, rep有点类似于宏。
LOOP
LOOP指令的格式是:
loop 标号
CPU执行至loop指令的时候,要进行两步操作
- cx=cx-1
- 判断cx的值,不是0就转到标号处执行程序;如果为0就向下执行。
因此cx中的值是执行次数。
REP和LOOP的异同
不同
rep前缀一次只能应用于一条字符串指令。要重复指令块,需要使用 LOOP 指令或其它循环结构。
相同
循环次数都存在cx中;cx中的就是循环次数。
DUP
dup是数据定义伪指令,其实他跟前面两个不太一样,他是用来定义一块内存区域,但是他也涉及到重复,因此把它们放在一起加以辨析。
dup是和db、dw、dd等数据定义伪指令配合使用的,用来进行数据的重复。
dup的使用格式如下:
db 重复的次数 dup(重复的字节型数据)
dw 重复的次数 dup (重复的字型数据)
dd 重复的次数 dup (重复的双字型数据)
如:db 3 dup (0)
定义了三个字节,它们的值都是0,相当于db 0,0,0
像这两个图中
dest_buffer和source_buffer就是名字,代表了这段空间的首地址。
(?)表示初始值随便。
在实际应用中,我们有时候会忽略名字,直接
stack segment
db 16 dup (0)
stack ends
这样也是完全可以的。
还有一个比较特别的例子
db 3 dup ('abc','ABC')
这条语句定义了18个字节,它们是abcABCabcABCabcABC,相当于
db 'abcABCabcABCabcABC'
(这种做法也要留心,注意用的是单引号,就我目前的理解,我觉得这里用单双引号应该都可以的,但是书上用的是单引号)
对这条语句的解释:
db:定义的是字节型数据
3:重复的次数
(‘abc’,‘ABC’):重复的是什么
所以上面这条语句的意思就是定义字节型数据,把abcABC重复三遍。
(因此就要注意了,你不能看见db 3,就说人家一定是定义了3个字节)
定义缓冲区时也会用到DUP语句
DAT1 BD 20,?,20 DUP(?)
DAT1是名字
20是要定义的缓冲区的大小
第一个?留给系统数你敲了几下键,也可以不写?,写成0,1或其他任何数都可以。
两个20必须保持一致,不能是20和21这样。
更详细的对dup的解释参加王爽老师汇编语言P171