PDP-11アーキテクチャ
| デザイナー | デジタル・イクイップメント・コーポレーション |
|---|---|
| ビット | 16ビット |
| 紹介された | 1970年 |
| デザイン | CISC |
| タイプ | レジスター-レジスター レジスター-メモリ メモリ-メモリ |
| エンコーディング | 変数(2~6バイト) |
| 分岐 | 条件コード |
| エンディアン | 混合(16ビット整数の場合はリトルエンディアン) |
| 拡張機能 | EIS、FIS、FPP、CIS |
| 開ける | いいえ |
| 後継 | ヴァックス |
| レジスター | |
| 汎用 | 8 × 16ビット |
| 浮動小数点 | FPPが存在する場合、6 × 64ビット浮動小数点レジスタ |
PDP -11アーキテクチャ[1]は、 Digital Equipment Corporation(DEC)が開発した16ビット CISC 命令セットアーキテクチャ(ISA)です。PDP -11ミニコンピュータに搭載されている中央処理装置(CPU)とマイクロプロセッサによって実装されています。1970年代には広く使用されていましたが、1980年代にはより強力なVAXアーキテクチャに取って代わられました。
CPUレジスタ
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
CPUには、8つの汎用16ビットレジスタ(R0~R7)が搭載されています。レジスタR7はプログラムカウンタ(PC)です。任意のレジスタをスタックポインタとして使用できますが、R6はハードウェア割り込みとトラップに使用されるスタックポインタ(SP)です。R5は、現在のプロシージャコールフレームを指すためによく使用されます。コンテキストスイッチを高速化するために、一部のPDP-11モデルでは、R0~R5のデュアルレジスタセットが提供されています。カーネル、スーパーバイザ(存在する場合)、およびユーザーモードは、それぞれ独立したメモリマップとスタックポインタを備えています(これにより、ユーザープログラムがスタックポインタレジスタに無効な値を格納してシステムの誤動作を引き起こすことを防ぎます)。
メモリ
データ形式
アドレス指定および書き込み可能なメモリの最小単位は8ビットのバイトです。バイトはレジスタR0からR5の下位半分にも保持されます。
16ビットワードは、最下位バイトが下位アドレスに位置するリトルエンディアン方式で格納されます。ワードは常に偶数メモリアドレスに揃えられます。ワードはレジスタR0からR7に保持できます。
拡張命令セット (EIS) の32ビットダブルワードは、下位ワードが下位番号のレジスタに格納されるレジスタペアにのみ格納できます。ダブルワードは、MUL、DIV、ASHC命令で使用されます。その他の32ビットデータは、基本アーキテクチャの拡張としてサポートされています。浮動小数点命令セット (FIS) の単精度浮動小数点データ、および11/45以降のほとんどのモデルの浮動小数点プロセッサオプション (FPP) の命令セット、および商用命令セット (CIS) のロングデータは、複数の形式で格納されます。これには、通常とは異なるミドルエンディアン形式[2] [3] (「PDPエンディアン」と呼ばれることもあります) も含まれます。
FPP オプションでは、64 ビットの倍精度浮動小数点形式がサポートされます。
メモリ管理
PDP-11 の 16 ビット アドレスは 64 KBをアドレス指定できます。PDP-11 が VAX に取って代わられる頃には、8 ビット バイトと 16 進表記が業界の標準になりつつありましたが、PDP-11 上の数値は常に 8 進表記を使用し、PDP-11 に接続されているメモリの量は常にワード数で示されます。基本的な論理アドレス空間は 32K ワードですが、物理アドレス空間の上位 4K (メモリ管理がない場合のアドレス 160000 8から 177777 8 ) は、バス上の入出力レジスタがその範囲のアドレスに応答するため、使用されません。そのため、当初は完全に拡張された PDP-11 は 28K ワード、現在の用語で 56 KB でした。
プロセッサは、サービスルーチンを開始するためのプログラムカウンタとプロセッサステータスワードを提供する2ワードのベクター用に、下位メモリアドレスを予約します。I/Oデバイスがプログラムに割り込むと、そのベクターのアドレスがバス上に出力され、どのサービスルーチンに制御を引き継ぐかが示されます。最下位のベクターは、さまざまな種類のトラップを処理するサービスルーチンです。トラップは、未定義命令の実行試行などのプログラムエラーが発生した場合、また、プログラムがBPT、EMT、IOT、TRAPなどの命令を実行してオペレーティングシステムにサービスを要求した場合にも発生します。
メモリ拡張
1975年までに、PDP-11の16ビット論理アドレス空間は限界を迎えました。[4]これを回避するために様々な技術が使用されました。
- 後期モデルのPDP-11プロセッサには、仮想アドレス指定をサポートするメモリ管理機能が搭載されています。物理アドレス空間は18ビットまたは22ビットに拡張され、最大256KBまたは4MBのRAMを搭載できるようになりました。論理アドレス空間(つまり、メモリマッピングテーブルを変更せずにいつでも利用可能なアドレス空間)は16ビットに制限されています。
- PDP-11/45以降の一部のモデルでは、プログラムコード用の「命令空間」として32Kワード(64KB)を使用し、それとは別に32Kワードの「データ空間」を使用するように設定できます。一部のオペレーティングシステム(特にUnix V7以降のエディションおよびRSX11-M+)はこの機能に依存しています。
- 必要に応じて格納された命令やデータのブロックを別のブロックでオーバーレイするなどのプログラミング手法は、ページングの問題をアプリケーションプログラマから隠蔽することができます。例えば、 Modula-2コンパイラは、個々のプロシージャが制御を受け取るたびに、ランタイムシステムが8KBのページをメモリにスワップするコードを生成します。[5]
アドレッシングモード
ほとんどの命令は、オペランドを指定するために6ビットを割り当てます。3ビットで8つのアドレッシングモードのいずれかを選択し、残りの3ビットで汎用レジスタを選択します。
6 ビット オペランド アドレッシング モードのエンコードは次のとおりです。
| 5 | 3 | 2 | 0 | ||
| モード | 登録する | ||||
以下のセクションでは、各項目に、オペランドをアセンブリ言語で記述する例を示します。Rnは、R0からR7まで記述される8つのレジスタのいずれかを表します。
汎用レジスタアドレッシングモード
以下の8つのモードは、任意の汎用レジスタに適用できます。R6(スタックポインタ、SP)とR7(プログラムカウンタ、PC)に適用した場合の効果については、以下のセクションで個別に説明します。
| コード | 名前 | 例 | 説明 |
|---|---|---|---|
| オン | 登録する | ルン | オペランドはRnにあります |
| 1n | 登録延期 | (ルン) | Rnにはオペランドのアドレスが格納されます |
| 2n | 自動インクリメント | (Rn)+ | Rnにはオペランドのアドレスが含まれており、Rnをインクリメントします。 |
| 3n | 自動インクリメントの延期 | @(Rn)+ | Rnにはオペランドのアドレスが格納され、Rnを2だけ増分する |
| 4n | 自動デクリメント | −(Rn) | Rnをデクリメントし、その結果をオペランドのアドレスとして使用する |
| 5n | 自動デクリメントの延期 | @−(Rn) | Rnを2減算し、その結果をオペランドのアドレスとして使用します。 |
| 6n | 索引 | X(Rn) | Rn+Xはオペランドのアドレスです |
| 7n | インデックス延期 | @X(Rn) | Rn+Xはオペランドのアドレスのアドレスです |
インデックスモードおよびインデックス遅延モードでは、Xは命令の2番目のワードから取得される16ビット値です。ダブルオペランド命令では、両方のオペランドでこれらのモードを使用できます。このような命令は3ワード長です。
レジスタの自動インクリメントおよび自動デクリメント操作は、バイト命令では 1 ずつ、ワード命令では 2 ずつ、遅延モードが使用される場合は常に 2 ずつ行われます。これは、レジスタがアドレス指定する量が (ワード) ポインタであるためです。
プログラムカウンタのアドレッシングモード
R7 (プログラム カウンタ) が指定されると、次の 4 つのアドレッシング モードが自然に便利な効果をもたらします。
| コード | 名前 | 例 | 説明 |
|---|---|---|---|
| 27 | すぐに | #n | オペランドは命令の次のワードである |
| 37 | 絶対 | @#あ | オペランドのアドレスは命令の次のワードである |
| 67 | 相対的 | 1つの | オペランドのアドレスはPCに加算される命令の次のワードである。 |
| 77 | 相対延期 | @あ | オペランドのアドレスはPCに加算される命令の次のワードである |
絶対モードは、構文が即値モードと遅延モードを組み合わせたもので、各デバイスのレジスタが特定のメモリアドレスを持つため、入出力レジスタを指定する場合によく使用されます。相対モードは構文が単純で、プログラム変数やジャンプ先の参照によく使用されます。相対モード(および相対遅延モード)を内部参照のみに使用するプログラムは位置に依存しません。つまり、プログラム自身の位置に関する前提がないため、任意のメモリ位置にロードしたり、移動したりすることができ、その位置を反映するようにアドレスを調整(再配置)する必要はありません。現在の位置を基準としたこのようなアドレスを計算する際、プロセッサはオンザフライで再配置を実行します。
即値モードと絶対モードは、それぞれPCに自動インクリメントと自動インクリメント遅延モードを適用しただけです。上記の表にあるように、補助ワードが「命令内」にある場合、次の命令のPCは自動的に補助ワードを超えてインクリメントされます。PCは常にワードを指しているため、自動インクリメント操作は常に2ずつ行われます。
スタックアドレス指定モード
R6(SPとも表記)は、トラップや割り込み用のハードウェアスタックとして使用されます。PDP-11が提供するモードセットによって強制される規則として、スタックはアイテムがプッシュされるにつれて下向き(下位アドレスへ)に拡張されます。SP、またはプログラマがソフトウェアスタックとして使用することを選択した任意のレジスタにモードを適用すると、アドレッシングモードは以下の効果を持ちます。
| コード | 名前 | 例 | 説明 |
|---|---|---|---|
| 16 | 延期 | (SP) | オペランドはスタックの一番上にある |
| 26 | 自動インクリメント | (SP)+ | オペランドはスタックの一番上にあるので、それをポップする |
| 36 | 自動インクリメントの延期 | @(SP)+ | オペランドへのポインタはスタックの一番上にあるので、そのポインタをポップする |
| 46 | 自動デクリメント | −(SP) | スタックに値をプッシュする |
| 66 | インデックス | X(SP) | これはスタック上の任意のアイテムを上からの正の距離で表す。 |
| 76 | インデックス遅延 | @X(SP) | これは、スタック上の指定された位置にあるポインタの値を指します。 |
ソフトウェアスタックはバイト単位のスタックですが、SPは常にワード単位のスタックです。SPに対する自動インクリメントおよび自動デクリメント操作は常に2ずつ行われます。
命令セット
PDP-11 はバイトとワードで動作します。バイトはレジスタ番号(レジスタの下位バイトを識別する)またはメモリ位置で指定されます。ワードはレジスタ番号または下位バイトのメモリ位置(偶数である必要があります)で指定されます。オペランドを取るほとんどの命令では、ビット 15 がセットされてバイトアドレス指定が指定され、クリアされてワードアドレス指定が指定されます。以下の 2 つのセクションのリストでは、アセンブリ言語プログラマがバイト操作を指定するために命令シンボルに B を付加しています。例えば、MOV は MOVB になります。
MARK や SOB などのいくつかの命令は、一部の PDP-11 モデルでは実装されていません。
ダブルオペランド命令
上位4ビットは実行する演算を指定します(ビット15は通常、ワードアドレッシングとバイトアドレッシングを選択します)。6ビットの2つのグループは、上記で定義したソースオペランドアドレッシングモードとデスティネーションオペランドアドレッシングモードを指定します。
| 15 | 12 | 11 | 9 | 8 | 6 | 5 | 3 | 2 | 0 | ||||||
| オペコード | ソース | 登録する | 目的地 | 登録する | |||||||||||
| オペコード | ニモニック | 手術 |
|---|---|---|
| 01 | 動画 | 動く:Dest ← Src(レジスタへのMOVBはビット8~15に符号拡張されます) |
| 11 | MOVB | |
| 02 | CMP | 比較する:Src − Dest |
| 12 | CMPB | |
| 03 | 少し | ビットテスト:Src ∧ Dest |
| 13 | ビットブ | |
| 04 | ビック | 少しクリア:Dest ← Dest ∧ (-1 - Src) |
| 14 | BICB | |
| 05 | ビス | ビットセット:Dest ← Dest ∨ Src |
| 15 | BISB | |
| 06 | 追加 | 追加:Dest ← Dest + Src |
| 16 | サブ | 減算:Dest ← Dest − Src |
ADD 命令と SUB 命令はワード アドレス指定を使用し、バイト指向のバリエーションはありません。
エンコードの制限により、2 つのオペランドを持つ命令の中には、アドレッシング モード オペランドとレジスタ オペランドを利用するものがあります。
| 15 | 9 | 8 | 6 | 5 | 3 | 2 | 0 | ||||||||
| オペコード | レジ | ソース/宛先 | 登録する | ||||||||||||
レジスタ ペア (以下、「(Reg, Reg+1)」と表記) が使用される場合、最初のレジスタにはオペランドの下位部分が格納され、偶数番号のレジスタである必要があります。次に大きい番号のレジスタには、オペランドの上位部分 (または剰余) が格納されます。例外は乗算命令です。Reg は奇数でもかまいませんが、その場合、結果の上位 16 ビットは格納されません。
| オペコード | ニモニック | 手術 |
|---|---|---|
| 070 | マルチ | 符号付き乗算:(Reg, Reg+1) ← Reg × Src |
| 071 | 部門 | 符号付き除算:Compute (Reg, Reg+1) ÷ Src; Reg ← quotient; Reg+1 ← remainder |
| 072 | 灰 | 算術シフト:if Src<5:0> < 0 then Reg ← Shift-right(Reg, -Src<5:0>) else Reg ← Shift-left(Reg, Src<5:0>) |
| 073 | アシュック | 算術シフト結合(32ビット):if Src<5:0> < 0 then (Reg, Reg+1) ← Shift-right((Reg, Reg+1), -Src<5:0>) else (Reg, Reg+1) ← Shift-left((Reg, Reg+1), Src<5:0>) |
| 074 | 排他的論理和 | 排他的論理和:Dest ← Dest ⊻ Reg |
単一オペランド命令
上位10ビットは実行する演算を指定し、ビット15は通常、バイトアドレス指定とワードアドレス指定を選択します。6ビットの1つのグループで、上記で定義したオペランドを指定します。
| 15 | 6 | 5 | 3 | 2 | 0 | ||||||||||
| オペコード | ソース/宛先 | 登録する | |||||||||||||
| オペコード | ニモニック | 手術 |
|---|---|---|
| 0001 | ジャンプ | ジャンプ:PC ← ea(Src) |
| 0003 | 綿棒 | 単語のバイトをスワップ: |
| 0050 | CLRR | クリア:Dest ← 0 |
| 1050 | CLRB | |
| 0051 | コム | 補体:Dest ← -1 - Dest |
| 1051 | 櫛 | |
| 0052 | 株式会社 | インクリメント:Dest ← Dest + 1 |
| 1052 | INCB | |
| 0053 | 12月 | デクリメント:Dest ← Dest − 1 |
| 1053 | 12CB | |
| 0054 | ネガティブ | 否定:Dest ← 0 - Dest |
| 1054 | NEGB | |
| 0055 | ADC | キャリーを追加:Dest ← Dest + C flag |
| 1055 | ADCB | |
| 0056 | SBC | 繰り上がりを減算する:Dest ← Dest - C flag |
| 1056 | SBCB | |
| 0057 | TST | テスト:Src ∧ Src |
| 1057 | TSTB | |
| 0060 | ROR | 右に回転:C ← S0; S0-14 ← S1-15; S15 ← C |
| 1060 | ロブ | バイトを右に回転:C ← S0; S0-6 ← S1-7; S7 ← C |
| 0061 | ロール | 左に回転:C ← S15; S1-15 ← S0-14; S0 ← C |
| 1061 | ロルブ | 左にバイトを回転:C ← S7; S1-7 ← S0-6; S0 ← C |
| 0062 | 自動応答 | 算術右シフト:Dest ← Dest ÷ 2 |
| 1062 | ASRB | |
| 0063 | アメリカ手話 | 算術左シフト:Dest ← Dest x 2 |
| 1063 | ASLB | |
| 1064 | MTPS | PSWに移動:PSW ← Src |
| 0065 | MFPI | 前の I スペースから移動:−(SP) ← Src |
| 1065 | MFPD | 前のDスペースから移動:−(SP) ← Src |
| 0066 | MTPI | 前の I スペースに移動:Dest ← (SP)+ |
| 1066 | MTPD | 前のDスペースに移動:Dest ← (SP)+ |
| 0067 | SXT | サイン拡張:if N flag = 0 then Dest ← 0 else Dest ← -1 |
| 1067 | MFPS | PSWからの移動:Dest ← PSW |
分岐命令
ほとんどの分岐命令では、分岐が行われるかどうかは条件コードの状態に基づいて決定されます。分岐命令の前には、通常、2オペランドのCMP(比較)命令、BIT(ビットテスト)命令、または1オペランドのTST(テスト)命令が置かれます。算術命令と論理演算命令も条件コードを設定します。x86アーキテクチャのIntelプロセッサとは異なり、MOV命令も条件コードを設定するため、分岐命令を使用して、移動された値がゼロか負かによって分岐することができます。
命令の上位バイトは操作を指定します。ビット9から15はオペコード、ビット8は分岐を実行する条件コード計算の値です。下位バイトは、プログラムカウンタの現在位置からの相対的な符号付きワードオフセットです。これにより、コード内で前方および後方への分岐が可能になります。
| 15 | 9 | 8 | 7 | 0 | |||||||||||
| オペコード | C | オフセット | |||||||||||||
| オペコード | C | ニモニック | 状態または操作 |
|---|---|---|---|
| 000 | 1 | BR | ブランチは常にPC ← PC + 2 × Sign-extend(Offset) |
| 001 | 0 | BNE | 等しくない場合は分岐Z = 0 |
| 001 | 1 | ベック | 等しい場合は分岐Z = 1 |
| 002 | 0 | BGE | より大きいか等しい場合に分岐(N ⊻ V) = 0 |
| 002 | 1 | BLT | より小さい場合は分岐(N ⊻ V) = 1 |
| 003 | 0 | BGT | より大きい場合は分岐(Z ∨ (N ⊻ V)) = 0 |
| 003 | 1 | BLE | 以下の場合分岐(Z ∨ (N ⊻ V)) = 1 |
| 100 | 0 | BPL | プラスの場合は分岐N = 0 |
| 100 | 1 | BMI | マイナスの場合は分岐N = 1 |
| 101 | 0 | BHI | 上位の場合は分岐(C ∨ Z) = 0 |
| 101 | 1 | ブロス | 下位または同じ場合は分岐(C ∨ Z) = 1 |
| 102 | 0 | BVC | オーバーフロークリアの場合に分岐V = 0 |
| 102 | 1 | BVS | オーバーフローセットの場合に分岐V = 1 |
| 103 | 0 | BCC または BHIS | キャリーがクリアの場合は分岐、または、より大きいか同じ場合は分岐C = 0 |
| 103 | 1 | BCSまたはBLO | キャリーセットの場合は分岐、または下位の場合は分岐C = 1 |
分岐命令の範囲が限られているため、コードが長くなると、一部の分岐のターゲットアドレスが到達不能になることがあります。プログラマーは、1ワードのBR命令を次のグループの2ワードのJMP命令に変更します。JMPには条件分岐がないため、BEQ命令をJMPを迂回するBNE命令に変更します。
SOB(Subtract One and Branch)は、条件分岐命令の1つです。指定されたレジスタの値が1減算され、結果が0でない場合、6ビットワードオフセットに基づいて逆方向の分岐が行われます。
| 15 | 9 | 8 | 6 | 5 | 0 | ||||||||||
| オペコード | レジ | オフセット | |||||||||||||
| オペコード | ニモニック | 手術 |
|---|---|---|
| 077 | すすり泣き | Subtract One and Branch: Reg ← Reg - 1; if Reg ≠ 0 then PC ← PC - 2 × Offset |
サブルーチン命令
JSRはサブルーチンを呼び出します。6ビットのグループがアドレッシングモードを指定します。JSR命令は、スタック上の任意のレジスタを退避し、そのレジスタに戻りアドレスをロードすることができます。この機能を必要としないプログラムでは、レジスタ(JSR PC, address)としてPCを指定し、ルーチンは を使って戻りますRTS PC。
例えば、ルーチンが で呼び出された場合JSR R4, address、R4 の古い値がスタックの先頭にプッシュされ、JSR の直後のアドレス(通常は戻りアドレス)が R4 に格納されます。ただし、ルーチンは (R4)+ を指定することでインラインで記述された値にアクセスしたり、@(R4)+ を指定することでインラインポインタにアクセスしたりできます。自動インクリメントはこれらのデータを通過させ、呼び出し元のコードが再開される位置まで移動します。いずれの場合も、このようなルーチンはRTS R4呼び出し元に戻るように指定します。
JSR PC,@(SP)+PC の内容をスタックの最上位要素と交換する形式は、コルーチンの実装に使用できます。ルーチンがコルーチンのエントリアドレスをスタックに配置すると、実行時にJSR PC,@(SP)+PCがスタックに保存され、コルーチンにジャンプします。その後、両方のコルーチンは追加のJSR PC,@(SP)+命令を使用して、もう一方のコルーチンの中断箇所にジャンプできます。これにより、2つのルーチンは制御を交換し、前回の交換時点から再開できます。
| 15 | 9 | 8 | 6 | 5 | 3 | 2 | 0 | ||||||||
| オペコード | レジ | ソース | 登録する | ||||||||||||
| オペコード | ニモニック | 手術 |
|---|---|---|
| 004 | JSR | サブルーチンにジャンプ:-(SP) ← Reg; Reg ← PC; PC ← Src |
PC移動先の値はReg、JSR 命令の後のアドレスです。
| 15 | 3 | 2 | 0 | ||||||||||||
| オペコード | レジ | ||||||||||||||
| オペコード | ニモニック | 手術 |
|---|---|---|
| 00020 | RTS | サブルーチンからの戻り:PC ← Reg; Reg ← (SP)+ |
| 15 | 6 | 5 | 0 | ||||||||||||
| オペコード | んん | ||||||||||||||
| オペコード | ニモニック | 手術 |
|---|---|---|
| 0064 | マーク | サブルーチンから戻り、スタックエントリを破棄します。SP ← SP + (2 x nn), PC ← R5, R5 ← (SP)+ |
MARK は、サブルーチンを終了するときに、スタック上のパラメータを削除するために使用されます。 MARK は、呼び出し元によってリターン スタックに配置され、後でリターン ルーチンによってスタック上で直接実行されるという点で異なります。 最初に、呼び出し元はスタックに R5 をプッシュします。 次に、最大 63 ワードの引数をスタックに置くことができます。 呼び出し元は、引数の数を MARK オペコードに追加し、その結果をスタックにプッシュします。 SP の値は R5 にコピーされます。 最後に、 a がJSR PC,address実行されてサブルーチンが呼び出されます。 コードの実行後、サブルーチンは で終了しますRTS R5。これにより、R5 の値 (スタック上の MARK 命令を指す) が PC にロードされ、呼び出し元の戻りアドレスが R5 にポップされます。 MARK 命令が実行されます。 MARK は引数の数に 2 を掛け、それを SP に追加して引数を削除し、 と同等のものを呼び出し元に返しますRTS R5。 MARK 命令は、その複雑な操作を SP への ADD で置き換えることができるため、ほとんど使用されません。[6]
トラップ指示
| 15 | 9 | 8 | 7 | 0 | |||||||||||
| オペコード | S | オペコード | |||||||||||||
| オペコード | S | ニモニック | 手術 |
|---|---|---|---|
| 104 | 0 | 救急救命士 | エミュレータトラップ:-(SP) ← PS; -(SP) ← PC; PC ← (30); PS ← (32) |
| 104 | 1 | トラップ | 一般的な罠:-(SP) ← PS; -(SP) ← PC; PC ← (34); PS ← (36) |
| 15 | 0 | ||||||||||||||
| オペコード | |||||||||||||||
| オペコード | ニモニック | 手術 |
|---|---|---|
| 000002 | RTI | 割り込みからの復帰:PC ← (SP)+; PS ← (SP)+ |
| 000003 | BPT | ブレークポイントトラップ:-(SP) ← PS; -(SP) ← PC; PC ← (14); PS ← (16) |
| 000004 | IoT | I/Oトラップ:-(SP) ← PS; -(SP) ← PC; PC ← (20); PS ← (22) |
| 000006 | RTT | 罠からの帰還:PC ← (SP)+; PS ← (SP)+ |
トラップと例外ベクトルのアドレス割り当て
| ベクター | 状態 |
|---|---|
| 000000 | (予約済み) |
| 000004 | 不正命令、バスエラー、スタック制限 |
| 000010 | 予約命令 |
| 000014 | BPT命令、トレーストラップ |
| 000020 | IOT指導 |
| 000024 | 停電 |
| 000030 | EMT指示 |
| 000034 | TRAP命令 |
| 000114 | パリティエラー |
| 000244 | 浮動小数点例外 |
| 000250 | メモリ管理の欠陥 |
その他の指示
| 15 | 0 | ||||||||||||||
| オペコード | |||||||||||||||
| オペコード | ニモニック | 手術 |
|---|---|---|
| 000000 | 停止 | プロセッサを停止:Halt execution before next instruction |
| 000001 | 待って | 割り込みを待つ:Halt execution before next instruction; Resume execution at next interrupt handler |
| 000005 | リセット | UNIBUSをリセットします:Assert INIT on UNIBUS for 10 ms; All other devices reset to power up state |
| 000240 | いいえ | 操作なし:Do nothing |
条件コード操作
| 15 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ||||||||
| オペコード | 1 | S | 北 | Z | V | C | |||||||||
| オペコード | S | ニモニック | 手術 |
|---|---|---|---|
| 0002 | 0 | Ccc | クリア条件コード:Clear codes according to N, Z, V, C bits |
| 0002 | 1 | Scc | 条件コードを設定します。Set codes according to N, Z, V, C bits |
プロセッサステータスワード(PSW)の4つの条件コードは
- Nは負の値を示す
- Zはゼロ(等しい)状態を示す
- Vはオーバーフロー状態を示し、
- C はキャリー条件を示します。
このグループの命令は、Digitalが「マイクロプログラム」と呼んだものでした。命令ワード内の1ビットが1つの条件コードを参照していました。アセンブラはすべての組み合わせを指定する構文を定義していませんでした。しかし、SCCとCCCというシンボルは、それぞれ4つの条件コードすべてをセットまたはクリアする命令を組み立てました。
条件コード(オペコード000240と000260)をクリアまたはセットしないことは、実質的にノーオペレーション命令とみなすことができます。実際、NOPニーモニックは000240にアセンブルされます。
一貫性のない指示
PDP-11の寿命を通じて、命令の実装やアドレッシングモードの組み合わせに微妙な差異が生じましたが、どの実装も正しいとはみなされませんでした。これらの不一致はPDP-11の通常の使用には影響しませんでした。例えば、命令においてMOV R5,-(R5)、R5の値がソースとして使用される前に自動デクリメントされるかどうかは、モデルによって異なります。[7]
オプションの命令セット
拡張命令セット(EIS)
EIS は 11/35/40 および 11/03 ではオプションであり、新しいプロセッサでは標準として提供されました。
- MUL、DIVは整数オペランドをレジスタペアに乗算および除算します。
- ASH、ASHC算術演算 – レジスタまたはレジスタペアをシフトします。正の数の場合は左にシフトし、負の数の場合は右にシフトします。
浮動小数点命令セット(FIS)
FISはPDP-11/35/40および11/03のオプションです。単精度浮動小数点は、レジスタオペランドでアドレス指定されたスタック上で演算されます。上位13ビットは、実行する演算を指定します。3ビットのフィールドは、浮動小数点オペランドのスタックポインタとして使用するレジスタを指定します。各浮動小数点は2ワードで構成され、各浮動小数点命令は2つの浮動小数点数を演算し、結果として1つの浮動小数点数を返します。選択されたスタックポインタは、各演算の後に4ストライドずつインクリメントされます。
| 15 | 3 | 2 | 0 | ||||||||||||
| オペコード | レジ | ||||||||||||||
| オペコード | ニモニック | 手術 |
|---|---|---|
| 07500 | ファッド | フローティング追加:4(Rn) ← 4(Rn) + (Rn), Rn ← Rn + 4 |
| 07501 | FSUB | 浮動小数点減算:4(Rn) ← 4(Rn) - (Rn), Rn ← Rn + 4 |
| 07502 | FMUL | 浮動小数点乗算:4(Rn) ← 4(Rn) × (Rn), Rn ← Rn + 4 |
| 07503 | FDIV | 浮動分割:4(Rn) ← 4(Rn) ÷ (Rn), Rn ← Rn + 4 |
浮動小数点プロセッサ(FPP)
これは、11/45 およびその後のほとんどのモデルでオプションとして提供された浮動小数点プロセッサ オプションでした。
- 浮動小数点ステータスレジスタの単精度/倍精度ビットによって選択される単精度または倍精度オペランドに対する完全な浮動小数点演算
- IEEE 754形式の前身である単精度浮動小数点データ形式:符号ビット、8ビット指数、隠しビット24を含む23ビット仮数
商用命令セット(CIS)
CISまたはCIS11として知られる商用命令セットは、COBOLおよびDIBOLで使用される文字列命令と2進化10進数(BCD)命令を追加します。これは、11/23/24ではオプションのマイクロコードによって実装され、[8] [9]、11/44ではアドインモジュールによって実装され、[10]および11/74のあるバージョンではアドインモジュールによって実装されました。[要出典]
文字列は、2つの16ビット整数で表され、汎用レジスタのいずれか2つに格納されるか、メモリ内の連続する位置に格納される2つの16ビット値として表されます。1つは「n」で、最大64KBの長さを表します。もう1つは「A」で、メモリ内の文字データの先頭へのポインタです。n/Aのペアは、文字列の位置と長さを表します。[11] : 195 : 406
文字列コピー操作には、MOVEC、MOVTC、MOVRCがあります。MOVECは、メモリ内の文字データを、1つ目のn/Aペアで示される位置から2つ目のn/Aペアで示される位置へコピーします。どちらの操作もレジスタに格納され、3つ目のレジスタには下位8ビットにフィル文字、上位8ビットにゼロが格納されます。MOVECIも同様の操作を行いますが、位置とフィル文字はレジスタではなくメモリに格納されます。すべての移動命令において、ソースが宛先より短い場合は、宛先にフィル文字が埋め込まれ、ソースが長い場合は切り捨てられます。いずれの場合も、プロセッサステータスフラグによってその旨が示されます。MOVRC/MOVRCIも同様ですが、逆方向にコピーすることで、元の文字列を逆順に宛先に格納します。[11] : 409
MOVTC/MOVTCIは、コピー時に256バイトのルックアップテーブルを用いて文字を変換します。このテーブルの先頭は、MOVTCの別のレジスタ、またはMOVTCIのメモリ内の16ビットポインタによって指し示されます。変換では、ソース文字列の文字値をインデックス番号として用い、変換テーブル内のそのインデックスの値を宛先文字列にコピーします。このテーブルにマッピングされたEBCDICコードに対応するASCII文字コードを配置することで、EBCDICからASCIIへの変換に使用できます。文字「E」はASCIIでは69番、EBCDICでは197番です。したがって、EBCDICからASCIIに変換するには、69番を197番の位置に持つ256バイトのテーブルを作成します。MOVTCが呼び出され、元の文字列で197番を見つけると、テーブルの197番の位置を参照して97番を見つけ、それを新しい文字列に出力することで変換を実行します。[11] : 456–458
文字列の比較は CMPC によって処理され、CMPC は 2 つの文字列の比較結果に基づいてプロセッサ条件コードを設定します。LOCC は文字列内で最初に出現する文字を見つけ、SKPC は一致しない最初の文字を検索します。これは、たとえば文字列の先頭の空白を削除するために使用されます。SCANC と SPANC は LOCC や SKPC に似ていますが、マスクされた文字セット内の任意の文字と一致します。たとえば、これを使用して、VT、LF、CR などの改行文字の次の出現を検索できます。文字セットは 256 バイトのテーブルで、サブセットに分割されています。[a]これらは変換テーブルに似ており、最初のワードの下位 8 ビットがマスクを形成し、2 番目のワードがテーブルの先頭を指します。マスクは、比較中に最大 8 つのサブセットのどれが文字セットの一部であるかを選択します。このシステムを使用すると、大文字、小文字、数字などの文字セットを定義し、マスクを介して簡単に結合することができます。たとえば、大文字と小文字のサブセットを選択して、完全な文字セットを生成します。[11]
CISには、BCD数値を操作するためのデータ型と命令のセットも含まれています。このデータも2つの16ビットレジスタまたはメモリ位置で表され、2番目の数値は文字列の場合と同じAです。最初のワードには、データの文字列表現を記述する4つのフィールドが含まれます。これらのフィールドは、パックおよびアンパックの数字、符号の処理、そして0~16バイトの文字列の長さを含みます。DECでは、1バイトあたり1桁のアンパックデータを「数値文字列」と呼んでいました。1バイトあたり2桁のBCD数値を持つパックデータを使用すると、16バイトの文字列に最大32桁のBCD数値を保持できます。命令には、パックおよびアンパックデータ用のADDP/ADDN、SUBP/SUBN、ASHP/ASHN(算術シフト)、CMPP/CMPN(比較)などがあります。パックデータのみで使用できるのは、MULPとDIVPです。 CISには、BCD数値をパック形式とアンパック形式の間で変換したり、バイナリ値との間で変換したりするための6つの命令セット(CVT)も含まれています。[11]
最後の命令セットは、複数のMOVを必要としないように、2つまたは3つの2ワード文字列記述子を内部レジスタにロードするために提供されています。[11]
プロセッサステータスワード(PSW)へのアクセス
PSWはメモリアドレス177,776にマッピングされており、他のデータと同様に処理できます。唯一の例外はLSI-11で、PSWはメモリ空間にマッピングされません。初期のPDP-11を除くすべてのPDP-11に搭載されている命令は、プログラムがレジスタに直接アクセスできるようにします。
- SPL(優先レベルを設定する)
- MTPS(プロセッサステータスに移動)
- MFPS (プロセッサステータスから移動)
他のメモリ空間へのアクセス
複数の命令空間とデータ空間を提供するPDP-11では、非直交Move命令群によって他の空間へのアクセスが可能になります。例えば、ランタイムサービスコールを処理するオペレーティングシステムのルーチンは、これらの命令を使用して呼び出し元と情報を交換します。
- MTPD(前のデータ空間へ移動)
- MTPI(前の命令空間への移動)
- MFPD(前のデータ空間からの移動)
- MFPI(前の命令空間からの移動)
サンプルコード
次の PDP-11アセンブリTOUPPERソース コードは、ヌルで終了するASCIIZ文字列を大文字に
変換するサブルーチンのものです。
000000000000 010046000002 010146000004 016600 000006000010 112001000012 001414000014 120127 000172 000020 003373000022 120127 000141000026 002776000030 142740 000040000034 000766000036 012601000040 012600000042 000207 | ; TOUPPER: ; ヌル終端 ASCII 文字列をスキャンし、すべてのアルファベット文字を大文字に変換します。; ; エントリ スタック パラメータ、; [SP+2] = 対象文字列のアドレス; [SP+0] = 戻りアドレス; TOUPPER: MOV R0 , - ( SP ) ; いくつかのレジスタを保存しますMOV R1 , - ( SP ) MOV 6 ( SP ), R0 ; 文字列のアドレスを取得します LOOP: MOVB ( R0 ) + , R1 ; 文字を取得しますBEQ DONE ; ゼロの場合は完了ですCMPB R1 , #'z ; a と z の間ですか? BGT LOOP ; そうでない場合は次の文字を取得しますCMPB R1 , #'a BLT LOOP BICB #40,-(R0) ; a と z の間であれば、AZ にしますBR LOOP 完了: MOV ( SP ) + , R1 ; レジスタを復元MOV ( SP ) + , R0 RTS PC ; サブルーチンから戻る |
次の PDP-11アセンブリソース コードは、PDP-11 のアドレス指定モードを使用して、汎用レジスタをまったく使用せずに同じルーチンを記述する方法を示しています。
000000000000 105776 000002000004 001416000006 127627 000002 000172000014 003008000016 127627 000002 000141000024 002403000026 142776 000040 000002000034 005266 000002000040 000757000042 000207 | ; TOUPPER2: ; ヌル終端 ASCII 文字列をスキャンし、すべての英字を大文字に変換します。; ; エントリ スタック パラメータ、; [SP+2] = ターゲット文字列のアドレス; [SP+0] = 戻りアドレス; TOUPPER2: TSTB @ 2 ( SP ) ; スタック上のアドレスの文字をテストしますBEQ DONE ; ゼロの場合、完了CMPB @ 2 ( SP ), #'z ; a と z の間ですか? BGT NEXTC ; そうでない場合、次の文字を指しますCMPB @ 2 ( SP ), #'a BLT NEXTC BICB #40,@2(SP) ; a と z の間である場合、それを AZ にしますNEXTC: INC 2 ( SP ) ; スタック上の次の文字のアドレスをインクリメントしますBR TOUPPER2 完了: RTS PC |
スピード
PDP-11 プロセッサの速度は、モデル、メモリ構成、オペコード、およびアドレッシング モードによって異なります。命令のタイミングは、命令自体のフェッチ/実行と、ソースおよびデスティネーションのアクセス時間の最大 3 つの要素で構成されます。最後の 2 つの要素は、アドレッシング モードによって異なります。たとえば、PDP-11/70 (1975 年頃) では、ADD x (R m ), y (R n ) という形式の命令のフェッチ/実行時間は 1.35マイクロ秒で、ソースおよびデスティネーションの時間はそれぞれ 0.6 マイクロ秒だったので、命令の合計時間は 2.55 マイクロ秒でした。アドレス指定されたメモリがキャッシュにない場合は、1.02 マイクロ秒が追加されます。レジスタ間の ADD R m ,R n は、キャッシュから 0.3 マイクロ秒で実行できます。浮動小数点処理は、CPU と浮動小数点プロセッサの間で重複する部分があるためさらに複雑ですが、一般に、浮動小数点処理は大幅に遅くなります。単精度浮動小数点加算命令は2.4~5.5マイクロ秒に加え、オペランドのフェッチ時間がかかります。[12]
割り込み
PDP-11は、プロセッサステータスワード(PSW)の3ビットで指定される0から7までの優先度レベルで動作します。ハイエンドモデルは、PSWの2ビットに基づいて、カーネル(特権モード)、ユーザー(アプリケーション)、そして場合によってはスーパーバイザモードのいずれかを選択して動作できます。
割り込みを要求するには、バス デバイスはプロセッサが応答するまで、4 つの共通バス ライン BR4 から BR7 のいずれかをアサートします。数値が大きいほど緊急度が高く、プロセッサが迅速に応答しないと、データが失われたり、目的のセクターが読み取り/書き込みヘッドと接触せずに回転したりする可能性があります。プリンタの次の文字の準備は、無期限に準備完了状態となるため、最も優先度が低くなります (BR4)。プロセッサがレベル 5 で動作している場合は、BR6 と BR7 の順になります。プロセッサがレベル 3 以下で動作している場合は、すべての割り込みを許可しますが、レベル 7 の場合は、割り込みを許可しません。許可されないバス要求は失われるのではなく、単に延期されます。サービスを必要とするデバイスは、バス要求をアサートし続けます。
割り込みがプロセッサの優先度を超えると、プロセッサは対応するバス許可(BG4~BG7)をアサートします。バス許可ラインは共通ラインではなく、デイジーチェーン構造になっています。各ゲートの入力は、チェーン内の前のゲートの出力です。ゲートは各バスデバイス上に存在し、物理的にプロセッサに近いデバイスがデイジーチェーンの先頭に位置します。デバイスがバス許可要求を出した場合、バス許可入力を検知すると、バスを制御していると判断し、バス上の次のデバイスに許可信号を渡しません。デバイスがバス許可要求を出さなかった場合、バス許可入力をバス許可出力に伝播させ、最も近いデバイスに応答の機会を与えます。(デバイスがプロセッサボードの隣接スロットを占有していない場合は、空きスロットに挿入された「許可継続カード」がバス許可ラインを伝播させます。)
バスの制御権を獲得すると、デバイスはバス要求を破棄し、割り込みサービス ルーチン アドレスと新しい PSW を指す 2 ワード ベクターのメモリ アドレスをバス上に配置します。プロセッサは古いプログラム カウンタ (PC)と PSW を保存し、カーネル モードに入り、指定されたベクターから新しい値をロードします。BR6 のデバイスの場合、ベクター内の新しい PSW は通常、新しいプロセッサ優先度として 6 を指定するため、プロセッサはサービス ルーチン中に緊急度のより高い要求 (BR7) を受け入れますが、優先度が同じか低い要求は延期します。プロセッサは新しい PC を使用して、割り込み元のデバイスのサービス ルーチンにジャンプします。そのルーチンはデバイスを操作し、少なくとも割り込みの原因となった状態を削除します。ルーチンは RTI (割り込みからの復帰) 命令で終了し、この命令はプロセッサが割り込みを許可する直前の PC と PSW を復元します。
バス要求が行われ、バス許可に応答するデバイスがない場合、プロセッサはタイムアウトし、ハードウェアの不良を示唆するトラップを実行します。
MACRO-11アセンブリ言語

MACRO-11はPDP-11用のアセンブリ言語です。マクロ機能のないPDP-11アセンブリ言語の初期バージョンであるPAL-11(Program Assembler Loader)の後継です。MACRO-11は、すべてのDEC PDP-11オペレーティングシステムでサポートされています。PDP-11 Unixシステムには、構造的にはMACRO-11に類似したアセンブラ(「as」と呼ばれます)も含まれていますが、構文が異なり、機能も少なくなっています。
参照
- WD16、PDP-11 ISAの拡張
注記
- ^ 1 バイトのマスクは、それぞれ 32 文字のサブセットが 8 つあることを意味しますが、これはドキュメントに明確に記載されていません。
参考文献
- ^ pdp11プロセッサハンドブック pdp11/04/34a/44/60/70 (PDF) . 1979年12月. 2025年7月20日閲覧。
- ^ 「第7章」プロセッサハンドブックpdp11/05/10/35/40 (PDF) 1973年12月。
- ^ pdp11プロセッサハンドブック pdp11/04/34a/44/60/70 (PDF) 1979年12月 p.421.
- ^ Bell, Gordon ; Strecker, WD「PDP-11から学んだこと - VAXとAlphaから学んだこと」(PDF)(レポート) 。 2025年6月26日閲覧。
- ^ Dotzel, Günter (1986). 「LSI-11、RT-11、メガバイトのメモリ、そしてModula-2/VRSについて」(PDF) .
- ^ 「PDP11/40プロセッサハンドブック」Digital Equipment Corporation . 2024年7月16日閲覧。
- ^ 「PDP-11命令セットの不整合」stackexchange.com . 2025年10月19日閲覧。1983 年の『PDP-11 アーキテクチャ ハンドブック』の付録 B「PDP-11 ファミリーの相違点」を引用しています。
- ^ KDF11-BA CPUモジュール ユーザーズガイド(PDF) . 1982年12月. p. 1-8.
- ^ PDP-11/24システム技術マニュアル(PDF) . 1981年12月. p. 4-3. EK-11024-TM-001.
- ^ KE44-ACISP ユーザーズガイド(PDF) . 1981年12月. EK-KE44A-UG-002.
- ^ abcdef pdp11 プロセッサハンドブック pdp11/04/34a/44/60/70 (PDF) 1979年12月。
- ^ DEC PDP-11/70 プロセッサ ハンドブック、1975 年、付録 C、命令タイミング。
さらに読む
- エックハウス・ジュニア、リチャード・H.、モリス、L.・ロバート (1979). 『マイクロコンピュータシステムの構成、プログラミング、およびアプリケーション (PDP-11)』ニュージャージー州エングルウッド・クリフス:プレンティス・ホール出版. ISBN 0-13-583914-9。
- シンガー、マイケル(1980年)『PDP-11 アセンブラ言語プログラミングとマシン構成』ニューヨーク:ジョン・ワイリー・アンド・サンズ、ISBN 9780471049050。
- pdp11プロセッサハンドブック - pdp11/05/10/35/40 (PDF) . Digital Equipment Corporation. 1973.
- pdp11プロセッサハンドブック - pdp11/04/34a/44/60/70 (PDF) . Digital Equipment Corporation. 1979.
外部リンク
- PDP-11 プロセッサ ハンドブック(Gordon Bell の 1969 年版、bitsavers の 1979 年版)
- 16ビットミニコンピュータPDP-11シリーズの保存
- ゴードン・ベルとビル・ストレッカーの1975年の論文「PDP-11から学んだこと」
- PDP-11 エミュレータ Ersatz-11
- Gordon Bell のサイトにあるその他の論文とリンク。
- ファズボール