高機能MINICPU
高機能MINICPU
- 配列を処理するための命令を追加
- MINICPUの命令セット
ソースコード集
MINICPUのVerilog HDL記述
| 言語 | 説明 | |
|---|---|---|
| 各種定数宣言 | Verilog HDL | MINICPUで用いる各種定数の定義 |
| 算術論理演算回路 | Verilog HDL | MINICPUの算術論理演算回路(TINYCPUと同じ) |
| ステートマシン | Verilog HDL | MINICPUのステーマシン(TINYCPU-Fと同じ) |
| スタック | Verilog HDL | MINICPUのデータスタック |
| メモリ | Verilog HDL | MINICPUのデュアルポートブロックRAM |
| MINICPU | Verilog HDL | MINICPU本体 |
アセンブラとコンパイラ
MINICPUをターゲットとするアセンブラとコンパイラ
| 言語 | 説明 | |
|---|---|---|
| アセンブラ | Perl | MINICPU用アセンブラ |
| 字句解析 | Flex | コンパイラの字句解析(TINYCと同じ) |
| 構文解析 | Bison | MINICPU用コンパイラの構文解析 |
| メモリ形式への変換 | Perl | オブジェクト形式をメモリ形式に変換 |
C言語風プログラムのコンパイル・アセンブル例
フィボナッチ数列を配列に求め,それを順に出力するプログラム.
配列の宣言は,サイズを指定するのではなく,要素を並べる.
同じ値が繰り返す場合は,後ろに[]をつけて,繰り返し回数を指定する.
例えば,次のC言語風プログラムでは,配列aの要素は,1が10回繰り返したあと0が続く大きさ11の配列となる.
C言語風プログラム
while(a[i]){
a[i]=a[i-1]+a[i-2];
i=i+1;
}
i=0;
while(a[i]){
out(a[i]);
i=i+1;
}
halt;
int i=2;
int a={1[10],0};
コンパイル結果
_001T:
PUSHI a
PUSH i
ADD
LD
JZ _001F
PUSHI a
PUSH i
ADD
PUSHI a
PUSH i
PUSHI 1
SUB
ADD
LD
PUSHI a
PUSH i
PUSHI 2
SUB
ADD
LD
ADD
ST
PUSH i
PUSHI 1
ADD
POP i
JMP _001T
_001F:
PUSHI 0
POP i
_002T:
PUSHI a
PUSH i
ADD
LD
JZ _002F
PUSHI a
PUSH i
ADD
LD
OUT
PUSH i
PUSHI 1
ADD
POP i
JMP _002T
_002F:
HALT
i: 2
a: 1
1
1
1
1
1
1
1
1
1
0
アセンブル結果
*** LABEL LIST ***
_001F 01B
_001T 000
_002F 02C
_002T 01D
a 02E
i 02D
*** MACHINE PROGRAM ***
_001T:
000:102E PUSHI a
001:202D PUSH i
002:F000 ADD
003:7000 LD
004:501B JZ _001F
005:102E PUSHI a
006:202D PUSH i
007:F000 ADD
008:102E PUSHI a
009:202D PUSH i
00A:1001 PUSHI 1
00B:F001 SUB
00C:F000 ADD
00D:7000 LD
00E:102E PUSHI a
00F:202D PUSH i
010:1002 PUSHI 2
011:F001 SUB
012:F000 ADD
013:7000 LD
014:F000 ADD
015:8000 ST
016:202D PUSH i
017:1001 PUSHI 1
018:F000 ADD
019:302D POP i
01A:4000 JMP _001T
_001F:
01B:1000 PUSHI 0
01C:302D POP i
_002T:
01D:102E PUSHI a
01E:202D PUSH i
01F:F000 ADD
020:7000 LD
021:502C JZ _002F
022:102E PUSHI a
023:202D PUSH i
024:F000 ADD
025:7000 LD
026:E000 OUT
027:202D PUSH i
028:1001 PUSHI 1
029:F000 ADD
02A:302D POP i
02B:401D JMP _002T
_002F:
02C:0000 HALT
02D:0002 i: 2
02E:0001 a: 1
02F:0001 1
030:0001 1
031:0001 1
032:0001 1
033:0001 1
034:0001 1
035:0001 1
036:0001 1
037:0001 1
038:0000 0
最終更新時間:2008年07月03日 09時05分28秒