HP 3000
今日、多くの命令セットは汎用レジスタモデルに基づいている。HP 3000 のプロセッサとメモリのアーキテクチャはスタックマシンモデルに基づいている。これはバロース B5000に影響されたと言われている。レジスタ数は少なく(例えば HP 1000 では AX レジスタと BX レジスタの2本だけ)、オペランドは局所変数やリターンアドレスを置くスタックと同じスタックに置かれる。従って、例えば次のようなコードがあったとする。
これは次のコードと同じである。
サブルーチン呼び出しの call 命令は固定個の引数しか取れない。そのため、C言語コンパイラの実装は難しかった(実装されなかったわけではない)。
16ビットのマイクロプログラム方式の機種(Series I, II, III, 30, 33, 39, 40, 42, 44, 48, 52, 58, 64, 68, 70, 37, ...)は、16ビットのワード単位のアドレスにバイトアドレス指定を加え、セグメント方式のスタックマシン型命令セットアーキテクチャ (ISA) であった。約 214 種の命令のほとんどは16ビット長である。スタック操作命令は16ビットワードに2つの操作を詰め込むことができ、一部の命令が32ビットである。
CISC実装の変遷は以下の通り。
III: スタックのトップ4ワードがレジスタ。
コードとデータは可変長セグメントに格納される。コードはリードオンリーでリエントラントであり、最大 32,760 バイトまで、データは最大 65,528 バイトまでである。MPE はコードセグメントをプログラムファイルから読み込み、セグメント化された共有ライブラリ (SL) ファイルを必要に応じて読み込む。1つのプロセスには最大 256 セグメントまで持たせることができる。
コードセグメントは最大 32KB だが、ルーチン呼び出し時にはセグメント番号とセグメント内のルーチン番号を指定するため、1つのプログラム内に理論上最大 64K 個のルーチンが存在可能であった。当時の16ビットミニコンピュータではアドレス空間が全部で 64K であることが多かった。データセグメントとスタックセグメントは最大64Kであった。共有ライブラリには共有のデータは存在せず、各プロセス専用のデータセグメントを使用する。
システムのプログラミングはALGOL系の言語 SPL で行われるが、インラインアセンブラが利用可能であり、命令セットへの直接アクセスが可能である。HP 3000 の標準端末 HP 2640 シリーズはキャラクタモードだけでなく、フォームからのデータ入力を行うブロックモードをサポートしていた。