トップ 一覧 検索 ヘルプ RSS ログイン

高機能MINICPUの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!!!高機能MINICPU
*配列を処理するための命令を追加
*MINICPUの命令セット

!!!ソースコード集

!!MINICPUのVerilog HDL記述
, ,言語,説明
,[[各種定数宣言|defsm.v]],Verilog HDL,MINICPUで用いる各種定数の定義
,[[算術論理演算回路|alu.v]],Verilog HDL,MINICPUの算術論理演算回路(TINYCPUと同じ)
,[[ステートマシン|statef.v]],Verilog HDL,MINICPUのステーマシン(TINYCPU-Fと同じ)
,[[スタック|stackm.v]],Verilog HDL,MINICPUのデータスタック
,[[メモリ|dpram.v]],Verilog HDL,MINICPUのデュアルポートブロックRAM
,[[MINICPU|minicpu.v]],Verilog HDL,MINICPU本体

!!アセンブラとコンパイラ
MINICPUをターゲットとするアセンブラとコンパイラ
, ,言語,説明
,[[アセンブラ|miniasm]],Perl,MINICPU用アセンブラ
,[[字句解析|tinyc.l]],Flex,コンパイラの字句解析(TINYCと同じ)
,[[構文解析|minic.y]],Bison,MINICPU用コンパイラの構文解析
,[[メモリ形式への変換|mac2mem]],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

!!拡張したコンパイラ
条件演算子(?:)、複合代入(+=,-=,*=,>>=,<<=,&=,^=,|=)をサポート
,[[字句解析|tinyc.l]],Flex,コンパイラの字句解析(TINYCと同じ)
,[[構文解析|minic2.y]],Bison,拡張コンパイラの構文解析