【アセンブリ】C言語でシステムコールsyscallを使うーハノイの塔編

【アセンブリ】C言語でシステムコールsyscallを使う - 凸ろぐ

という記事に引き続き、今度はC言語で記述したハノイの塔hanoi.cをhanoi.sファイルにgccを用いてコンパイルし、それを自分で実装したprint系関数を使って表示する、ということをやってみる。

まずは、おなじみ手続き呼び出し規約に従って必要とするSPIMが提供するシステムコールをsyscall.sとして定義する。

ソースコードは以下。

print関数を定義するためのアセンブリ言語プログラム

構造としては簡単で、それぞれまず最初の2行でスタックフレームの領域を確保し、$spを退避。

  subu  $sp, $sp, 24
  sw    $ra, 20($sp)

次の2行で、各サービスに対応するシステムコールコードを格納してsyscall実行(引数はもともと$a0に格納されていることを想定している。)

  li    $v0, 8  # 8: read_string
  syscall

そして次の3行で、戻りアドレスを復元し、スタックフレームを破棄、復元した戻りアドレスに従ってもとの場所にジャンプ、という処理を行っている。

  lw    $ra, 20($sp)
  addu  $sp, $sp, 24
  j     $ra

そしたらhanoi.cをコンパイルしhanoi.sとする。ソースコードは以下からみれます。

hanoi.cをspim-gccでhanoi.sにコンパイル

spimでhanoi.s、syscalls.sという順番でロードして実行すると、ハノイの塔の高さをきかれるので入力すると、以下のような出力を得ることが出来る。

Screen Shot 2014-12-04 at 15.25.21.png

ということでC言語で書いたハノイの塔の、入力・出力部分を別のアセンブリ言語のプログラムで実現してみた。

ハノイの塔いろんなところで出て来るなぁ。面白い。

そういえば、ハノイの塔がemacsで見れることに感動を覚えた(笑)