在以下示例中无法理解cmpsb

1 x86 assembly x86-16

我正在关注有关操作系统的教程,并且遇到了以下块代码,该块代码根据变量“ ImageName”检查磁盘上的文件名。

我的困惑源于push di前一行rep cmpsb

    mov       cx, WORD [bpbRootEntries]
    mov       di, 0x0200
.LOOP:
    push      cx
    mov       cx, 0x000B
    mov       si, ImageName
    push      di
    rep  cmpsb
    pop       di
    je        LOAD_FAT
    pop       cx
    add       di, 0x0020
    loop      .LOOP
    jmp       FAILURE
Run Code Online (Sandbox Code Playgroud)

我找到的cmpsb状态文档“对于传统模式,将地址DS:(E)SI上的字节与地址ES:(E)DI上的字节进行比较。状态标志会相应地设置。” di在此调用之前推送不意味着我总是要与一个空值进行比较吗?该代码有效,因此我显然会误解某些东西,但是我能找到的每篇文档都暗示该代码不起作用。

120*_*arm 5

rep cmpsb指令将di在两个字符串不同的位置之后留下指向。由于此代码并不关心该位置(只是两个字符串是否匹配),我们将差值扔在哪里,仅检查Z标志以查看是否匹配。如果不匹配,则前进di到下一个文件名,该文件名是一个常量,因为我们重置di回开始的位置。

  • 大多数程序员都希望看到“ REPE CMPSB”。与“ REPNE CMPSB”更好的区别。 (3认同)