No description, website, or topics provided.
Assembly C Makefile
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
.gitignore
Makefile first commit Aug 7, 2016
README.md
boot.ld first commit Aug 7, 2016
zundoko.S
zundoko_algo.c

README.md

x86アセンブラでOSレスのズンドコきよし

x86 CPUの電源投入後の動作モードであるリアルモード(16ビットモード)向けに、アセンブラでズンドコきよしのプログラムを書いてみました。

OSレスで動作するように作っていますので、生成されるイメージzundoko.imgは以下のようにQEMUで実行できます。

$ qemu-system-i386 -fda zundoko.img

必要なもの

  • GCC
  • Make
  • QEMU(qemu-system-i386)

試し方

Makefileを用意していますので、make runでビルドと動作確認を行えます。

ズンドコきよし自体のアルゴリズム

C言語で同等の実装を行ったものをzundoko_algo.cという名前でこのリポジトリに入れています。

ズンドコきよしの解き方としては、以下のように考えました。

  1. zunカウンタゼロクリア
  2. 乱数生成(0か1)
  3. ループ
    1. 乱数 == 1
      1. print "zun"
      2. zunカウンタインクリメント
    2. 乱数 == 0
      1. print "doko"
      2. zunカウンタ < 4
        1. zunカウンタゼロクリア
      3. zunカウンタ >= 4
        1. ループ脱出
  4. print "kiyoshi"

OSレスのアセンブラで実現するためにやったこと

乱数の種のためのタイマーカウンタ値取得と、画面への文字出力は、BIOSの機能を呼び出すことで実現しています。(BIOS割り込みルーチン)

また、乱数を生成する機能はBIOSに無いので、線形合同法という方法で実装しました。

すべてのデータをレジスタで管理

ズンドコきよしと乱数生成のアルゴリズムは共に、「記憶しておかなければならないデータ」が少ないアルゴリズムです。

  • ズンドコきよし -- zunカウンタのみ
  • 乱数生成(線形合同法) -- 漸化式の演算結果(Xn)のみ

そこで、すべてのデータをレジスタで管理し、メモリへのread/writeを行わないように作ってみました。(ただし、CPUが実行する命令をメモリから取り出す(フェッチ)ためのreadは例外。命令フェッチのためのread以外にメモリアクセスは発生しないように作ってみました。)

zundoko.Sで使用するレジスタは以下のとおりです。

レジスタ名 用途
ax,bx,cx,dx 演算のための値格納、BIOS割り込みルーチンへの値受け渡し
di zunカウンタ
si 漸化式の演算結果(Xn)