Simple 8-bit Assembler Simulatorでアセンブラの挙動を簡単に見る

Simple 8-bit Assembler Simulatorを使ってアセンブラの動きを簡単に見てみます。

Simple 8-bit Assembler Simulator?

Simple 8-bit Assembler Simulatorはウェブ上でアセンブリを実行できるシミュレータです。

schweigi.github.io

名前の通りCPUは8ビットで、メモリは256バイトです。
現代のCPUを考えると逆にちょっと想像つかないような値だし命令の種類も限られますが、
アセンブリの基礎を学ぶにはちょうど良さそうなので使い方を紹介します。

画面構成とレジスタの構成

画面構成はかなりシンプルです。
左側にアセンブリを書いて実行すると右側のレジスタやメモリが書き換わっていきます。

f:id:halya_11:20200407002805p:plain

Hello Worldと出力するコードが最初から書かれているのでこれを実行すると以下のようにレジスタやメモリが動いていく様子が見れます。

f:id:halya_11:20200407003159g:plain

また、レジスタの構成としては以下の通りとなります。

名前 レジスタの種類名 備考
A / B / C / D 汎用レジスタ それぞれ8ビット
IP プログラムカウンタ 次に実行する命令のアドレスが格納される
SP スタックポインタ 次に書き込むべきスタックのアドレスが格納される
Z / C / F フラグレジスタ

簡単なプログラムを書く

それではいくつか簡単なプログラムを書いてみます。

汎用レジスタへの値の格納

まず汎用レジスタに値を格納するだけのプログラムを書きます。

MOV A, 1
MOV B, 2

汎用レジスタAに1を、Bに2を格納しています。
実行結果は以下の通りです。

f:id:halya_11:20200407005219g:plain

汎用レジスタに値が格納されていく様子が確認できます。
またRAMにプログラムが格納され、実行対象のプログラムのアドレスを示すIPレジスタの値が変わっていくことも確認できます。

スタックに値を書き込み&読み込み

次にスタックに値を書き込んでから読み込んでみます。

MOV A, 1
MOV B, 2
PUSH A
PUSH B
POP A
POP B

A->Bの順でスタックにPUSHしてから、A->Bの順にPOPしています。
すなわち最初にMOVした値が入れ替わる挙動になります。

f:id:halya_11:20200407005752g:plain

最初AとBにそれぞれ1と2が格納されていたのが入れ替わっていく様子が確認できます。

また、スタックが読み書きされるたびにスタックポインタSPの値が書き換わっていくことが確認できます。
スタックはRAMの後ろから順に積まれていくことも見て取れます。

実際には関数内で他の関数が呼び出される際などに、このようにスタックに値が積まれることになります。

繰り返し処理

最後に繰り返し処理を書いて挙動を確認します。

.start:
    MOV A, 0
    MOV B, 5
.loop:
    INC A     ; Aをインクリメント
    CMP A, B   ; A=BだったらZフラグがTRUEになる
    JNE .loop  ; Zがfalseだったらループ

説明はコメントに書いた通りとなりますが、AがBと等しくなるまでループするプログラムになります。
命令の詳細が知りたい場合は以下を参照してください。

schweigi.github.io

これを実行すると以下のような挙動になります。

f:id:halya_11:20200407011532g:plain

レジスタAの値がインクリメントされていく様子がわかります。
また、A=Bになった時にZフラグがTRUEになってループを抜けていることが確認できます。

参考

schweigi.github.io