汇编中的重复指令

    科技2022-07-15  122

    汇编中的重复指令

    REPLOOPREP和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

    Processed: 0.012, SQL: 8