我一直在查看此代码,我对 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 的工作方式,但看起来这个循环没有正确地比较两个字符串。这循环事实上是否有效?
答案 0 :(得分:12)
REP工作的原因是因为rep与REPE(F3h)具有相同的编码。原则上REPE在这里使用是正确的,但是根据你的汇编程序,它可能只是将REP视为正确。
所以实际上你有一个REPE cmpsb,只是你的(dis)汇编程序并不真正知道。
答案 1 :(得分:1)
我认为你必须使用带有cmpsb的REPE或REPNE前缀(已经有一段时间了。)
答案 2 :(得分:1)
你是对的,这段代码不起作用。您需要使用repe cmpsb
(按字节顺序比较字符串重复)。
答案 3 :(得分:0)
根据我的理解,因为我正在阅读关于breaknthorn的相同教程,它会将<div [ngStyle]="{'width': width +'%'}">
的第一个字节与fat条目的第一个字节进行比较,如果它们是相同的。
它将一直持续到所有11个字符(文件名和扩展名)处于第一个区别。如果它们相同,它将设置ZF标志,并且ZF标志将保持清零。
因此,在比较整个文件名之后,如果它们相同,它将跳转到加载该胖条目。如果没有,它将加载下一个条目并比较该文件名。