レジスタオペランド:(CPUに格納)
MOV AX、0FFFFH
AXはレジスタオペランドです。
オペランド自体はレジスタに格納され、そのレジスタに具体的に格納されていることを示すために、命令に数ビットのコードのみが指定されています。
メモリ内のデータは、レジスタを介してCPUに読み込まれ、データの計算に入ります。
メモリオペランド:(メモリに格納)
メモリ領域に格納されるため、メモリオペランドと呼ばれます。
-
mydata dw 1234Hまたはmydata db 12Hなど。
上記のmydataのような変数
-
xx db 0FFH、0
mov bx、OFFSET xx // xxユニットのオフセット値を計算するためにオフセット演算子を使用します
mov ax、[bx]
上記の[bx]は非変数名と呼ばれ、直接アドレス指定されるメモリオペランド
セグメントレジスタ:
セグメントレジスタは、メモリのセグメント管理のために設定されます。
なぜメモリのセグメンテーションが必要なのですか?
8086CPUには20本のアドレス行があり、アドレス可能な最大メモリ空間は1MBです。8086レジスタはわずか16ビットで、命令ポインタ(IP)とインデックスレジスタ(SI、DI)も16ビットです。16ビットアドレスで1MBの空間をアドレス指定することはできません。したがって、メモリをセグメント化する必要があります。つまり、1MBのスペースは24に分割されます。つまり、16セグメントであり、各セグメントは64KBを超えません( 2、16、16データラインをアドレス指定できます)。
したがって、4つの16ビットセグメントレジスタが8086で設定され、4つのセグメントを管理します。CSはコードセグメント、DSはデータセグメント、SSはスタックセグメント、ESは追加のセグメントです。メモリがセグメント化された後、各セグメントはセグメントベースアドレスを持ちます。セグメントレジスタは、セグメントベースアドレスの上位16ビットを保持します。上位16ビットはセグメントベース値と呼ばれます。16ビットアドレスは4ビット左にシフトされます20ビットのセグメントベースアドレスを形成するために、4つのゼロを追加します。
ただし、メモリのセグメンテーションを記述する場合、次のセグメント情報が必要です。1。セグメントのサイズ; 2.セグメントの開始アドレス; 3.セグメントの管理属性(書き込み禁止/実行禁止/システム固有など)この情報を格納するには8バイト(64ビット)必要ですが、セグメントレジスタには16ビットしかありません。
したがって、セグメントレジスタに格納できるのは、セグメントセレクタとも呼ばれるセグメント番号だけです。次に、セグメント番号は、メモリに格納されているGDT(グローバルセグメント番号レコードテーブル)にマップされ、セグメント情報を読み取ります。
仮想空間(仮想メモリアドレス空間)/プログラミング空間(プログラム書き込み空間)
ストレージ管理コンポーネントは、メインメモリ(物理メモリ)と補助メモリ(ディスク)を全体として、つまり仮想メモリと見なします。486は、246 = 64Tの最大仮想メモリ容量を許可します。つまり、プログラマはこのアドレス範囲内でプログラムでき、プログラムは物理スペースを大幅に超える可能性があります。
したがって、CPUは仮想メモリ空間のアドレスを物理アドレス(プログラムの実行空間)に変換する必要があります。
2つのステップが必要です。
1.まず、論理アドレスが与えられると、CPUはまずそのセグメント化されたメモリ管理ユニットを使用して、論理アドレスを線形アドレスに変換します。
2.ページメモリ管理ユニットを再利用して、最終的な物理アドレスに変換します。
注:
-
ページングがない場合、線形アドレスは物理アドレスです。
-
ページングの場合、ページングユニットは線形アドレスを
物理アドレス。
-
リアルモード:ストレージスペースはページングではなく、セグメント化されています。
保護モード:ストレージ領域が最初にセグメント化され、次にページングされます。
論理アドレスとは何ですか?
論理アドレスは、CPUによって生成されるアドレスであり、機械語命令のオペランドまたは命令を指定するために使用されるアドレスを指します。
論理アドレスは、2つの部分、セグメント識別子、セグメント内のオフセット(オフセット)で構成されます。セグメント識別子は、セグメントセレクタと呼ばれる16ビットのフィールドで構成されます。セグメントセレクタは、セグメントレジスタに格納されます。最初の13桁はインデックス番号です。最後の3ビットには、ハードウェアの詳細が含まれています。
インデックス番号、または配列インデックスとして直接理解される、それのインデックスは何ですか?これは「セグメント記述子(セグメント記述子)」です(データセグメント記述子、コードセグメント記述子、システムセグメント記述子があります)。セグメント記述子固有のアドレスは、セグメントを記述します。
このように、多くのセグメント記述子では、配列は「セグメント記述子テーブル」と呼ばれ、特定のセグメント記述子は、セグメント識別子の最初の13ビットを介してセグメント記述子テーブルで直接見つけることができます。記述子はセグメントを記述し、各セグメント記述子は8バイトで構成されます。セグメント記述子にはBaseフィールドがあり、セグメントの開始位置の線形アドレスが記述されています。ベース+オフセットは、変換される線形アドレスです。
注:
一部のグローバルセグメント記述子は、「グローバルセグメント記述子テーブル(GDT)」に配置されます。
各プロセスのローカルなど、一部のローカルは「ローカルセグメント記述子テーブル(LDT)」に配置されます。
セグメントセレクタのT1フィールド= 0はGDTを意味し、= 1はLDTを意味します。
指示通り:
1.直接寻址
格式:段寄存器:[偏移地址]
mov bx, ds:[1234H] //表示从ds数据段偏移地址为1234H的单元取数——>bx
假设(DS)=5000H 可计算出
线性地址为16d×(DS)+1234H=16d×5000H+1234h=50000H+1234H=51234H 。
命令的最后结果就是把线性地址为51234H的存储单元中的操作数据放入BX中
2.间接寻址
格式:段寄存器:[间址寄存器] / [间址寄存器]
注意:可省略段寄存器是因为会到默认约定的段寄存器中取内容数据
例:
mov ds,数据段段基址
mov bx,buf单元的偏移地址
mov al,ds:[bx]
等价于:mov al,[bx]
間接レジスタと従来のアクセスの論理セグメントを次の図に示します。
ページングメモリ管理
コア:仮想メモリ空間と物理メモリ空間を同じサイズのページに分割し、ページをメモリ空間分割の最小単位として使用します。スペースの増加も簡単に実現できます。追加の仮想ページを割り当てて、格納するアイドル物理ページを見つけるだけです。
ページングメモリ管理が必要なのはなぜですか?
以下の利点があるため:
- 外部の断片化はありません(スペースの断片化の根本的な原因は、各プログラムのサイズが異なるため、スペースを割り当てるときに一貫性がないことです。解決策は、当然、スペースを特定のサイズに割り当てることです。物理メモリと同じサイズの部分に分割されます。これを「ページ」と呼びます。)プロセスが占有するメモリ空間は連続的ではない場合があります。
- プロセスの仮想ページは、不要な場合はディスクに格納でき、同時にメモリにロードする必要はありません。
- 小さなアドレス、つまりページ共有を共有できます。対応するページテーブルに対応するレコードを作成するだけです。
ページングシステムのメカニズム:
プログラムが発行する仮想アドレスは、ページ番号とページ内のオフセット値の2つの部分で構成されます。
このtotal_page配列には2 ^ 20のメンバーがあり、各メンバーはアドレス(32ビットマシン、アドレスは4バイト)です。このような配列を表すには、4 MBのメモリスペースが必要です。スペースを節約するために、ページングユニットを編成するためのセカンダリ管理モードマシンが導入されました。
したがって、各32ビット線形アドレスは、ページディレクトリインデックス(10ビット):ページテーブルインデックス(10ビット):オフセット(12ビット)の 3つの部分に分かれています。
以下の手順に従って変換します。
- プロセスのページディレクトリアドレスをcr3レジスタから削除します(オペレーティングシステムは、プロセスをスケジュールするときに、このアドレスを対応するレジスタにロードします)。
- 線形アドレスの最初の10桁に従って、配列内の対応するインデックスアイテムを見つけます。セカンダリ管理モードが導入されたため、ページディレクトリ内のアイテムは、ページアドレスではなく、ページテーブルのアドレスになります。(追加の配列が導入されました。)ページアドレスがページテーブルに配置されました。
- 線形アドレスの中央の10ビットに従って、ページテーブル(これも配列)でページの開始アドレスを見つけます。
- ページの開始アドレスを線形アドレスの最後の12ビットに追加して、目的の物理アドレスを最後に取得します。