【アセンブリ】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にするためのクロスコンパイラがなくて困った。
macでC言語ソースコードから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つの関数を定義したソースコードを貼っておく。