2016-04-14 10 views
-1

私は悪名高いx86爆弾である学校でのプロジェクト割り当てを持っています。x86の無意味な小さなコードか?

のmov 0x1cに(ESP%)、%eaxに

と$ 0xFの続く

、%eaxに

:コード内のある時点で、コンパイラは、この命令を行います

次に、%eaxをこの命令で取得した場所に戻します。

のmov%eaxに、0x1cに(%のESP)

は、あなたがそれが何かが自動にコンパイラによって行われていると思いますか、それだけで私を混乱させ、私が把握することが難しくするインストラクターによって行わものですかどうしたの?私が理解していることから、コードのこの部分は絶対に何もしません。スタックから4バイトのワードを取り出し、最後の4ビットを2進数「1111」で使用し、命令をスタック上の同じ位置に戻します。それは私には無意味のようです。何か不足していますか?

+4

これはスタック上の値を変更するので、なぜそれが無意味なのでしょうか? –

+2

'andl $ 0xf、0x1c(%esp)'はいくぶん高速です(3ではなく2つの融合ドメインuops)。周囲のコードは混乱していると思います。なぜなら、それは '-O0'のコンパイラ出力のように見えるからです。古いgccとclang [他の最適化レベルでメモリの宛先を使って 'と'を使う](https://godbolt.org/g/PXhjnI)。 **ロード/変更/ストア、リロード/修正/ストア命令を多量に見ているでしょう。このため、誰も-O0コンパイラ出力を読むことができない**と、-Og -fverbose-asmや-O3 -fno-tree-vectorize出力さえ人間の読みやすさのためにはるかに望ましいという理由があります。 –

+1

'と$ 0xf、%eax'は最後の4ビット*で命令を使用しません。これは '%eax'の内容の最後の4ビット以外のすべてを実際に隠します。 '%eax'の内容は(潜在的に)異なっています。次の命令は '%eax'の新しい値をスタックに戻します。したがって、取り出されたスタック値が最初に '$ 0xA5A5A5A5'だった場合、新しい値は' $ 0x00000005'になります。 – lurker

答えて

1

@lurkerと@RossRidgeへの小道具、命令。

と$ 0xFの、%eaxには、%EAXの内容の最後の4ビット以外の全てをマスクするために使用されます。

関連する問題