PDP-7の間接アドレッシングとAUTO-INDEXING PDP-7は18bit幅のアキュムレータマシン。最初のunix v0がこの計算機の上で動かされた。 https://github.com/DoctorWkt/pdp7-unix これはPDP-1の命令セットで参考になる。 Inside Spacewar! (Supplement) DEC PDP-1 Instruction … 気持玉(0) コメント:0 2022年01月25日 計算機アーキテクチャ 続きを読むread more
2021:BKSC 特徴 最後に2021BKSCの特徴。 ・連鎖性言語のような動作 前の命令の出力を入力として使用する。汎用レジスタへの書き込みはそれ用の命令で行う。 ・表形式の分岐 分岐命令の分岐先指定には相対分岐と絶対分岐の他に表分岐というのを考えている。これはプログラムの先頭部分に分岐先を列挙したテーブルを用意し、分岐命令でその表の項… 気持玉(0) コメント:0 2021年12月25日 ぼくのかんがえたさいきょうCPU 続きを読むread more
2021:BKSC 割り込みやモード これでユーザーモードに必要な分は定義できたので、あとは周辺。 メモリなどを保護するための特権モードとユーザモードの切替について。SPARC V9の制限されたモードからスタートして特権モードに移る方式とRISC-Vの全アクセスできるマシンモードからスーパーバイザーモード/ユーザーモードを持つ。ここではRISC-Vにならって3つの… 気持玉(0) コメント:0 2021年12月24日 ぼくのかんがえたさいきょうCPU 続きを読むread more
2021:BKSC オペランド、その他の命令 オペランドはオペコードに続くレジスタ番号や即値を指定するフィールドで、1バイト単位、MSBは1で始まる。 1_1_xxxxxx レジスタ指定など このバイト単独 1_0_xxxxxx 即値指定 これは連続することで長い即値を表現する。表現したい即値のLSB側から5bitづつ詰めていく。2の補数表現。 基本、レジスタ指定などは… 気持玉(0) コメント:0 2021年12月23日 ぼくのかんがえたさいきょうCPU 続きを読むread more
2021:BKSC ロードストア命令 最後にメモリとのやり取り、ロードストア命令とその他。 0_100_0xxx ストア 入力で与えられたデータをオペランドで指定した番地に書き込む 0_100_1xxx ロード オペランドで指定した番地から値を指定した幅で読み込んで出力する xxは0~6で1バイト〜64バイトのデータ幅 0_100_0111 0_xxx… 気持玉(0) コメント:0 2021年12月22日 ぼくのかんがえたさいきょうCPU 続きを読むread more
2021:BKSC ビット操作命令 ビット演算命令はシフト、ローテート、符号拡張、シャッフルなどを扱う。ビット列の入力を数値で操作してビット列を得る。 1_011_xxxx ビット演算命令 2オペランド命令 0000 ROR - 右ローテート 0001 ROL - 左ローテート 0010 SHR - 論理右シフト 0011 SHL - 論理左シフト … 気持玉(0) コメント:0 2021年12月21日 ぼくのかんがえたさいきょうCPU 続きを読むread more
2021:BKSC 分岐命令 分岐命令は直前の演算の結果を判断してジャンプする。 1_000_xxxx 分岐命令 ←MSBは0にしたほうがいいかなあ? 分岐条件の分類 ・算術演算の結果はZ,N,V,Cのフラグを使用する。 ・論理演算、ビット演算 算術演算に準じる。0010-0111までのZ,N,V,Cを組み合わせる条件は使わない。 00… 気持玉(0) コメント:0 2021年12月20日 ぼくのかんがえたさいきょうCPU 続きを読むread more
2021:BKSC 算術演算命令 1_001_xxxx 算術演算命令 算術演算命令は数値とみなした入力から加減乗除などを行い結果は数値。引数はオペランドで指定する。 整数の演算は加減算については2の補数でも符号なしでも同様に可能。 乗算についてはそのまま行うと結果のサイズが入力A,Bのビット幅の合計になる。乗算だけ結果を倍幅にするという例外は採用したくない。… 気持玉(0) コメント:0 2021年12月19日 ぼくのかんがえたさいきょうCPU 続きを読むread more
2021:BKSC 論理演算命令 1_010_xxxx 論理演算命令 まずは簡単そうな論理演算命令から。ビット列とビット列の演算16種類で結果はビット列。引数はオペランドで指定する。ここでは2つの引数をA,Bとあらわす。 0000 ALL0 - A,Bを無視してall0を返す 0001 ALL1 - A,Bを無視してall1を返す 0010 SELA … 気持玉(0) コメント:0 2021年12月18日 ぼくのかんがえたさいきょうCPU 続きを読むread more
2021:BKSC 命令の分類 オペコードのビット列を考えるために、各命令を分類し何種類割り当てられるか検討する。頻出する命令は1バイトに割り当てたい。 1バイト=8bitで、オペコードとオペランドの識別に1bit使ったら残りは7bit。 オペコード 1xxxxxxx オペランド 0xxxxxxx 各命令は直前の命令の結果を参照し、オペランドで汎用… 気持玉(0) コメント:0 2021年12月17日 ぼくのかんがえたさいきょうCPU 続きを読むread more
2021:BKSC 基本方針 汎用レジスタ ぼくのかんがえたさいきょうCPUとはなにか。色々あった計算機アーキテクチャは現在みんな使ってるx86-64、組み込みからスパコンまでArm、オープンなRISC-Vあたりに絞られてしまったがこれらから選ぶことではない。また、The MachineやThe Millのように現在の延長線上からかけ離れたようなアーキテクチャではない。これまで… 気持玉(0) コメント:0 2021年12月16日 ぼくのかんがえたさいきょうCPU 続きを読むread more
2021:モード リソースを保護する目的でプロセッサはモードを持つことがある。特権モードはすべてのリソースにアクセスでき、ユーザーモードはI/Oやメモリ管理関連の制御が制限される。これによりユーザーモードで動くプログラムは特権モードで割り当てられるメモリ領域と、デバイスドライバ経由でアクセスできるI/Oにより他のユーザープログラムに影響を与えない。これ… 気持玉(0) コメント:0 2021年12月15日 ぼくのかんがえたさいきょうCPU 続きを読むread more
2021:その他の命令 あると便利な命令。 対象がビット列で結果は整数で返す。 ・POPC (Population count) 立っているビットの数を数える ・CLZ (Count Leading Zero) MSB側から続く0のビットの数を数える ・CTZ (Count trailing zero) LSB側から続く0のビットの数を数える … 気持玉(0) コメント:0 2021年12月14日 ぼくのかんがえたさいきょうCPU 続きを読むread more
2021:分岐命令 プログラムは命令列が順に取り込まれては実行されるイメージで、現在実行中のコードの位置を指し示すのがプログラムカウンタ(PC)である。プロセッサによっては次に実行する命令を指したり名称が違っていたりする。PCは4バイトの固定長命令ならば+4ずつ、可変長命令なら現在実行した命令のサイズ分増えていく。この流れを変えるのは分岐命令で、制御転送… 気持玉(0) コメント:0 2021年12月13日 ぼくのかんがえたさいきょうCPU 続きを読むread more
2021:レジスタの仕組み 汎用レジスタは固定した役割はなくロードストアや演算時にすべて同じ様に扱われるビット列の一時置き場である。例外はあって、常に0が読み出されるゼロレジスタは3オペランド命令で便利に使うことができる。また、スタックを持たないアーキテクチャでは特定の番号のレジスタがサブルーチンコール時の戻り番地を保存する場所になる。その他の汎用レジスタの用途… 気持玉(0) コメント:0 2021年12月12日 ぼくのかんがえたさいきょうCPU 続きを読むread more
2021:算術演算 浮動小数点 整数に加えて数値の重要な表現に浮動小数点形式がある。ビット列を指数部と仮数部に分けて実数の範囲を扱う。最も普及している表現形式はIEEE754で定義されているもの。昨今は機械学習のためのより少ないビット数で実数を表現する形式が存在する。加減乗除のうち除算は実装せずNewton-Raphson法で求めるものもあった(Alpha,IA-6… 気持玉(0) コメント:0 2021年12月11日 ぼくのかんがえたさいきょうCPU 続きを読むread more
2021:算術演算 整数 算術演算は入力で与えられたビット列を数値とみなして加減乗除などを行う。整数の表現としては2の補数の形式が一般的で、反転して+1すれば符号反転できるので加算と減算は1つの加算器で扱える。符号なしの数値として扱う場合もある。整数の乗算は乗算器の回路規模から1サイクルでの計算が終了しないことが多い。除算器は加減乗除の中では最も複雑で、演算中… 気持玉(0) コメント:0 2021年12月10日 ぼくのかんがえたさいきょうCPU 続きを読むread more
2021:ビット操作 ビット操作命令は入力をビット列とみなし、数値を指定して加工を行い、結果をビット列として返す。 シフト命令は指定した数分MSB側(左)またはLSB側(右)にビットをシフトする。シフトして空いた部分には0を挿入する。シフト操作はビット列を2進数の数値とみなした場合、左シフトは2のn乗の乗算、右シフトは2のn乗での除算ができる。また… 気持玉(0) コメント:0 2021年12月09日 ぼくのかんがえたさいきょうCPU 続きを読むread more
2021:論理演算 論理演算は汎用レジスタの内容をビット列とみなして、それぞれ同じ位置のビットに対してAND/OR/XORの論理演算を行い結果を返す。これらの演算の入力または出力側でビットを反転すればNOTが実現できる。組み合わせると次のようになる。 XOR A xor B NXOR !(A xor B) AND A and B NAND !… 気持玉(0) コメント:0 2021年12月08日 ぼくのかんがえたさいきょうCPU 続きを読むread more
2021:アドレッシングモード メモリと汎用レジスタ間のデータをやり取りするためには対象となる汎用レジスタの番号と対象となるメモリの番地指定が必要になる。ここではメモリの番地を指定する方法について整理する。 LD Rd,[const] 絶対番地指定:メモリの番地を定数で指定する形式。定数は命令列中に埋め込まれる。操作対象の番地は静的に決まる。 LD Rd… 気持玉(0) コメント:0 2021年12月07日 ぼくのかんがえたさいきょうCPU 続きを読むread more