memo0034
のバックアップ(No.2)
[
トップ
|
一覧
|
単語検索
|
最終更新
|
バックアップ
|
ヘルプ
]
バックアップ一覧
差分
を表示
現在との差分
を表示
ソース
を表示
memo0034
へ行く。
1 (2008-04-30 (水) 13:11:00)
2 (2008-04-30 (水) 13:38:11)
3 (2008-04-30 (水) 17:47:16)
4 (2008-04-30 (水) 17:47:16)
理想の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倍になったといってもいい。
↑
(2) 理由とメリット
(つづく)
↑
こめんと欄
コメント
お名前
NameLink