警告:私は人生で8086アセンブリを書いたことがありませんが、これは私が作ったものです。
MOV AX,@DATA
実行されるコードの最初の行です。@DATAは、データセグメントが存在するメモリ内の場所の値を保持する変数であると思います。@DATAのメモリ位置をAXレジスタ(16ビットレジスタ)に移動します。ここで注意すべきことの1つは、DATAという単語の前にある@です。これは、@ DATAがリンクプロセス中に評価され、実際の値に置き換えられるためだと思います。他の例では、最初に実際のメモリ位置を参照しているため、@が前に付いていないことに注意してください。
MOV DS,AX
次に、そのメモリ位置DS
を8086アセンブリの標準変数(この場合はレジスタ)である変数として設定します。値を保持するストレージの場所(C ++の用語に精通している場合はヒープ)を常に指す必要があります。
AXレジスタは、値をロードして実行コマンドを実行できる一時的なプレースホルダーです。
MOVE AH, ??H
まず、AHはAXレジスタの「ハイ」側を指します。この兄弟は、AXレジスタの「ロー」側を指すALになります。これは、16ビットではなく8ビットに対してコマンドを実行する場合に使用されます。この2番目の部分である??Hは、AHレジスタに格納する値です。最後のHは「16進数」を意味します。したがって、00Hがある場合、それはゼロ(16進数)を意味します。FFHを入力すると、10進数システムの255と同じになります。
最初の質問「DATASEGMENTの下のコードはこのコードでいつ実行されますか?」に戻ります。--DATASEGMENTがいつ実行されるかを尋ねていると思います。これは、コードセグメントで使用するデータ(変数)を格納することになっているため、通常は実行しないでください。一部のオペレーティングシステムでは、これを回避でき、コードのそのセクションにジャンプまたはブランチして、通常のコードセグメントとして扱うことができます。これは、スタックオーバーフロー、ヒープオーバーフロー、(ハッキング)などがすべて機能する方法である場合があります。