Assembly 在下面的示例中理解cmpsb有困难

Assembly 在下面的示例中理解cmpsb有困难,assembly,x86,x86-16,Assembly,X86,X86 16,我正在学习一个关于操作系统的教程,我遇到了下面的代码块,它根据我的变量“ImageName”检查磁盘上的文件名 我的困惑源于rep cmpsb前面的push di行 mov cx, WORD [bpbRootEntries] mov di, 0x0200 .LOOP: push cx mov cx, 0x000B mov si, ImageName push di rep

我正在学习一个关于操作系统的教程,我遇到了下面的代码块,它根据我的变量“ImageName”检查磁盘上的文件名

我的困惑源于
rep cmpsb
前面的
push di

    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

我为
cmpsb
找到的文档说明“对于传统模式,将地址DS:(E)SI处的字节与地址ES:(E)DI处的字节进行比较。相应地设置状态标志。”在调用之前按下
DI
是否意味着我总是与空值进行比较?代码正常工作,因此我显然误解了某些内容,但我能找到的每一份文档都暗示此代码不应该正常工作。

指令
rep cmpsb
会将
di
放在两个字符串不同的位置之后。因为这段代码不关心这个位置(只要两个字符串匹配),所以我们抛出差异所在的位置,然后检查Z标志以查看是否匹配。如果我们不匹配,我们将
di
前进到足够远的地方,以获得下一个文件名,这是一个常量,因为我们将
di
重置回开始的位置。

rep cmpsb指令将
di
指向两个字符串不同的位置。因为这段代码不关心这个位置(只要两个字符串匹配),所以我们抛出差异所在的位置,然后检查Z标志以查看是否匹配。如果我们不匹配,我们将
di
推进到下一个文件名,这是一个常量,因为我们将
di
重置到开始的位置。

push di
di
没有影响。哦,我一直在这个假设下运行了很长时间,哈哈,消除了我所有的困惑,谢谢!我建议在调试器(例如BOCHS)中单步执行,以找出您的假设错误的地方。IDK为什么您认为使用push/pop保存/恢复DI会使其保持“空”,但push并不是这样做的。寄存器不能是“空的”,它们总是有一些值。
push di
di
没有任何影响。哦哦哦哦哦哦,我一直在这个假设下工作,一直到现在为止哈哈,把我所有的困惑都消除了,谢谢!我建议在调试器(例如BOCHS)中单步执行,以找出您的假设错误的地方。IDK为什么您认为使用push/pop保存/恢复DI会使其保持“空”,但push并不是这样做的。寄存器不能为“空”,它们总是有一些值。我不是在比较si和di吗?推寄存器不会清除其值吗?@ouchqt推寄存器只是将其值复制到堆栈以保留它,这样以后就可以用
pop
还原它。啊,我不知道从哪里得到的,但谢谢!我所看到的很多东西都刚刚开始有意义,大多数程序员更愿意看到
repecmpsb
。更好地区别于
REPNE CMPSB
。我不是在比较si和di吗?推寄存器不会清除其值吗?@ouchqt推寄存器只是将其值复制到堆栈以保留它,这样以后就可以用
pop
还原它。啊,我不知道从哪里得到的,但谢谢!我所看到的很多东西都刚刚开始有意义,大多数程序员更愿意看到
repecmpsb
。更好地区别于
REPNE CMPSB