2017-04-08 14 views
0

私はアセンブラを学んでおり、デバッガ、特にマークされた部分のコードを理解する助けが必要です。8086アセンブラデバッガの理解

mov  ax, a 
mov  bx, 4 

は、私がどのように動作するかを上記の手順を知っているが、デバッガで、私は「2EA10301」と「BB0400」を持っています。

何を意味しますか?
最初の命令は変数aをデータ・セグメントからレジスタに移動しますが、デバッガではcs:[0103]です。

これらの括弧と数字はどういう意味ですか?任意の助け

enter image description here

感謝。

+0

最初に、私はそれが "** 2 ** EA10301"と考えており、それは16進数です。 – Carcigenicate

答えて

5

2EA10301およびBB0400の数字は、強調表示された2つの命令のopcodesです。

2ECode Segment (CS) prefixであり、CPUにCSセグメントのデフォルトのDSの代わりにアクセスするように指示します。
A1は、MOV AX, moffs16のオペコードであり、0301little endianの即時0103hであり、読み出すアドレスです。
したがって2EA10301mov ax, cs:[103h]です。
角括弧はmemory access through one the addressing modeを示す好ましい方法ですが、一部のアセンブラでは角括弧なしの混乱した構文をサポートしています。
このシンタックスはあいまいで、異なるアセンブラ間で標準化されていないため、お勧めできません。

アセンブラでは、発行された各バイトごとに位置カウンタがインクリメントされます(各 "セクション" /セグメントには独自のカウンタがあります。つまり、カウンタは各 "section"の先頭でリセットされます)。
これは、各変数にアクセスするために使用されるオフセットと命令を作成するためのオフセットを与えます。変数名は人間のものであり、CPUはアドレスや数値からのみ読み取ることができます。

このオフセットは、ファイルがロードされると、後でメモリに書き込まれます。
アセンブラとリンカとローダは協力してthere are various tricks at playを実行し、最後の命令がメモリに正しく形成され、オフセットが正しいアドレスに変換されていることを確認します。
あなたの例では、その努力は値103h、つまりメモリ内のaのアドレスに達します。
また、あなたの例では、ファイルがCOMの場合(オフセットは実行フローに変数を入れないでください)、オフセットはCOMファイルの特有の構造のために103hです。
しかし、一般に、別の番号であった可能性があります。

BBは、BXMOV r16, imm16です。基本形式はB8であり、下位3ビットは使用するレジスタを示し、BXは3(011bは2進数)、実際は0B8h + 3 = 0BBhの値で表されます。
オペコードの後に​​、WORD直後0400がリトルエンディアンで4をエンコードします。


あなたは今、アセンブラは、シンタックスシュガーのいくつかのフォームを実装するようアセンブリソースは、常に完全な情報ではないことを実現する立場にあります。
axaのアドレスによって与えられる定数及び組立時に既知即時値を、移動された技術的構文でmov bx, 4と同じ命令mov ax, a、代わり移動コンテンツとして解釈されますaは、aが変数であることが知られているため、メモリに存在し、メモリアクセスのみで読み取り可能な値で、axになります。

この現象は、CISCであり、一般的に必要な命令の欠如がpseudo-instructionsで補われているRISCの世界ではより広範になります。

2

まず、アセンブラはx86アセンブリです。アセンブラは、命令を機械コードに変換するものです。

プログラムを逆アセンブルするときには、おそらく16進数値(90はNOP命令、B8は何かをAXに移動するなど)を使用します。

角カッコは、レジスタが指すメモリアドレスをコピーします。 側面の16進数はアドレスと呼ばれます。

関連する問題