5

一連のx86命令を分析していて、次のコードと混同してしまいました。

135328495: sbb edx, edx
135328497: neg edx
135328499: test edx, edx
135328503: jz 0x810f31c

sbbが に等しいdes = des - (src + CF)、つまり に何らかの形で最初に入れ-CFられた命令であることを理解していedxます。それからnegtive -CFCFそしてゼロに等しいtestかどうか??CF

ただし、jzチェック フラグZFではなくCF! では、基本的に上記のコード シーケンスは何をしようとしているのでしょうか。これは、バージョンx86によって生成される正当な命令シーケンスです。g++4.6.3

C++コードは実際にはbotanプロジェクトからのものです。全体的なアセンブリ コード (Botan RSA 復号化の例) は、こちらにあります。逆アセンブルされたコードには、このような命令シーケンスが非常に多くあります。

4

2 に答える 2

4

sbb は des = des - (src + CF) に等しい、つまり、最初の命令でどうにかして -CF を edx に入れたことを理解しています。

はいedx = edx - (edx + CF) = -CF。したがって、CF=0 の場合は に、CF=1 の場合は( ) にsbb edx,edx設定さedxれます。また、減算自体が新しい CF 値になります。これは、あまり混乱していなければ、古いものと同じです。0-10xFFFFFFFF

次に、負の -CF を CF に変換し、CF がゼロに等しいかどうかをテストしますか??

ほとんどはい、いいえ。edxCF ではなくを否定します。CF を無効にするには、別の命令がありますCMC(stc/clc/cmcキャリー フラグ変更命令ファミリから)。

したがって、0/-1 から edx は 0/1 に変更され、CF は再び 0/1 に設定されます (うわー、neg が CF を ~ZF に設定することを知りませんでした)。また、negすでに ZF を設定しているため、以下test edx,edxは冗長です。

test edx,edxは CF をテストしませんが、edx (この時点0または1) をテストし、0/1 の値で CF=0 と ZF=1/0 を生成します。

数値edxが CF に由来するという事実に固執して考えを逸らし、CF について考え続けましたが、実際には最初からsbb古い CF を忘れることができますsbb。独自の方法で CF を変更します。しかし、これらのneg/test命令はedxレジスタ内の数値に焦点を当てており、CF は計算の副産物にすぎません。

ただし、jz は CF ではなくフラグ ZF をチェックすることに注意してください。

0実際、CF にはlast の後にが含まれているtestため、 の前の初期 CF 値とはまったく関係ありませんsbb。一方、ZF は元の CF 値に直接関連しており、コードが CF=1 で開始された場合、最後のコードjzは取得されず (ZF=0)、コードが CF= で開始された場合0、最後jzが取得されます (ZF=1)。

于 2016-12-08T11:15:09.617 に答える