2EA10301
およびBB0400
の数字は、強調表示された2つの命令のopcodesです。
2E
はCode Segment (CS) prefixであり、CPUにCS
セグメントのデフォルトのDS
の代わりにアクセスするように指示します。
A1
は、MOV AX, moffs16
のオペコードであり、0301
はlittle endianの即時0103hであり、読み出すアドレスです。
したがって2EA10301
はmov ax, cs:[103h]
です。
角括弧はmemory access through one the addressing modeを示す好ましい方法ですが、一部のアセンブラでは角括弧なしの混乱した構文をサポートしています。
このシンタックスはあいまいで、異なるアセンブラ間で標準化されていないため、お勧めできません。
アセンブラでは、発行された各バイトごとに位置カウンタがインクリメントされます(各 "セクション" /セグメントには独自のカウンタがあります。つまり、カウンタは各 "section"の先頭でリセットされます)。
これは、各変数にアクセスするために使用されるオフセットと命令を作成するためのオフセットを与えます。変数名は人間のものであり、CPUはアドレスや数値からのみ読み取ることができます。
このオフセットは、ファイルがロードされると、後でメモリに書き込まれます。
アセンブラとリンカとローダは協力してthere are various tricks at playを実行し、最後の命令がメモリに正しく形成され、オフセットが正しいアドレスに変換されていることを確認します。
あなたの例では、その努力は値103h、つまりメモリ内のa
のアドレスに達します。
また、あなたの例では、ファイルがCOMの場合(オフセットは実行フローに変数を入れないでください)、オフセットはCOMファイルの特有の構造のために103hです。
しかし、一般に、別の番号であった可能性があります。
BB
は、BX
のMOV r16, imm16
です。基本形式はB8
であり、下位3ビットは使用するレジスタを示し、BX
は3(011bは2進数)、実際は0B8h + 3 = 0BBhの値で表されます。
オペコードの後に、WORD直後0400
がリトルエンディアンで4をエンコードします。
あなたは今、アセンブラは、シンタックスシュガーのいくつかのフォームを実装するようアセンブリソースは、常に完全な情報ではないことを実現する立場にあります。
ax
にa
のアドレスによって与えられる定数及び組立時に既知即時値を、移動された技術的構文でmov bx, 4
と同じ命令mov ax, a
、代わり移動コンテンツとして解釈されますのa
は、a
が変数であることが知られているため、メモリに存在し、メモリアクセスのみで読み取り可能な値で、ax
になります。
この現象は、CISCであり、一般的に必要な命令の欠如がpseudo-instructionsで補われているRISCの世界ではより広範になります。
最初に、私はそれが "** 2 ** EA10301"と考えており、それは16進数です。 – Carcigenicate