与CMPSB指令混淆(Confused with CMPSB instruction)

2019-09-17 04:32发布

我一直在寻找这个代码,我感到困惑的代表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倍,但它如何比较两个字符串? 例如说是比较“嘿\ 0”和“哎\ 0”,这是环比较4个字符串。 第一字符是不同的,EFLAGS寄存器将被相应地设置。 然而,CMPSB指令重复,下一个字符将是相同的。 我可能是误解如何CMPSB的作品,但它看起来像这样循环不正确地比较两个字符串。 这是否循环其实工作吗?

Answer 1:

究其原因REP的工作原理是,因为代表有同样的编码作为REPE(F3H)。 原则上REPE是在这里使用了正确的事情,但是这取决于你的汇编它可能只是需要REP是正确的。

所以,在现实中,你有一个REPE CMPSB那里,它只是你的(DIS)汇编并不知道。



Answer 2:

我认为你必须使用与CMPSB的REPE或REPNE前缀(它已经有一段时间)。



Answer 3:

你是对的,这个代码将无法正常工作。 您需要使用repe cmpsb (重复而等于比较字符串按字节)。



Answer 4:

从我的理解,因为我经历上brokenthorn相同的教程,它将第一个字节的比较Imagename ,如果他们是相同的脂肪进入的第一个字节。

这将继续下去,直到在第一个差的所有11个字符(文件名和扩展名)。 这将设置ZF标志,如果它们是相同的,而ZF标志将保持清零。

所以,比较完整的文件名后,会再跳到如果他们是相同的加载脂肪条目。 如果不是,它会加载下一个条目和比较,文件名。



文章来源: Confused with CMPSB instruction