4

いくつかのアセンブリを調べていると、ラインが見えます

CMP ECX, ECX

A==A が常に真であるとは限らないので、これは私には意味がありません。(再帰性)

これが役立つかどうかはわかりませんが、次のコンテキストで使用されます。

CPU Disasm
Address   Hex dump          Command                                         Comments
00414A24  |.  39C9          CMP ECX,ECX
00414A26  |.  F3:A6         REPE CMPS BYTE PTR DS:[ESI],BYTE PTR ES:[EDI]
00414A28  |.  0F92C0        SETB AL
00414A2B  |.  0F97C2        SETA DL
00414A2E  |.  28C2          SUB DL,AL
00414A30  |.  0FBEC2        MOVSX EAX,DL
4

2 に答える 2

2

ECX レジスタがゼロの場合は、repe cmpsbまったく実行されません。これは、次setbseta手順でガベージが生成されることを意味します。

したがって、プログラマーは、フラグが定義された状態を持っていることを確認することを選択しました。この場合cmp ecx,ecx、CarryFlag=0 および ZeroFlag=1 になります。setbAL をゼロsetaにし、DL をゼロにします。

@ user35443repe cmpsbは事前に ECX をデクリメントしません。繰り返しは ECX がゼロかどうかをチェックしますが、それ以外の場合はポスト デクリメントします。

@Hans Passantrepe cmpsbでは、Z フラグや方向フラグ以外のフラグを初期化する必要はありません。

于 2014-07-13T15:23:59.573 に答える
1

@ user3144770 が言うように... は(とりわけ)CMP ECX, ECXクリアCFします。これは、カウントがゼロで始まる場合、フラグに影響を与えないことを含め、まったく何もしないためです。ZFREPE CMPS ...

Intel Programmer's Reference には、REP/REPE/etc について次のように記載されています。

WHILE CountReg ≠ 0
  DO
    Service pending interrupts (if any);
    Execute associated string instruction;
    CountReg ← (CountReg – 1);
    IF CountReg = 0
      THEN exit WHILE loop; FI;
    IF (Repeat prefix is REPZ or REPE) and (ZF = 0)
    or (Repeat prefix is REPNZ or REPNE) and (ZF = 1)
      THEN exit WHILE loop; FI;
  OD;

疑念を避けるために:

  1. ECXinの選択にCMP ECX, ECXは意味がありません...CMP EDX, EDX同様にうまくいき、これがカウントを心配しているという示唆を避けてください!

  2. フラグを準備する必要はありません...したがって、準備が必要ない場合。ZFREPEECX != 0

  3. フラグは、前に好きなように設定できますREPE...設定されているものに関係なく、保持されECX == 0、最後に行われたものに置き換えられCMPSます。

于 2014-07-14T10:10:31.047 に答える