次の Intel x86 命令はオペコード 0x31:xor <r/m32>,<r32>
です。命令の実際のマシン コードでは、0x31 の後に、使用されるレジスタまたはメモリ アドレスを表す別の 16 進数値が続きます。私の質問は次のとおりです。
- XOR できる可能性のあるレジスタを参照する 16 進数コードは何ですか?
- 使用できるレジスタとメモリ引数の組み合わせの数が与えられた場合、この命令が作成できる可能性のあるマシン コードの制約は何ですか?
インテル® プロセッサーのオペコードの詳細については、インテル® 64 および IA-32 アーキテクチャー ソフトウェア開発者マニュアルを参照してください。このXOR
命令は、Volume 2B: Instruction Set Reference, MZ の 682 ページです。
第二部に答える。
スタック ポインタを自由に変更したくありませんESP
。破損すると、コードがクラッシュまたはハングします。
同様に、命令が使用するアドレスはすべて、割り当てられた書き込み可能なメモリに対応している必要があります。物理メモリによってマップされていない、または読み取り専用のメモリ位置にアクセスしようとしているが、そこに書き込んでいる場合、コードはクラッシュします。
したがって、ベース レジスタとインデックス レジスタ、変位、およびインデックス レジスタの乗数を監視する必要があります。組み合わせて、読み取り/書き込みを行うメモリアドレスを形成すると、アクセス可能なメモリがあることがわかっている場所を指す必要があります。
通常、何かをスタックにプッシュするか、デクリメントすることにより、必要に応じてスタックにメモリを割り当てることができますESP
。
プログラムのコードメモリにアクセスする必要がある場合は、それらが読み取り専用であることを確認してください。コードメモリは通常読み取り専用です。
何かを実行する必要がある場合、それは既存のプログラムのコードか、実行可能メモリにあるコードでなければなりません。デフォルトでは、プログラムのコードではないすべてのメモリが実行可能ではないことを期待してください。ただし、Windows と Linux には、メモリ領域のメモリ保護を変更し、実行可能または書き込み可能にする特別な機能があります。