testl
AT&T アセンブリ構文を使用して、アセンブリ コードで がどのように使用されているかを理解しようとしています。具体的には:
testl %edx, %edx
jle .L3
testl
条件フラグを設定するために同じ値をビットごとに実行することは知っていand
ますが、2 つの値を比較していない場合、「以下の場合はジャンプ」をどのように解釈できますか?
testl
AT&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
の場合にのみedx
0 でありZF
、 の結果AND
が 0 の場合に が 1 に設定されるため) または の最上位ビットedx
が 1SF = most significant bit
の場合edx AND edx
(または、同等に、edx
) であり、常にOF
0SF ≠ OF
ですSF ≠ 0
。
edx
IOW、ジャンプは、符号付き整数として解釈されたときに ≤ 0 の場合にのみ実行されedx
ます。または、符号なし整数として解釈されたときに 0 または 0x80000000 以上の場合にのみ、ジャンプが実行されます。
TESTL
同一の引数(edx
およびなどedx
)を使用すると、その引数自体の値に基づいてフラグが設定されます(x AND xはxと同一であるため)。したがって、ここでは破棄されるため、完全に忘れることができます。AND
気にする必要があるのは、の値だけですedx
。
を使用すると、値がゼロの場合にのみTESTL
ゼロフラグが1に設定されます。また、オーバーフローフラグを強制的に0にし、上位ビットが設定されている場合にのみ符号フラグを設定します。ZF
TESTL
OF
SF
JLE
ZF
いずれかが1に設定されている場合、またはにジャンプしSF <> OF
ます。
したがって、次のいずれかの場合にジャンプが実行されます。
edx
ゼロでした。またedx
ハイビットが設定されていました。したがって、またはのedx
値でジャンプします。0
0x80000000 - 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 クイック リファレンスを参照してください。
test
AF
linkを除くすべてのフラグを設定するため、これまでのところすべてが良好に見えます。
このリンクによると、論理演算は常にゼロOF
です。つまり、あなたのジャンプは実質的にであることを意味ZF = 1 or SF = 1
します。jle
edx
0
0x80000000
0xffffffff