汇编中的重复指令

  • 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指令的时候,要进行两步操作

  1. cx=cx-1
  2. 判断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

iOS重复指令 重复指令代码_数据


iOS重复指令 重复指令代码_iOS重复指令_02


像这两个图中

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