竹下世界塔の計算機よもやま話

アクセスカウンタ

zoom RSS FORTHは仮想のアーキテクチャ

<<   作成日時 : 2011/10/01 09:27   >>

ブログ気持玉 0 / トラックバック 0 / コメント 0

 FORTHは他の言語と一風変わっている。逆ポーランド記法(後置記法)で表現するので式の優先順位を解釈しないでよい。(LISPは前置記法、APLは後ろからという約束)
スタックという構造があり、すべての操作はスタックを中心に行われる。計算機の命令セットにより、引数を何個取るかにより3,2,1,0オペランド命令と分類される。

以下、CASL風のニーモニックで書いてみる。

・3オペランドの例:(一般的なRISC)
 ADDA R1,R2,R3 # R3 = R1 + R2

・2オペランドの例:(x86などCISC系、多数のマイコン) R1の内容は保存されない
 ADDA R1,R2 # R1 = R1 + R2

・1オペランドの例:(8bitの68系など)アキュームレータという1個のレジスタで演算する。オペランドはメモリ上の番地を示す。
 LD MEM1 # Acc = MEM1番地の内容
 ADDA MEM2 # Acc = ACC + MEM2番地の内容
 ST MEM3 # MEM3の番地にAccの内容をストア

・0オペランドの例:スタックを使用する
 3 # 3をスタックに積む
 4 # 続けて4をスタックに積む
 + # スタックから2つ取り出して加算し、スタックに積む

4オペランド命令としては積和演算があるが、デスティネーションを破壊しない代入ができるという点で3オペランド命令に分類できる。
 MULADD R1,R2,R3,R4 # R4 = R1 × R2 + R3

3オペランド命令は2オペランド命令としても使用できる。
 ADDA R1,R2,R1 # R1 = R1 + R2 破壊的代入

2オペランド命令は1オペランド命令としても使用できる。
 LD R1,MEM1
 ADDA R1,MEM2
 ST R1,MEM3

しかし、0オペランド命令は直接使用できない。一般的なプロセッサではスタックの構造を表現しないといけない。

・スタックに値を積む操作(R1で値を渡す)
PUSH:
 ST R1,[B1] # B1はスタックポインタ
 ADDL B1,1 # スタックポインタを進める
 RET
・スタックから値を取り出す操作(R1に値を取り出す)
POP:
 SUBL B1,1 # スタックポインタを戻す
 LD R1,[B1] # 値を取り出す
 RET

・ 3 4 + を実行する
 LAD R1,3
 CALL PUSH
 LAD R1,4
 CALL PUSH
 CALL ADD # ADDのサブルーチンは考えてみてください

このようにスタックの機構がない一般的なプロセッサではスタックをエミュレーションするしかない。この点でFORTHは仮想マシンといえる。

以下、メモ;
逆ポーランド記法
Forth
Java仮想マシン
スタックマシン

TTLのみによる製作例:

0オペランド・マシン

1オペランド・マシン

2オペランド・マシン


 TTLによる作例では、多ポートRWMを用意するのが難しいため1オペランドマシンが多い。2オペランドマシンを実現しようとすると中日電工の様にTTL 270個というスゴイことになってしまう、

テーマ

注目テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文




FORTHは仮想のアーキテクチャ 竹下世界塔の計算機よもやま話/BIGLOBEウェブリブログ
文字サイズ:       閉じる