コンテンツ
1.CPU
-
コンパイラは、私たちが書いたプログラムを特別な機械語構造に変換するプログラムです。通常、各タイプのCPUには独自の機械語があります。これが、Mac用に作成されたプログラムがIBMタイプのPCで実行されない理由の1つです。
-
コンピューターは、クロックを使用して命令の実行を同期します。クロックは固定周波数(クロック周波数と呼ばれます)でパルスします。1.5GHzコンピュータを購入する場合、1.5GHzはクロック周波数、つまり1秒あたり15億クロックパルスです。時計は分と秒を記録しません。それは単に一定の速度で鼓動します。電子計算機は、メトロノームのビートが正しいテンポで音楽を再生するのにどのように役立つかなど、このビートを使用して正しく動作します。命令にかかるティック数(またはよく言われる実行サイクル)は、CPUの生成と模倣によって異なります。サイクル数は、その前の命令やその他の要因によって異なります。
2.プログラムメモリをセグメント化する必要があります(例として8086CPUを取り上げます)
- アクセスに関しては、メモリは長方形のストリップのようなもので、アドレスが順番に増えていきます。メモリはランダムな読み取りおよび書き込みデバイスです。つまり、内部の任意の部分にアクセスでき、実際の物理アドレスが直接指定されている限り、最初から開始する必要はありません。
- セグメンテーションは、CPUがメモリにアクセスする方法であるメモリアクセスのメカニズムであり、CPUのみがセグメントに注意を払います。
- 8086CPUには20のアドレスラインがあり、アドレス可能な最大メモリスペースは1MB、2^20バイトです。8086には16ビットレジスタしかなく、命令ポインタ(IP)とインデックスレジスタ(SI、DI)も16ビットです。16ビットアドレスで1MBのスペースをアドレス指定することはできません。したがって、メモリをセグメント化する必要があります。つまり、1MBのスペースを複数のセグメントに分割し、各セグメントが64KBを超えないようにし、8086に4つの16ビットセグメントレジスタを設定して4つの
种
セグメントを管理する必要があります种
。そうではありません个
(メモリプログラムの実行に必要な4つの部分である4つのセグメントに分割されます。ただし、メモリのセグメントは4つ以上ありますが、最大で4つのセグメントが同時に動作し、他のセグメントは「スリープ」です。 「および必要に応じて「ウェイクアップ」します。.)、特定のタイプは次のとおりです。CSはコードセグメント、DSはデータセグメント、SSはスタックセグメント、ESは追加セグメントです。 - メモリがセグメント化された後、メモリアドレス(物理アドレスとも呼ばれます)は、セグメントアドレスとセグメント内のオフセットアドレスの2つの部分で構成され、セグメントレジスタがセグメントアドレスを管理します。メモリをセグメント化した後、各セグメントにはセグメントベースアドレスがあり、セグメントレジスタはセグメントベースアドレスの上位16ビットを格納します。この16ビットアドレスは左に4ビット(プラス4 0)シフトされて20ビットセグメントを形成します。ベースアドレス。
- 上記は、セグメントアドレス×16(または4ビット左シフト)+オフセットアドレス=物理アドレスのアドレッシングモードの原点です。
- 8086CPUには20のアドレスラインがあり、アドレス可能な最大メモリスペースは1MB、2^20バイトです。8086には16ビットレジスタしかなく、命令ポインタ(IP)とインデックスレジスタ(SI、DI)も16ビットです。16ビットアドレスで1MBのスペースをアドレス指定することはできません。したがって、メモリをセグメント化する必要があります。つまり、1MBのスペースを複数のセグメントに分割し、各セグメントが64KBを超えないようにし、8086に4つの16ビットセグメントレジスタを設定して4つの
- 2つ目はプロテクトモードで、セグメンテーションはセグメンテーションを強調します。セグメンテーションは、メモリをセグメントごとに1つずつ異なるアドレス空間に分割し、CPUのMMUによって実際の物理アドレスに変換するために使用されます。プログラムは異なるセグメントで実行されるため、CPU保護モード、いわゆるプロセスまたはジョブで、関連のない各コードを基本的に保護します。
3.CPUのさまざまなモデル
-
8088、8086:
これらのCPUは、プログラミングの観点からは同一です。初期のPCで使用されていたCPUです。それらはいくつかの16ビットレジスタを提供します:AX、BX、CX、DX、SI、DI、BP、SP、CS、DS、SS、ES、IP、FLAGS。これらは1Mバイトのメモリのみをサポートし、リアルモードでのみ機能します。このモードでは、プログラムは他のプログラムのメモリも含め、任意のメモリアドレスにアクセスできます。これにより、トラブルシューティングと安全性が非常に難しくなる可能性があります。また、プログラムのメモリをセグメントに分割する必要があります。
各セグメントは64K、つまり2 ^ 16Byte(16ビットレジスタ)より大きくすることはできません。 -
80286:
このCPUはATシリーズPCで使用されています。それは8088/86の基本機械語にいくつかの新しい命令を追加します。ただし、その主な新機能は16ビットプロテクトモードです。このモードでは、16Mバイトのメモリにアクセスし、他のプログラムのメモリへのアクセスを防止することでプログラムを保護できます。ただし、プログラムは64Kを超えることのできないセグメント、つまり2 ^ 16バイト(16ビットレジスタ)に分割されます。 -
80386:
このCPUは、80286のパフォーマンスを大幅に向上させます。まず、32ビットデータ(EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP、EIP)に対応するために多くのレジスタを拡張し、2つの新しい16ビットレジスタ(FS、GS)を追加します。また、新しい32ビット保護モードが追加されます。このモードでは、4Gバイトにアクセスできます。プログラムもセグメントに分割されていますが、各セグメントのサイズも4G、つまり2 ^ 32バイト(32ビットレジスタ)に達することができます。 -
ここに記載されていないCPUモデルも多数ありますが、結局CPUチップの開発は行っていません。比較的単純な構造のCPUを研究し、その原理を理解しています。
4. 16ビットレジスタ(例として8086、つまりx86アーキテクチャ)
レジスタはCPU内のストレージコンポーネントであり、メモリ空間とは関係ありません。レジスタを設定する理由は、CPUがメモリとデータを交換する回数を減らして、コンピュータの動作速度を向上させるためです。 。
8086 CPUには、AX、BX、CX、DX、SP、BP、SI、DI、IP、FLAG、CS、DS、SS、ESの合計14個のレジスタがあり、すべて16ビットです。
4.1汎用レジスタ:
AX、BX、CX、DX、SP、BP、SI、DIの8つの汎用レジスタがあります。
4.1.1データレジスタ:
AX、BX、CX、DXはデータレジスタと呼ばれ、一般的なデータを一時的に保存することができます。また、他の特別な目的もあります。具体的な特別な目的は次のとおりです。
-
AX (Accumulator)
:アキュムレータとも呼ばれるアキュムレータは、加算に加えて、乗算または除算も実行できます。演算数が16ビットの場合、次のようにDXでよく使用されます。-
除算(DIV)演算を実行する場合:
除数可以存放在寄存器中或者是内存单元中
、被除数默认放在AX或(DX和AX)中,如果除数为8位,被除数则为16位,默认放在AX中;如果除数为16位,那么被除数就为32位,存放在DX和AX两个寄存器中,高16位存放在DX,低16位存放在AX。
、または除数は8ビットまたは16ビットにすることができます。- 除数が8ビットの場合、被除数は16ビットである必要があり、デフォルトでAXレジスタに配置されます。除数が8ビットの場合、除算演算の商はALに保存され、AHに余りを保存します。この除算操作の
- また、除算器が16ビットの場合、AXは16ビットレジスタであるため、配当は32ビットである必要があります。当然、32ビットの配当は配置できないため、ここでは別の16ビットレジスタDXを使用する必要があります。ここで、DXは32ビットを格納します。DXは32ビットの被除数の上位16ビットを格納し、AXは32ビットの被除数の下位16ビットを格納します。同時に、分割命令の場合、AXの機能は被除数を保存するために使用されるだけではありません。もちろん、除算器が16ビットの場合は実行されます。この除算演算の商はAXに格納され、この除算演算の残りはDXに格納されます。
-
乗算(MUL)操作を行う場合:
2つの乗算された数値は8ビットまたは両方とも16ビットです。- 2つの乗算された数値が両方とも8ビットの場合、MUL命令が実行されると、一方はデフォルトでALに配置され、もう一方の8ビット乗算器は他のレジスタまたはメモリバイト単位に配置されます。ビット乗算演算。デフォルトの乗算結果はAXに格納されます。
- 2つの乗算された数値が両方とも16ビットの場合、一方はデフォルトでAXに格納され、もう一方の16ビットは16ビットレジスタまたはメモリワードユニットに配置されます。
同時に、16ビットの乗算演算の場合、デフォルトの乗算結果は32ビットになり、そのうち上位ビットはデフォルトでDXに格納され、下位ビットはデフォルトでAXに格納されます。
-
-
BX (Base)
:ベースアドレスレジスタ;
BXは、主にその排他的機能であるオフセットアドレスの格納に使用されます(セグメントレジスタと組み合わせて、物理アドレスをアドレス指定できます)。追加のレジスタが指定されていない場合、DSセグメントレジスタがデフォルトで使用されます。たとえば、[BX]は、DS:[BP]セグメントアドレス×16(または4ビット左シフト)+オフセットアドレス=物理アドレス
に相当します。
-
CX (Count)
:カウンタレジスタ;
CXのCはカウント、つまりカウンタの機能に変換されます。アセンブリ命令でループLOOP命令を使用する場合、ループする必要のある回数をCXで指定できます。 CPUは毎回LOOP命令を実行します。2つのことを行います。- 1つは、CX = CX – 1にすることです。つまり、CXカウンターは自動的に1ずつデクリメントされます。
- もう1つは、CXの値を判断することです。CXの値が0の場合、ループからジャンプしてループの下の命令を実行し続けます。CXの値が0でない場合、CXの値は実行を継続します。ループで指定された命令。
-
DX (Data)
:データレジスタ;
除算(DIV)または乗算(MUL)操作を行うときにAXで使用できます。上記のAXの詳細な使用法の説明を参照してください。
4.1.2ポインタレジスタ:
SP (Stack Pointer)
:スタックポインタレジスタ;
セグメントアドレスはSSレジスタのデフォルト値を使用します
いつでもSS:SPはスタックの最上位要素を指しますBP (Base Pointer)
:ベースポインタレジスタ;
セグメントアドレスは
、SSレジスタのデフォルト値bpをベースアドレスレジスタとして使用します。これは、関数に入るときにスタックの最上位のベースアドレスを保存するために関数で一般的に使用されます。
spは、スタック操作(PUSH、CALL、INT、RETFなど)を使用する命令で変更されますが、BPは変更されないため、BPを使用してパラメーターを取得し、パラメーターを使用してサブルーチン内のスタックに設定された一時変数にアクセスします。
サブ関数が呼び出されるたびに、システムはこれら2つのポインターを最初に保存し、関数の最後にspとbpの値を復元します。
関数が入ると次のようになります。
push bp // 保存bp指针
mov bp,sp // 将sp指针传给bp,此时bp指向sp的基地址。
// 这个时候,如果该函数有参数,则[bp + 2*4]则是该子函数的第一个参数,[bp+3*4]则是该子函数的 第二个参数,以此类推,有多少个参数则[bp+(n-1)*4]。
.....
.....
函数结束时:
mov sp,bp // 将原sp指针传回给sp
pop bp // 恢复原bp的值。
ret // 退出子函数
スタック内のデータを検索し、個々のアドレッシングモードを使用する場合にのみ使用できます。
たとえば、大量のデータまたはアドレスがスタックにプッシュされます。これらのデータまたはアドレスにSPを介してアクセスする必要がありますが、SPはスタックの最上位はい、任意に変更することはできません。このとき、BPを使用し、SPの値をBPに渡し、BPを使用してスタック内のデータまたはアドレスを検索する必要があります。
また、汎用レジスタであり、多くの場合、汎用レジスタのように一時的にデータを保持することもできます。ただし、2つの8ビットレジスタに分解できるのはデータレジスタのみであるため、2つの8ビットレジスタに分解することはできません。
4.1.3インデックスレジスタ
SI (Source Index)
:ソースインデックスレジスタ;
SIはデフォルトでDSセグメントレジスタを使用しますDI (Destination Index)
:デスティネーションインデックスレジスタ;
DIはデフォルトでDSセグメントレジスタを使用します
2つの16ビットポインタレジスタ:SIとDI。通常はポインタとして使用されますが、多くの場合、汎用レジスタのように一時的にデータを保持することもできます。ただし、2つの8ビットレジスタに分解できるのはデータレジスタのみであるため、2つの8ビットレジスタに分解することはできません。
4.2セグメントレジスタ:
- CS(コードセグメント):コードセグメントレジスタ;
- DS(データセグメント):データセグメントレジスタ;
- SS(スタックセグメント):スタックセグメントレジスタ;
- ES(Extra Segment):追加のセグメントレジスタ。
16ビットのCS、DS、SS、およびESレジスタはセグメントレジスタです。これらは、プログラムのさまざまな部分で使用されるメモリを示します。CSはコードセグメント、DSはデータセグメント、SSはスタックセグメント、ESは追加セグメントを表します。ESは一時的なセグメントレジスタとして使用されます。これらのレジスタの詳細については、後の記事で説明します。
4.3制御レジスタ
- IP(命令ポインタ):命令ポインタレジスタ;
命令ポインタレジスタ(IP)は、CPUによって実行される次の命令のアドレスを追跡するためにCSレジスタとともに使用されます。通常、命令が実行されると、IPはメモリ内の次の命令を指し示します。 - FLAG:フラグレジスタ
。FLAGSレジスタは、前の命令の実行結果に関する重要な情報を格納します。これらの結果は、レジスタの1ビットに格納されます。例:前の命令の実行結果が0の場合、Zビットは1です。それ以外の場合は、0です。すべての命令がFLAGSのビットを変更するわけではありません。
5. 32ビットレジスタ(80386)
- 80386以降のプロセッサには拡張レジスタがあります。例:16ビットAXレジスタは32ビットに拡張されます。下位互換性のために、AXは引き続き16ビットレジスタを表し、EAXは拡張32ビットレジスタを表すために使用されます。ALがAX(EAX)の下位8ビットであるのと同様に、AXはEAXの下位16ビットです。ただし、EAXの上位16ビットに直接アクセスする方法はありません。その他の拡張レジスタは、EBX、ECX、EDX、ESI、およびEDIです。
- 他の多くのタイプのレジスタも拡張されています。BPはEBPになり、SPはESPになり、FLAGSはEFLAGSEFLAGSになり、IPはEIPになります。ただし、ポインタレジスタや汎用レジスタとは異なり、32ビットプロテクトモードではこのレジスタの拡張形式のみが使用されます。