13

noplx86 の命令がオペランドを取るのはなぜですか? いや、何もしないでください。

nopl   0x0(%rax)
4

2 に答える 2

9

多くのプロセッサのバイナリ命令セットには、機能的に同一の命令を表す複数の方法があります。たとえば、元の ARM 命令セットには、R0 に0 ~ 255 の値で、0 ~ 24 の偶数である形式の任意の値をロードする命令が含まれています。R0 に値 256 をロードしたい場合はb << n、でロードする命令をロードするか、 、、またはの命令を使用できます。これらの異なる値をロードする命令は、4 つの命令すべてが同じ効果を持っていても、すべて異なるバイナリ エンコーディングを持っています。bn1<<84<<616<<464<<2

一部のコンパイラのアセンブラは、コードの一部が使用する必要がある、一見同一の命令のどれを要求する手段を提供するために邪魔をしません。これは通常は重要ではありませんが、コード内で特定のバイト値を使用することを避けることが望ましい場合や、コード内の特定のバイトへの変更が特定の効果を持つ必要がある場合があります。たとえば、前述の ARM 命令の 8 ビットは、 の値を指定するために使用されますbbコードが上記の命令の 1 つの部分を値 12 で上書きした場合、R0 にロードされる値は、元の 4 つの命令のどれが使用されたかによって異なります。0x0C00、0x0300、0x00C0、または 0x0030 の可能性があります。

8x86 用のアセンブラは一般に、可能なすべての命令コーディングを明示的に区別することはできませんが、命令内にどのバイト値を含める必要があるかを指定できることが役立つ場合があります。たとえば、例外を処理する 1 つのアプローチは、例外が発生したときに、戻りアドレスの命令が特定の形式の NOP であるかどうかを定期的にチェックし、そうである場合はそのオペランドをデータ構造のアドレスとして解釈することです。例外関連の情報を保持します。実際には、例外をサポートするほとんどの 8x86 言語は例外を処理する他の手段を使用しますが、前述の方法では、長い NOP を取得して実行するのに必要な時間だけ、通常の関数の戻りが遅くなります。

于 2013-06-10T19:17:00.817 に答える