testlAT&T アセンブリ構文を使用して、アセンブリ コードで がどのように使用されているかを理解しようとしています。具体的には:
testl %edx, %edx
jle .L3
testl条件フラグを設定するために同じ値をビットごとに実行することは知っていandますが、2 つの値を比較していない場合、「以下の場合はジャンプ」をどのように解釈できますか?
testlAT&T アセンブリ構文を使用して、アセンブリ コードで がどのように使用されているかを理解しようとしています。具体的には:
testl %edx, %edx
jle .L3
testl条件フラグを設定するために同じ値をビットごとに実行することは知っていandますが、2 つの値を比較していない場合、「以下の場合はジャンプ」をどのように解釈できますか?
テストに関する Intel の公式ドキュメントからの抜粋を次に示します。
Operation
TEMP ← SRC1 AND SRC2;
SF ← MSB(TEMP);
IF TEMP = 0
THEN ZF ← 1;
ELSE ZF ← 0;
FI:
PF ← BitwiseXNOR(TEMP[0:7]);
CF ← 0;
OF ← 0;
そしてjleでも同じ:
Jump if less or equal (ZF=1 or SF≠OF)
したがって、 が 0 の場合edx( が 0edx AND edx = edxの場合にのみedx0 でありZF、 の結果ANDが 0 の場合に が 1 に設定されるため) または の最上位ビットedxが 1SF = most significant bitの場合edx AND edx(または、同等に、edx) であり、常にOF0SF ≠ OFですSF ≠ 0。
edxIOW、ジャンプは、符号付き整数として解釈されたときに ≤ 0 の場合にのみ実行されedxます。または、符号なし整数として解釈されたときに 0 または 0x80000000 以上の場合にのみ、ジャンプが実行されます。
TESTL同一の引数(edxおよびなどedx)を使用すると、その引数自体の値に基づいてフラグが設定されます(x AND xはxと同一であるため)。したがって、ここでは破棄されるため、完全に忘れることができます。AND気にする必要があるのは、の値だけですedx。
を使用すると、値がゼロの場合にのみTESTLゼロフラグが1に設定されます。また、オーバーフローフラグを強制的に0にし、上位ビットが設定されている場合にのみ符号フラグを設定します。ZFTESTLOFSF
JLEZFいずれかが1に設定されている場合、またはにジャンプしSF <> OFます。
したがって、次のいずれかの場合にジャンプが実行されます。
edxゼロでした。またedxハイビットが設定されていました。したがって、またはのedx値でジャンプします。00x80000000 - 0xffffffff
ほとんどの場合、これは数値が自然数0x00000001 - 0x7fffffffであることを確認するためのチェックです。ジャンプはある種のエラー処理ルーチンになり、有効な自然数はジャンプなしで続行されます。たとえば、次のようになります。
loop_for_number:
call get_number_into_edx
testl %edx, %edx
jle loop_for_number
; carry on here knowing that edx >= 1
さまざまなジャンプとそれらが使用するフラグの説明については、ここを参照してください。
x86 アセンブリでは、ほとんどすべての条件付きジャンプがフラグに基づいています ( jcxz、jecxz、loopおよびloopne/を除くloopnz)。これは、重要なのはフラグの値だけであることを意味します。
jleと同義jngです。ジャンプ条件はZF = 1 or SF <> OF. Intel x86 JUMP クイック リファレンスを参照してください。
testAF linkを除くすべてのフラグを設定するため、これまでのところすべてが良好に見えます。
このリンクによると、論理演算は常にゼロOFです。つまり、あなたのジャンプは実質的にであることを意味ZF = 1 or SF = 1します。jleedx00x800000000xffffffff