#07:CPUの動作を理解する - その2
CASLⅡとCOMETⅡを使って、CPUの動作を理解します。そのために、プログラムの動作をステップ実行で確認しましょう。
$ pycasl hello.cas
$ pycomet -d hello.com
プログラムレジスタ(PR):次に実行すべき命令のアドレスを指定
汎用レジスタ(GR0 - GR7):演算やアドレス指定のために一時的にデータを格納
スタックポインタ(SP):メモリにデータを一時的に退避したり、一時的に別のコードを呼び出したりする、スタック領域のアドレスを指定する
フラグレジスタ(FR):演算結果に合わせて設定される
オーバーフローフラグ(OF):演算結果が16ビットを超えた時に1、それ以外では0
サインフラグ(SF):演算結果がマイナスになったとき1、それ以外では0
ゼロフラグ(ZF):演算結果がゼロのときに1、それ以外では0
Hello Worldプログラムをマシン語に変換して、メモリに配置すると、このようになります。
COMET2では、マシン語のコードがどのような2進数になるか規定していませんが、PyCASL2では、このように変換されます。
左側がメモリのアドレスです。先頭が「0000」で、その次が「0001」「0002」というように、16ビットの2進数を16進数であらわしています。
そのとなりは、メモリにかきこまれた内容です。アドレスが「0000」のメモリに「9100」というコードが書き込まれています。ここが「OUT」命令に相当します。0000: 9100 (OUT)
0001: 0004 (BUF)
0002: 000f (LEN)
0003: 8100 (RET)
0004: 0048 H
0005: 0065 e
0006: 006c l
0007: 006c l
0008: 006f o
0009: 0020
000A: 0057 W
000B: 006f o
000C: 0072 r
000D: 006c l
000E: 0064 d
000F: 000b (11)
・COMET2:1ワード 16ビットのCPU
・ひとつのアドレスにメモリを16ビットずつ割り当て
・1アドレスのメモリ:1ワード、1語
「d」オプションで、プログラムの終了時に、CPUの状態とメモリの内容を出力します。
出力結果は、「last_state.txt」に格納されます。$ pycomet -d hello.com
PyCOMET2をステップ実行するには、次のように操作します。
1. 「r」オプションなしでプログラムを実行する
2. 対話モードで「s」コマンドを実行する$ pycomet hello.com
pycomet2> s
CASLIIアセンブラ & シミュレータ PyCASL2 & PyCOMET2
http://www.image.med.osaka-u.ac.jp/member/nakamoto/pycasl2/index.html
CASL - Wikipedia
https://ja.wikipedia.org/wiki/CASL
システムCOMET2の仕様
https://www.chiba-fjb.ac.jp/fjb_labo/casl/COMET2spec.html
CPU - コンピュータの基礎知識 | ++C++; // 未確認飛行 C
https://ufcpp.net/study/computer/CPU.html