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

とりあえずアセンブリで受け取ったintのデータを表示するという関数を実装してみる。

  1   .text
  2   .align  2
  3 
  4 _print_int:
  5   subu  $sp, $sp, 24
  6   sw    $ra, 20($sp)
  7 
  8   li    $v0, 1  # 1: print_int
  9   syscall
 10 
 11   lw    $ra, 20($sp)
 12   addu  $sp, $sp, 24
 13   j     $ra

呼び出し手続きにもちゃんと基づいている。

そしてsyscallの引数には、もともと受け取った最初の引数が$a0に格納されていることを利用している。

そして、ポイントは C言語から関数を呼び出す時には_funcname:のように最初にアンダーバーを付けるというところ。(コンパイラに依存。gcc使用)

ここで、.cを.sにするためのクロスコンパイラがなくて困った。

macC言語ソースコードからMIPS用のアセンブリ言語プログラムを作成するための環境設定はまたまとめることにしよう。

ということで、以下のようなテスト用プログラムを作成して試してみる。

  1 main() {
  2   int n;
  3   n = 424;
  4   print_int(n);
  5 
  6   return 1;
  7 }

出力は以下

424

ということで、いい感じに呼ばれているようだ。関連づけは、コンパイラが勝手に行ってくれるみたい。

最後に、print_int、print_string、read_int、read_stringの4つの関数を定義したソースコードを貼っておく。

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