6

我一直在看这段代码,我对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 的工作原理,但看起来这个循环没有正确比较两个字符串。这个循环真的有效吗?

4

3 回答 3

14

REP 起作用的原因是 rep 与 REPE (F3h) 具有相同的编码。原则上 REPE 在这里使用是正确的,但根据您的汇编程序,它可能只是将 REP 视为正确的。

所以实际上你在那里有一个 REPE cmpsb,只是你的(反)汇编程序并不知道。

于 2012-05-11T14:15:05.470 回答
1

我认为您必须在 cmpsb 中使用 REPE 或 REPNE 前缀(已经有一段时间了)。

于 2012-05-11T14:06:52.033 回答
0

据我了解,由于我正在阅读有关 brokenthorn 的相同教程,因此Imagename如果它们相同,它将比较 的第一个字节与 fat 条目的第一个字节。

它将一直持续到第一个差异处的所有 11 个字符(文件名和扩展名)。如果它们相同,它将设置 ZF 标志,并且 ZF 标志将保持清零。

因此,在比较整个文件名之后,如果它们相同,它将跳转到加载该胖条目。如果不是,它将加载下一个条目并比较该文件名。

于 2017-01-24T02:15:37.903 回答