ウィーラージャンプは、戻りアドレスを保存するためのハードウェアサポートを備えていなかった初期のコンピュータで使用されていたサブルーチン呼び出し手法の一種です。この概念は、1950年代に先駆的なEDSACマシンの開発に携わっていたデイビッド・ウィーラーによって考案されました。 [ 1 ] EDSACはサブルーチンを念頭に置いて構築されておらず、戻りアドレスを容易に保存できる 適切なプロセッサレジスタやハードウェアスタックが不足していました。
ウィーラーの解決策は、サブルーチンコードの記述方法に特有のものでした。これを実装するために、サブルーチンの最終行は「このアドレスにジャンプ」という命令であり、通常はその後ろにメモリアドレスが続きます。ウィーラーのサブルーチンでは、このアドレスは通常、ダミーの数値、例えば0に設定されていました。
ルーチンを呼び出すには、呼び出し元のアドレスをアキュムレータに格納し、その後、コードはルーチンの開始点にジャンプします。ルーチンの最初の命令は、アキュムレータの値に基づいて戻りアドレスを計算します。戻りアドレスは通常、次のメモリ位置なのでインクリメントで十分です。そして、その結果を事前に確保しておいたダミーアドレスに書き込みます。ルーチンが実行されるにつれて、自然にルーチンの終わりに到達し、「戻りアドレスにジャンプ」という指示が出されます。
メモリへの書き込みはレジスタアクセスに比べて遅いため、この手法は特に高速ではありません。また、再帰処理も表現できません。[ 2 ]この種の処理のための新しいレジスタの追加は、 EDSAC 2の主要な設計目標でした。
この例では、1 つのレジスタ A を持つ単純なバイト指向のアキュムレータベースのマシンに対して 擬似アセンブラ言語を使用する手法を示します。
'サブルーチンを呼び出す準備をする 10 COPY PC TO A ' プログラムカウンタ(10)をアキュムレータにコピーする 11 JUMP ' ジャンプして... 12 70 ' ... 場所 70 ...さらに多くの行... 70 ADD CONST ' 次の値を累計器に追加します... 71 3 ' ... 元のPC値の3つ先 72 STORE ' 累算器に値を格納します... 73 91 ' ... 確保されたメモリ位置 ...実際のサブルーチンを実行する行... 90 JUMP ' 戻る... 91 0 ' ... 13に置き換えられます
このコードが完了すると、アドレス 90 の JUMP 命令は、当然、サブルーチンの次の命令である位置 13 に戻ります。