ゼロページまたはベースページは、コンピュータのアドレス空間の先頭にあるメモリブロック、つまり開始アドレスがゼロのページです。ページのサイズはコンテキストによって異なり、ゼロページメモリと上位アドレスのメモリの重要性は、マシンアーキテクチャに大きく依存します。たとえば、Motorola 6800およびMOS Technology 6502プロセッサファミリは最初の256バイトのメモリを特別に扱いますが[ 1 ] 、他の多くのプロセッサはそうではありません。
現代のハードウェアとは異なり、1970年代のコンピュータのRAM速度はCPUと同程度でした。そのため、レジスタの数を少なくし、メインメモリを拡張レジスタプールとして利用するのが理にかなっていました。比較的広い16ビットのアドレスバスと比較的狭い8ビットのデータバスを持つマシンでは、メモリ内のアドレスを計算するのに数サイクルかかることがありました。ゼロページの1バイトのアドレスは他の場所よりも小さく、読み取りと計算が高速であったため、ゼロページは高性能コードに適していました。
集積回路技術の発展により、CPUにレジスタを追加するコストが下がり、CPUの動作速度がRAMへのアクセス速度よりもはるかに速くなったため、ゼロページアドレッシングは現在では主に歴史的な意義しか持たなくなっている。
ゼロページの実際のサイズ(バイト単位)はマイクロプロセッサの設計によって決まり、古い設計では、プロセッサのインデックスレジスタで参照できる最大値と等しくなることがよくあります。例えば、前述の8ビットプロセッサは8ビットのインデックスレジスタを持ち、ページサイズは256バイトです。したがって、ゼロページはアドレス0からアドレス255まで広がります。
PDP-8などの初期のコンピュータでは、ゼロページには特別な高速アドレッシングモードがあり、データの一時保存に利用しやすく、 CPUレジスタの不足を補っていました。PDP-8にはレジスタが1つしかなかったため、ゼロページアドレッシングは不可欠でした。初期のPDP-10 KA-10モデルでは、使用可能なレジスタはメインメモリの最初の16ワード(36ビット長)のみです。これらの場所は、レジスタとしてもメモリ位置としてもアクセスできます。
現代のハードウェアとは異なり、1970年代のコンピュータのRAMはCPUと同等の速度でした。そのため、レジスタの数を少なくし、メインメモリを拡張レジスタプールとして使用するのが理にかなっていました。16ビットのアドレスバスと8ビットのデータバスを備えたマシンでは、ゼロページ位置へのアクセスは他の位置へのアクセスよりも高速になる可能性がありました。ゼロページ位置は1バイトでアドレス指定できるため、それらにアクセスする命令は短くなり、結果としてロードが高速化されました。
例えば、MOS Technology 6502ファミリには汎用レジスタが1つしかありません。それはアキュムレータです。この制限を補い、パフォーマンス上の利点を得るために、6502はゼロページを特別に利用するように設計されており、オペランドが16ビットではなく8ビットの命令を提供することで、メモリフェッチサイクルを削減しています。多くの命令は、ゼロページアドレスと非ゼロページアドレスで異なるコードで記述されています。これは6502の用語ではゼロページアドレッシングと呼ばれています( Motorola 6800の用語では直接アドレッシングと呼ばれています。Western Design Center 65C816でもゼロページアドレッシングは直接ページアドレッシングと呼ばれています)。
LDA $ 12 ; ゼロページアドレッシングLDA $ 0012 ; 絶対アドレッシング6502アセンブリ言語では、上記の2つの命令はどちらも同じことを実行します。つまり、メモリ位置の値を(アキュムレータ)レジスタ$12にロードします(はMotorola/MOS Technologyのアセンブリ言語における16進数の表記です)。ただし、最初の命令はわずか2バイトで、完了までに3クロックサイクルかかります。2番目の命令は3バイトで、実行に4クロックサイクルかかります。この実行時間の差は、繰り返しコードでは大きな影響を与える可能性があります。.A$
Motorola 6809や前述のWDC 65C816などの一部のプロセッサは、「ダイレクトページレジスタ」(DP)を実装しており、プロセッサにゼロページとみなされるRAM内の開始アドレスを通知します。この文脈では、ゼロページアドレッシングは概念的なものであり、が(または65C816の場合は)DP以外のアドレスでロードされた場合、実際のアクセスは物理的なゼロページには行われません。$00$0000
ただし、一部のコンピュータアーキテクチャでは、アドレス空間の先頭を他の目的のために予約しています。たとえば、Intel x86システムは、リアルモードで動作する場合、アドレス空間の最初の256ダブルワードを割り込みベクタテーブル(IVT)のために予約します。
ハードウェア関連のベクトルにゼロページを使用する同様の手法は、ARMアーキテクチャでも採用されていました。不適切なプログラムでは、これにより「ofla」動作が発生する可能性があり、プログラムが意図しないメモリ領域から情報を読み取ろうとしたり、実行可能コードをデータとして扱ったり、あるいはその逆のことが起こったりします。ゼロページ領域がシステムジャンプベクタを格納するために使用され、ファームウェアが騙されてそれらを上書きしてしまうと、特に問題になります。[ 2 ]
8ビット版CP/Mでは、ゼロページは実行中のプログラムとオペレーティングシステム間の通信に使用されます。
Intel 4004 4ビットプロセッサなどの一部のプロセッサアーキテクチャでは、メモリは(256バイト)ページに分割されており、制御フローがページ境界を越える際には特別な注意が必要でした。これは、一部のマシン命令がページの最後の数個の命令にある場合、異なる動作を示すため、ページ間をジャンプする命令はごく少数に抑えることが推奨されていたためです。[ 3 ]
ゼロページの本来の優先的な使用法とは対照的に、FreeBSD、Linux、Solaris、 macOS、Microsoft Windows [ 4 ]などの最新のオペレーティングシステムでは、ヌルポインタの使用を捕捉するためにゼロページにアクセスできないようにしています。このようなポインタ値は、初期化されていない値や番兵ノードを正当に示している可能性がありますが、有効なオブジェクトを指していません。バグのあるコードがヌルポインタを介してオブジェクトにアクセスしようとすると、オペレーティングシステムレベルでメモリアクセス違反として捕捉される可能性があります。単一のゼロ値のヌルポインタだけでなくページ全体を無効にすることで、オペレーティングシステムは、たとえば構造体を指すヌルポインタを持ち、ヌルポインタからのオフセットで構造体のメンバーにアクセスするコードを捕捉できます。
{{cite book}}: CS1メンテナンス: 場所の発行元が見つかりません (リンク)…] 特定の命令は、ページの最後のバイト (または複数のバイト) にある場合と、他の場所にある場合とで動作が異なります。 […] 2 つのアドレスのアドレスの最上位の 16 進数が等しい場合、そのアドレスは同じページにあります。 […] JIN 命令がメモリ内のページの最後の場所にある場合、プログラム カウンタの最上位 4 ビットが 1 ずつ増加し、次のページの対応する場所に制御が移されます。 […] もし […] JIN がアドレス 255 (10 進数、16 進数 0FF) に配置されていた場合、制御は 015 ではなく 115 に転送されます。これは危険なプログラミング手法であり、可能な限り避けるべきです。 […] プログラムは ROM またはプログラム RAM に格納され、どちらもページに分割されています。各ページは 256 個の 8 ビット位置で構成されます。アドレス 0 から 255 が最初のページを構成し、256 から 511 が 2 番目のページを構成し、以下同様です。一般的に、JUN または JMS 命令を使用する場合を除き、プログラムの流れがページ境界を越えないようにすることが、優れたプログラミング手法です。 […]