【问题标题】:Confused with CMPSB instruction与 CMPSB 指令混淆
【发布时间】:2012-05-20 02:56:01
【问题描述】:

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

【问题讨论】:

  • 嗯,你为什么没有在 CPU 手册中看到 CMPSB 的工作原理?
  • 嗯 @Alex 我做到了。混乱是由于 REP 指令造成的。
  • REP 不是它自己的指令。它是一个指令前缀,IOW 指令修饰符。文档也解释了它。

标签: assembly nasm bootloader 16-bit osdev


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 没错,你可以使用repe(相等时重复)或repne(不相等时重复)。
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-18
      • 1970-01-01
      • 2018-04-17
      • 2015-04-09
      相关资源
      最近更新 更多