2024-09-08

PDP-11のTRAP命令のバイナリ表現が104400から104777の256個もあるのは何故だろう

PDP-11/40上で動作するUNIX V6のlow.sを解析するため、PDP-11の命令について調べています。low.sの中ではTRAP命令は使われていません。ただし、紛らわしい事に、m40.sの中で定義されている「trap」という番地を参照しているので、うっかりするとTRAP命令が使われていると誤解してしまうかもしれません。


PDP-11 processor handbookでTRAP命令を確認すると、対応するバイナリ表現が104400から104777までの256個もあります。普通なら、BPT命令なら000003とか、IOT命令なら000004などのように、1対1に対応しているはずです。TRAP命令だけではなく、EMT命令も104000から104377までの256個用意されているので、何か意図がありそうな気がします。

 

EMT命令、TRAP命令、BPT命令、IOT命令は、PDP-11においては、それぞれの命令に専用のTRAP VECTORを介して、それぞれのルーチンに飛ぶようになっています。BPT命令なら014番地、IOT命令なら020番地、EMT命令なら030番地、TRAP命令なら034番地です。各命令に1つずつしか用意されていません。と言うことは、EMT命令やTRAP命令のバイナリ表現が256種類あったとしても、全て同じTRAP VECTORが使われる訳ですから、区別できません。しかも、256種類のバイナリ表現があり得るとしても、その値がレジスタに格納される訳でもないので、普通にプログラミングしているだけでは、256種類のバイナリ表現の違いを認識できません。どうして、こんなことになっているのでしょうか。

 

同じような疑問を感じた人は他にもいるようで「Using the TRAP instruction」という記事がありました。ロジックを工夫すれば、256種類あるバイナリ表現の中で何が使われたのかを実行時に識別することは出来るようです。

 

PDP-11の命令体系において何か意図してTRAP命令用のバイナリ表現として256種類を用意したのであれば、その区別がレジスタ参照で取り出せるようになっているべきではないかと思います。そうなっていないということは、命令体系上の方針としては、256種類を使い分ける必要はないと思っていたということでしょうか。

 

PDP-11の命令体系はよくできているという評価を得ているようです。私自身としては、まだPDP-11を学び始めたばかりなので、それほど深く理解している訳ではありませんが、多彩なアドレッシングモードが多くの命令で同じように使えるようなので、よく出来ているCPUだと思わなくもありません。そうであったとしても、TRAP命令とEMT命令については、謎めいているという印象です。

0 件のコメント:

コメントを投稿