4

生のマシン コード バイトを 0 と 1 としてテキスト ファイルに書き込み、BIOS を介してそれを実行しようとしています。

ただし、アドレッシング、乗算、オフセット、アドレッシング、オペランド、および命令が組み合わせの配置でどのように機能するか、つまり と の違いを理解するのに問題がMOV AL, 07ありMOV BL, ALます。

つまり、アセンブリでは意味がありますが、マシン コードではパラメーターの概念を理解するのが非常に難しくなります。

だから私が知りたいのはこれです:どうすればこれをよりよく理解できますか?私が見つけたチュートリアルでは、組み合わせ相関の命令からの 0 と 1 を正確に説明/記述しているチュートリアルはありません。

このサイトhttp://ref.x86asm.net/coder32.html#x00で試してみましたが、これがわかりません。

例: 5 を AL に移動したいとします... AL/MOV 命令でチェーンされたバイナリ プレフィックスのオペコードの一部としてバイナリでリテラル '5' を指定しますか、それともそれぞれに 1 つの固定バイナリ コードを使用しますか?命令、値に関係なく?それが私が知りたいことです...機械語がどのように書かれているかを理解する方法。

4

2 に答える 2

5

残念ながら、x86 エンコーディングは複雑で不規則であり、それを理解するのは大変な作業です。エンコーディングの最良の「クイック スタート」は、sandpile.org の一連の HTML ページです (簡潔ですが、かなり詳細です)。

最初: http://sandpile.org/x86/opc_enc.htm - 「命令エンコーディング」テーブルには、命令がコーディングされている数十の方法が示されています。各行の白いセルは、命令の必須バイトを表します。次の灰色のセルは、オペコードの前に現れるさまざまなフィールドに基づいて存在します (または存在しません)。最初の行と同様に、白い「0Fh」で始まる行を確認する必要があります。同じページの下部には、さまざまな「拡張」オペコード フィールドに表示されるビットフィールドがあります。「modrm/sib」行 (最初の行) 以外はすべて無視しています。

最初の行 (1 バイトのオペコード) を除くすべての行で、"mod r/m" バイトがオペコードの後に​​続く必要があることに注意してください (1 バイトのオペコードの場合、命令によって異なります)。これは、ほとんどの 2 引数命令の引数をエンコードします。http://sandpile.org/x86/opc_rm.htmの表には意味があります。引数の 1 つはレジスタでなければならず、もう 1 つの引数はレジスタまたはメモリ インダイレクションです (「reg」フィールドはレジスタをエンコードし、 「mod」および「r/m」フィールドは他の引数をエンコードします)。通常、オペコードの他の場所には、引数の順序を示す「方向」ビットもあります。オペコードは、AL、AX、EAX、RAX (つまり、異なるサイズ)、または拡張レジスタの 1 つなどを操作しているかどうかも示します。

modrm では、「mod」ビットが「11」の場合、「r/m」フィールドもレジスタを参照します。それ以外の場合は、通常、名前付きレジスタを modrm バイトの後に表示される (オプションの) ディスプレースメントに追加することによって構築されたメモリ アドレスを参照します (この定数は、「mod」ビットに応じて 0、1、または 4 バイトの長さになります)。例外は、"r/m" ビットが "100" (つまり 0x4) の場合で、通常は "SP" と呼ばれます。この場合、メモリ引数は、modrm バイトの直後に続く追加の "sib" バイトによって記述されます。 (すべての modrm 変位は sib の後に表示されます)。SIB のエンコーディングについては、http://sandpile.org/x86/opc_sib.htmを参照するか、modrm ページからクリックしてください。

最後に、方向とサイズがどこから来たのかを理解するために、いくつかのオペコードを見てください: http://sandpile.org/x86/opc_1.htm . 最初の 4 つのエントリはすべて「ADD」で、引数は 2 つの異なる順序であり、2 つの異なる幅です。したがって、この場合、命令の下位ビットは方向と幅をエンコードしています。

于 2013-09-15T22:59:26.980 に答える
1

アセンブラのニーモニックとマシン命令の間には (ほとんどの場合) 1 対 1 のマッピングがあります。これらのマッピングは、完全な x86 16、32、および 64 ビットの命令セットを含むIntel Software Developers Manual 、Volume 2 で見つけることができます。おそらく、作成しようとしている翻訳について説明している第 2 章: 命令の形式から始めることをお勧めします。

mov al, 5あなたの言うとおりの場合は、そこにリテラルを置きます。機械語の命令は次のとおりです。

b0 05

それが命令のMOV r8, imm8形式であるためです。MOVの場合、フォームが必要になります。このmov bl, al場合、次MOV r/m8,r8のようにエンコードされます。

88 c3

表 2-2のModR/M Byte を使用した 32 ビット アドレッシング フォームをc3調べると、行と列の交点に表示されます。(16 ビットのテーブルもあり、それが現在のモードである場合 - この場合の値は同じです。)BLAL

于 2013-09-05T21:59:12.410 に答える