2017-06-19 3 views
4

私はアセンブリの次の行は何をすべきかを理解悩み抱えている:私は、デバッグ後に理解repz cmpsbの後に、アセンブリ命令 'seta'と 'setb'は何をしますか?

0x401810: repz cmps BYTE PTR ds:[rsi],BYTE PTR es:[rdi] 
0x401812: seta dl 
0x401815: setb al 

を、最初の命令は、レジスタrsirdi、バイト単位でのバイトを比較します。

次に、その命令に基づいて、rdxraxの下位バイトを設定します。

この命令をオンラインで調べると、setaは、その下位のバイトを0x01に設定します。それ以外の場合は0x00に設定します。 setbと同様、バイトを0x01に設定します。

私の質問はどのような価値であり、それは上記の命令にどのように関係していますか?

+3

は 'setCC'は、フラグビットを調べ= CF、それは彼らが設定されてしまったか気にしません。'cmps'はフラグビットを設定します。それがつながりです。 – Jester

答えて

8

cmps instructionは、[rsi][rdi]を比較します。 repz prefixは(交互repeをスペル)rsirdi次いで限り等しい比較[rsi]よう[rdi]cmpsを繰り返しインクリメントすることを意味します。 rflagsレジスタは各反復で設定されます。 [rsi][rdi]の最終反復は、seta(上記の場合に設定)とsetb(以下の場合に設定)によって使用されるものです。言い換えれば

、これらの3つの命令に対するCの擬似コードは次のようになります。

// Initial values 
uint8_t *rsi = (...); 
uint8_t *rdi = (...); 
uint64_t rcx = (...); 

// repz cmps BYTE PTR [rsi], BYTE PTR [rdi] 
while (*rsi == *rdi && rcx > 0) { 
    rsi++; 
    rdi++; 
    rcx--; 
} 

uint8_t dl = *rsi > *rdi; // seta dl 
uint8_t al = *rsi < *rdi; // setb al 

setCC指示hereのすべてのドキュメントを参照してください。

+0

'seta'と' setb'はどこに入っていますか? –

+0

最後の2行の@Varunリアー – fuz

+0

'dl'と' al'を設定するときのポインタを比較していますか?レジスタ自体の値ではありませんか? –

5

命令ニーモニックは、次のとおり

  • repz cmps ds:[esi], es:[edi]
    は 上記フラグが設定されている場合、文字列が1に等しい
  • seta dl
    セットdlを比較しながら、文字列の比較、または0にDLならない
  • setb al
    以下のフラグが設定されている場合はalを1に設定し、そうでない場合は0に設定します。

repzは、ゼロフラグのチェックに加えて、ecxレジスタを使用して最大繰り返し回数を指定します。 (ecxカウンタレジスタとも呼ばれる。)として正しく以下道化師が指摘

[EDIT]、およびフラグの下、上および下でない上存在しないCPUステータスフラグのビット演算の結果である:

CF = 0とZF = 0以下
  • :上記
  • +0

    上記のフラグとその下のフラグはeflagsレジスタの一部ですか? –

    +0

    フラグはcmps操作で設定/リセットされます。 –

    +0

    これらの操作を読めば、これはstrncmp()または類似の操作のように見えます。 –

    関連する問題