理想のCPU

  • (by K, 2008.04.30)

(1)

  • 3種の一般レジスタ
    • D0〜Dn:データレジスタ
    • A0〜An:データアドレスレジスタ
    • B0〜Bn:アドレスアドレスレジスタ(アドレスベースレジスタ)
    • C0〜Cn:コードアドレスレジスタ
    • AXをAHとALに分割するようなレジスタ構成にはしない。
  • セグメンテーションもページングもない(そんなものがなくても問題ないので)
    • まああってもいいんだけど。
  • データタイプ
    • BYTE、WORD、DWORD、QWORDのほかに、BIT、DBIT、NIBBLEもある。
    • Anのアドレスの粒度は1bit。つまりアドレスが1増えるとポインタは1bit進む。
      • つまり
        MOVZX D0,BYTE [A0]
        MOVZX D1,BYTE [A0+8]
      • これで連続した2バイトを読んだことになる。
    • AnやBnをメモリと読み書きする場合は、BIT〜QWORDのすべてのデータタイプを指定することができず、選べるのはADDRだけである。この一種類しかないので通常は省略される。
    • Bnのアドレスの粒度は1bitではない。それはCPUのアドレスレジスタの幅に等しい。たとえばメモリアドレッシングを64bitでできるCPUなら、Bnは1増えるだけでポインタが64bitも進むことになる。
    • Cnのアドレスの粒度は未定。命令長が一定ならその命令長が粒度になるだろう。
  • データ転送
    • Dnを使うMOVでは、ZXかSXが必ず指定される。
    • Dnを使うMOVで、メモリへ読み書きする場合、アドレス指定は[An+(Dnの式)+(定数)]という形しかない。()は省略可能。つまりAnの部分を省略することはできないし、ここをBnにすることもできない。
    • An/Bn/Cnを使うMOVで、メモリへ読み書きする場合、アドレス指定は[Bn+(Dnの式)+(定数)]という形しかない。()は省略可能。つまりBnの部分を省略することはできないし、ここをAnにすることもできない。
    • FPUレジスタがもしあれば、そのアドレス指定は[An+(Dnの式)+(定数)]になる。
  • メモリ域
    • このアーキテクチャではメモリ域を2分し、データメモリとアドレスメモリに分ける。Anはデータメモリ域しかポイントできないし、Bnはアドレスメモリ域しかポイントできない。
    • スタックも同時に2つ持つことになる。AsとBsだ(sは何かの番号)。なぜならデータをスタックにつむにはAsが必要だし、関数のリターンアドレスや各種のポインタをスタックにつむにはBsが必要だから。
    • 構造体が線形リストとかになっている場合も、そのポインタ部分にはAn用のポインタとBn用のポインタがあるはずだ。そういう意味ではポインタは2倍になったといってもいい。
      • 普通の構造:
        struct ABC {
            int a, b, c;
            struct ABC *next;
        };
        
        p->a = 3; p = p->next; とか使う
  • このCPU向けの構造:
    struct ABC_D {
        int a, b, c;
    };
    struct ABC_A {
        struct ABC_D *dat;
        struct ABC_A *next;
    };
    
    p->dat->a = 3; p = p->next; と使うか、
    
    /* d = p->dat; としておいて */
    d->a = 3; p = p->next; d = p->dat; とする
  • 割り込み
    • いらない。ただし、FLAGSに1bitほしい。そしてその1bitが1だったらCi(iは適当な数値)へ分岐する命令はほしい。INTOみたいな感じ。つまり割り込みをポーリングしているわけだ。そのbitはIRQ信号のすべてのORとソフトウェアによる設定(これもFLAGS内にある)とのORである。この分岐命令は多少遅延してもいい、つまりbitが1になってもすぐには分岐できず、数クロック後の以降の分岐命令で反応できるようになるとかでもいい。

(2) 理由とメリット

  • この方式にすると、アドレスを保持しているレジスタやメモリが明確に分離され、ガーベージコレクトなどには極めて有利である。プログラムを実行中に再配置などをすることすらできる(まあ一時的にタスクをスリープさせておくくらいの措置は必要だろうが)。
  • この仕様だと、たとえば32bitのCPU用に書いたコードは一切の変更なしに64bitのCPUでも動く。8bitのCPU用に書いたコードも一切の変更なしに16/32/64bitのCPUでも動く。そういう上位互換性が保障される。・・・ADDやSUBなどでのキャリー・ボロー・オーバーフロー・アンダフローの問題を何とかできれば。
  • アドレスの粒度:
    • (説明あとで)
    • このルールだとアドレスレジスタが32bitでも最大512MBまでしかアクセスできない。だから64bitくらいないと現代人にはつらいかもしれない。というか、64bitになってありあまるメモリ空間を容量を増やすほうではなくてアドレスの粒度を究極に小さくするほうにも伸ばしてほしいと思うわけ。
  • (つづく)

こめんと欄


コメントお名前NameLink

リロード   新規 編集 差分 添付   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS
Last-modified: 2008-05-24 (土) 21:59:20 (5149d)