はじめに
本当は文字列の復元に関する記事を書こうと思ったのだが、精度が9割をどうしても超えないので、今回は11月ちょっと勉強していたアセンブリ言語の備忘録を書くことにする。
アセンブリ言語とは
低水準言語の一つ。コンピュータを動作させるための機械語を人間にもわかりやすくした言語のこと。高水準言語と比べると読みづらい上に、高水準言語だと一行でおわるものがアセンブリ言語だと何行も書かないといけなかったりする。
プログラムを作ってみよう
動作環境
今回書いたプログラムは「KUE-CHIP2」と呼ばれる教育用マイクロコンピュータ上で動作するように作ったものから余計な部分を抜いたものとなっている。しかし、KUE-CHIP2を持っている人も少ないと思うので、公開されているWeb上で動作するアセンブラを載せておく。
[KEMU_Emulator]
(http://kemuide.openwaseda.net)
プログラムの概要
KUE-CHIP2では000番地〜0FF番地がプログラム領域に、100番地〜1FF番地がデータ領域となっている。今回は100番地〜109番地のメモリに格納されている数値を昇順に挿入ソートするプログラムを作る。
実際のプログラム
超簡単な用語解説
ACC:アキュムレータ。演算に利用され、演算対象のデータや演算結果を保持する。
IX:インデックスレジスタ。レジスタを利用したアドレス指定を行う際に、アドレス修飾に用いられる。また、演算対象のデータや演算結果も保持できる。個人的にはfor文に用いられるiやjのようなイメージ。
LD:番地が指定されている場合は番地に格納されている値を、即値の場合はその値を読み込む。
ST:指定した番地に値を格納する。
CMP:比較の命令。実際にやる処理は現在読み込んでいる値から指定した値を引くこと。結果を保持せずフラグを立てることでその後の条件分岐を行えるようにする。
BLE・BZP・BLT:条件分岐の命令。左から以下、以上、未満の意味。
ADD・SUB:英語のまま、加算減算。
HLT:割り込み待ち。つまり停止命令。
END:文字通り終わり。
数字単体は即値を、数字に()がついているものはデータ領域の絶対アドレスを示している。
ループ命令は条件分岐命令の結果がtrueなら書かれている場所に飛ぶ。
プログラム
LD IX,00H
LP1: ST IX,(90H)
LP2: LD ACC,(IX + 00H)
CMP ACC,(IX + 01H)
BLE SKIP
ST ACC,(91H)
LD ACC,(IX + 01H)
ST ACC,(IX + 00H)
LD ACC,(91H)
ST ACC,(IX + 01H)
SUB IX,01H
BZP LP2
LD IX,(90H)
SKIP: ADD IX,01H
CMP IX,09H
BLT LP1
HLT
END
二重ループさせるために一度IXの値を別の場所に保管しなければいけないのが面倒。
実行結果
以下のようにデータ領域に適当に値を放り込んでみる。
プログラムを実行。
ユーザーメモリやプログラムメモリの場所を見ているとどのようにソートされているか自分の目で確かめられてとても楽しい。
ソートの結果がこちら。
うまくいって何より。
アセンブリ言語を使って言語を書くのは面倒ではあるけれど、機械がどのように普段プログラムを読んでいるのかを知れて実際にプログラムを書くときの無駄が省けたりする。
なんとなく機械のことが知れて仲良くなった気分になれるので是非アセンブリ言語を触ってみて欲しい。