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

メモリ内のワードストレージ

CPUでは、16ビットメモリを使用してワードを格納します。ワードのサイズは2バイト、つまり16ビットです。ただし、メモリ単位はバイト単位であるため、ワードを格納するには2つのメモリ単位が必要です。このワードの下位バイトユニットは下位アドレスユニットに配置され、上位バイトユニットは上位アドレスユニットに配置されます。アドレスがNのワードユニットをNアドレスワードユニットと略します。

DSと[アドレス]

CPUがメモリユニットを読み取りたい場合、CPUはメモリユニットの物理アドレスを知っている必要があります。通常、メモリユニットをマークするためにセグメントアドレスとオフセットアドレスを使用します。8086CPUにはDSレジスタがあり、通常、アクセスするデータのセグメントアドレスを格納するために使用されます。たとえば、ユニット10000Hのコンテンツにアクセスする場合は、次の組み立て手順を使用できます。

mov bx,10000H
mov ds bx
mov al,[0]

8086CPUではデータをセグメントレジスタに直接入れることができないため、レジスタの内容をセグメントレジスタに転送することにより、転送レジスタが必要になります。最初の命令は1000Hをbxに転送し、2番目の命令はbxのデータ1000Hをdsセグメントレジスタに転送します。
mov register [offset address]、2番目の命令はオフセットアドレスを提供しますが、物理アドレスはオフセットアドレスだけでは特定できないことがわかっています。8086CPUはdsのデータをデフォルトのセグメントアドレスとして使用します。指定されたセグメントを表示しない限り住所。

mov、add、sub命令

mov add subコマンドを使用して、セグメントレジスタの値を変更することはできません。

スタック

スタックは特別な構造モデルです。スタックは箱に相当します。通常、箱の中に物を下から下に入れます。物を取り出すときは、上から始めます。スタックはこの構造、後入れ先出し構造に似ており、この構造はLIFO後入れ先出し)とも呼ばれます。
8086は、スタック内のメモリ空間にアクセスするための関連命令を提供します。8086が提供する2つの基本的なコマンドは、PUSH(スタックにプッシュPOP(プルアウトです。プッシュaxは、レジスタaxの内容をスタックに送信することを意味し、ポップaxは、スタックから取り出されたデータをaxに送信することを意味します。8086CPUのスタッキングおよびポップ操作は、すべてワード単位で実行されます。次の図は、命令実行のプロセスを示しています。ここに画像の説明を挿入します
メモリのセクションをスタックとして使用します。CPUは、スタックのfirst-in-last-outルールに従って、プッシュおよびポップ命令を実行してこのスペースにアクセスします。ただし、問題は、CPUがどのメモリスペースが処理されるかをどのように認識するかです。スタックのルール?
8086CPUでは、SSレジスタとSPレジスタは、どのスペースがスタックであるかを指定します。SSはスタックの最上位スペースのセグメントアドレスを格納し、SPはオフセットアドレスを格納します。SS:SPは、スタックの最上位要素を共同で指定します。
プッシュアックスの実行は、次の2つの手順で完了します。

  1. SP = SP-2、SS:SPは現在のスタックトップの前のユニットを指し、現在のスタックトップ要素の前のユニットは新しいスタックトップです。
  2. 斧のコンテンツをSS:SPが指すメモリユニットに送信すると、SS:SPは新しいスタックの最上位を指すようになります。

pop axの実装は、次の2つの部分で完了します。
1. ss:spが指すスタックの最上位要素をaxレジスタに送信します。
2sp = sp + 2.SS:SPは現在のスタックトップの下のユニットを指し、現在のスタックトップの下のユニットは新しいスタックトップです。
スタックスペースが空のときにSS:SPが指すメモリユニットについて説明しましょう。スタックの最下位ワード単位が1000:Eの場合。SPは0010Hである必要があります。したがって、スタックが空の場合、SS:SPはスタックの一番下のユニットの下のユニットを指す必要があります。

スタックトップの範囲外の問題

実際、CPUのメモリ空間は同じであり、どのメモリ空間がスタックであるかについての規制はありませんが、スタックの規則に従って、どのメモリ空間にアクセスするかを人為的に規定しています。スタックトップが境界を超える問題を考慮する必要があります。記述された命令によってスタックトップが境界を超えるかどうか、およびスタックスペースとスタックスペースのサイズとして定義されるスペースを知りたいと思います。
popおよびpushコマンドを使用して、セグメントレジスタの値を変更できます。
デバッグモードでは、Dコマンド、Eコマンド、Aコマンド、Uコマンドは、セグメントレジスタを使用してメモリユニットのセグメントアドレスを表すことができます。たとえば、e ds:0 foldは、物理アドレスがds * 16 +0であるストレージユニットから値の変更を開始することを意味します。

おすすめ

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