ぼくのかんがえたさいきょうCPU:EVAL命令詳細

 EVAL命令は指定したレジスタの内容を命令列として実行する。用途は自己書き換え命令の代替、マクロ命令的な利用。

ぼくのかんがえたさいきょうCPU:eval


EVAL reg,step

regに格納された内容を命令列として扱い、実行する。
命令列はregの下位バイトから上位バイトに向かって順に格納する。
EVAL実行中のプログラムカウンタの更新は一時停止する。
step数で0を指定するとregサイズと同じstep数が指定される。
EVAL終了時は最後の命令のRd,Re,Rfが後続の命令に引き継がれる。

EVAL命令の終了条件:
・指定した命令ステップ数を実行する
・regサイズの最後まで実行する
・相対分岐命令でregサイズの範囲外に分岐する
・絶対分岐命令で分岐する

EVAL実行中の禁止事項 →exception扱い
・メモリ操作命令
・EVALで実行しているreg内容の変更
・指定step数オーバー
・未実装命令
避けるべきもの
・PC相対のアドレッシング(意図通りにならない)

EVAL内でのEVAL命令は可能だが、現在実行中のEVALは終了し、新たに実行される。

 当初はEVALを実行するときにregの内容をeval用バッファに転送し、その内容を命令キューに流すことを考えていた。こうするとregの内容をEVAL実行中に書き換えることができるが、専用バッファを持つことでリソースが制限され、タスクが切り替わったときに切り替え先でEVAL命令が実行できないケースが考えられる。そこで専用バッファをやめてregに保存することで解決する。regの内容の書き換えはEVAL命令の外で行うことにする。
 EVAL命令の失敗は通常命令の実行中の失敗と同等になり、回復不能なexceptionとして扱う。EVAL命令中で未実装命令を使うと未実装命令trapが発生するが、このときEVAL実行中の命令の位置も保存しておかないと戻れない。基本的に未実装命令が来たときは失敗にするが、内部実装でtrapから戻れるようにすれば動作可能となる。この場合は当該命令がエミュレーションかどうか意識しなくてもよくなる。
 PCの更新はEVAL命令実行中で一時停止するので、EVAL中でPC相対アドレッシングを使った場合はその命令からの相対位置ではなくEVAL命令を基準にした相対位置になる。禁止にはしない。
 メモリ操作命令を禁止にしたのはstep数が実サイクルと大幅に乖離してしまうため。EVALM命令といったメモリアクセスを許可したものを用意するかもしれない。
 EVAL実行中はそのものを1つの命令と扱いたい。現在実行中のEVAL内の命令位置を保存しておけば、割り込みが発生しても戻ることができるい。軽い実装ならEVAL中は割り込みを抑止してもよい。

夜に眠る エバーフレッシュ 観葉植物
夜に眠る エバーフレッシュ 観葉植物

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 0

この記事へのコメント