混淆于CMPSB指令

7

我一直在看这段代码,对于rep cmpsb这行有些困惑。

.LOOP:
      push    cx
      mov     cx, 0x000B                            ; eleven character name
      mov     si, ImageName                         ; image name to find
      push    di
 rep  cmpsb                                         ; test for entry match
      pop     di
      je      LOAD_FAT
      pop     cx
      add     di, 0x0020                            ; queue next directory entry
      loop    .LOOP
      jmp     FAILURE

我知道它会重复执行cmpsb指令cx次,但是它是如何比较两个字符串的呢?举个例子,如果比较的是"Hey\0"和"hey\0"这两个4个字符的字符串。第一个字符不同,所以EFlags寄存器会相应地被设置。但是,cmpsb指令会被重复执行,接下来的字符将会是相同的。我可能误解了cmpsb的工作原理,但是看起来这个循环并没有正确比较两个字符串。这个循环是否实际上能够工作呢?

1
嗯,为什么不查看CPU手册中的CMPSB是如何工作的呢? - Alexey Frunze
嗯,@Alex,我已经做了。混淆是由于REP指令引起的。 - Hudson Worden
1
REP不是一条独立的指令。它是一种指令前缀,即指令修饰符。文档也有解释。 - Alexey Frunze
3个回答

15

REP 能够工作的原因是 REP 和 REPE (F3h) 具有相同的编码。原则上,在此处应该使用 REPE,但是根据您的汇编器,它可能会将 REP 视为正确的指令。

因此,在实际情况中,您有一个 REPE cmpsb 指令,只是您的(反)汇编器并不真正知道它。


1

我认为你需要在cmpsb前使用REPE或REPNE前缀(已经有一段时间了)。


没错,你可以使用 repe(重复直到相等)或 repne(重复直到不相等)。 - Stephen Canon

0
据我理解,因为我正在按照brokenthorn上的同一教程进行操作,它将比较Imagename的第一个字节和fat条目的第一个字节是否相同。
它将继续比较直到所有11个字符(文件名和扩展名)在第一个不同处。如果它们相同,它将设置ZF标志,并且ZF标志将保持清除状态。
因此,在比较整个文件名之后,它将跳转到加载该fat条目(如果它们相同)。如果不是,则会加载下一个条目并比较该文件名。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接