对CMPSB指令感到困惑

时间:2012-05-11 13:43:50

标签: assembly nasm bootloader 16-bit osdev

我一直在查看此代码,我对 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 的工作方式,但看起来这个循环没有正确地比较两个字符串。这循环事实上是否有效?

4 个答案:

答案 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标志将保持清零。

因此,在比较整个文件名之后,如果它们相同,它将跳转到加载该胖条目。如果没有,它将加载下一个条目并比较该文件名。