高機能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秒