アセンブリ言語-------- WangShuang第5章

[BX]

[BX]と[0]はやや似ています。[0]はオフセットアドレスが0でセグメントアドレスがDSレジスタにあることを意味し、[BX]はオフセットアドレスがBXレジスタの内容であり、セグメントがアドレスもDSレジスタにあります。以下の説明の便宜上、レジスタまたはメモリユニットの内容を表す記号()を定義します。たとえば、レジ​​スタaxの内容を表す(ax)を定義します。
incレジスタ命令は、レジスタの内容を1つ増やすことです。たとえば、inc bxは、bxレジスタの内容を1つ増やすことです。

LOOP命令

ループ命令の形式は次のとおりです。ループラベル。CPUがループ命令を実行するときは、次の2つの操作が必要です。

  1. (cx)=(cx)-1
  2. cxの値がビジーかゼロでないかを判断すると、番号の付いた場所に移動してプログラムを実行し、ゼロの場合はダウンして実行します。
    注意する必要があるのは、サイクル数がcxレジスタに格納されていることです。
    ループ関数を実現するためにcxおよびloop命令を使用するフレームワークは次のとおりです。
         mov cx,循环次数
	s:
		循环执行的程序段
		loop s

次の3つのルールを要約できます。ループ
数をcxに格納するため
に、ループ命令のラベルで示されるアドレスは、ループする前の
プログラムセグメントにあり、ラベルとループの中央に書き込む必要があります。命令。

アセンブリソースプログラムには、特別な注意が必要な別のポイントがあります。データを文字で始めることはできません、ffffhなどは0fffffhとしてのみ記述できます。
デバッグモードでループの実行を追跡すると、デバッグモードではループマークがアドレスになることがわかります。cxが0でないという条件が満たされているかどうかを判断した後、満たされている場合は、ipレジスタの値ループマークのアドレス値で表されるオフセットに変更され、ジャンプが完了します。
デバッグモードでは、コマンドに直接ジャンプして実行する場合は、gオフセットアドレスを直接使用してコマンドを完了することができます。たとえば、g 0012は、cs:0012より前のコマンドが完了したことを示します。ループを数回観察して論理が正しいと考える場合は、pコマンドを使用して一度にループ命令を直接実行できます。または、gオフセットアドレス方式を直接使用して、ループの実行後にアセンブリ命令にジャンプします。

デバッグおよびアセンブリコンパイラmasmによる命令のさまざまな処理に特に注意してください

デバッグでも同様の命令を記述しました。movax
、[0]
これはデバッグでaxに送信されるオフセットアドレス0の値と見なされ、masmコンパイラは値0をのaxレジスタに送信すると見なします。
したがって、統一された効果を実現したい場合は、転送レジスタに値を入力できます。たとえば、最初に0をbxに送信し、次にmov ax、[bx]を使用して、デバッグモードのmov ax、[と同じ効果を実現します。 0]。これはもっと面倒です。別の方法を変更して、支出セグメントのアドレスとオフセットアドレスを表示して完了することもできます。たとえば、mov al、ds、[0]。

セグメントプレフィックス

mov ax、ss:[0]の形式で、これらはメモリユニットにアクセスする命令に表示され、メモリユニットのセグメントアドレスを明示的に示すために使用されます。「ds:」は、アセンブリ言語ではセグメントプレフィックスと呼ばれます。

安全な空間

8086モードでは、メモリスペースのセクションにコンテンツを自由に書き込むことは非常に危険です。これは、スペースのこのセクションに重要なシステムデータまたはコードが格納される可能性があるためです。一般に、DOSおよびその他の正当なプログラムは、通常、0:200〜0:2ffスペースを使用しません。

おすすめ

転載: blog.csdn.net/weixin_47617598/article/details/115031338