8

(x86)アセンブリの短い部分があり、それが何をするのかを理解しようとしています。

...
 6:     81 ec 00 01 00 00       sub    $0x100, %esp
 c:     31 c9                   xor    %ecx  , %ecx
 e:     88 0c 0c                mov    %cl   , (%esp, %ecx, 1)
11:     fe c1                   inc    %cl
13:     75 f9                   jne    0xe
....

「JNE」がfalseと評価されるまで、つまりゼロフラグ= 0になるまで、ループしているように見えます(おそらく、数値1、2、3 ...をスタックに入れますか??)

アセンブリに関する私の短い調査(これは初めてです)から、比較操作(CMP)を実行してゼロフラグを設定したことがわかりますが、比較操作が表示されません。

では、どのような条件下でこのループから抜け出すのでしょうか?

4

4 に答える 4

12

inccl増分後の値がゼロの場合、ZFを設定します。あなたのループはこれを行っています:

sub    $0x100, %esp            // unsigned char array[256];
xor    %ecx  , %ecx            // unsigned char cl = 0;
mov    %cl   , (%esp, %ecx, 1) // e: array[cl] = cl;
inc    %cl                     //    cl += 1;
jne    0xe                     //    if (cl != 0) goto e;

clが255からインクリメントされ、0にラップアラウンドすると、ループは終了し、ZFが設定されます。

于 2011-12-06T17:01:00.823 に答える
8

などの算術演算add, sub, inc, dec, sar, salだけでなく、などのビット演算もtest, shl, shr, or, and, xor, negZFを変更します。

于 2011-12-06T18:39:41.837 に答える
2

incやdecなどの数学演算でもゼロフラグを設定できます。

于 2011-12-06T16:50:53.570 に答える
1

または、最初に、フラグをスタックに保存[プッシュ]し、スタックをレジスタに[ポップ]取得し、レジスタに目的のビットを指定して算術演算子または演算子を使用し、レジスタをプッシュしてフラグをポップします。

このようなもの。

pushf
pop ax
or ax, 0x100 [this will set trap flag, you can get the value for any flag or flags you want]
push ax
popf
于 2012-02-25T20:38:04.517 に答える