6

私はこのコードを見てきましたが、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 回繰り返すことは理解していますが、これは 2 つの文字列をどのように比較しますか? たとえば、"Hey\0" と "hey\0" を比較していて、このループで 4 つの文字列を比較していたとします。最初の文字が異なり、それに応じて EFlags レジスタが設定されます。ただし、cmpsb命令は繰り返され、次の文字は同じになります。cmpsbの仕組みを誤解しているかもしれませんが、このループは 2 つの文字列を正しく比較していないようです。このループは実際に機能しますか?

4

3 に答える 3

14

REP が機能する理由は、rep が REPE (F3h) と同じエンコーディングを持っているためです。原則として、ここでは REPE を使用するのが適切ですが、アセンブラーによっては REP が正しいと見なされる場合があります。

したがって、実際にはそこに REPE cmpsb があります。それは、(逆) アセンブラーが本当に知らないということです。

于 2012-05-11T14:15:05.470 に答える
1

私はあなたがcmpsbでREPEまたはREPNEプレフィックスを使用しなければならないと思います(それは久しぶりです)。

于 2012-05-11T14:06:52.033 に答える