我正在关注有关操作系统的教程,并且遇到了以下块代码,该块代码根据变量“ 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在此调用之前推送不意味着我总是要与一个空值进行比较吗?该代码有效,因此我显然会误解某些东西,但是我能找到的每篇文档都暗示该代码不起作用。
该rep cmpsb指令将di在两个字符串不同的位置之后留下指向。由于此代码并不关心该位置(只是两个字符串是否匹配),我们将差值扔在哪里,仅检查Z标志以查看是否匹配。如果不匹配,则前进di到下一个文件名,该文件名是一个常量,因为我们重置di回开始的位置。