Practice6 - 2024年度 システムプログラミング
課題内容
C言語とアセンブラの連携について学習します.具体的には,
アセンブリ言語で記述した syscall
を含むプログラムを
C言語から関数として呼び出してシステムコールを実行します.
Practice6-1: システムコールライブラリの作成
SPIMが提供するシステムコールを C言語から実行できるようにしたい.
教科書A.6節 「手続き呼出し規約」に従って,各種手続きをアセンブラで記述せよ.
ファイル名は, syscalls.s
とすること.
また,記述した syscalls.s
の関数を呼び出すことで,
ハノイの塔(hanoi.c とする)を完成させよ.
1: void hanoi(int n, int start, int finish, int extra) 2: { 3: if (n != 0){ 4: hanoi(n - 1, start, extra, finish); 5: print_string("Move disk "); 6: print_int(n); 7: print_string(" from peg "); 8: print_int(start); 9: print_string(" to peg "); 10: print_int(finish); 11: print_string(".\n"); 12: hanoi(n - 1, extra, finish, start); 13: } 14: } 15: main() 16: { 17: int n; 18: print_string("Enter number of disks> "); 19: n = read_int(); 20: hanoi(n, 1, 2, 3); 21: }
spim-gcc
によって hanoi.s
を作成する.
$ spim-gcc hanoi.c
hanoi.s
ができたら,
hanoi.s, syscalls.s の順に SPIM 上でロードして実行.
なお,複数のファイルを1つのプログラムとしてロードする場合, 最初のファイルは Reinitialize and Load File でロードするのに対して, 2番目以降のファイル (この例では syscalls.s) は,Load File でロードすること. つまり Reinitialize (再初期化) してはいけない.
実行例は以下の通り:
Enter number of disks> 3 Move disk 1 from peg 1 to peg 2. Move disk 2 from peg 1 to peg 3. Move disk 1 from peg 2 to peg 3. Move disk 3 from peg 1 to peg 2. Move disk 1 from peg 3 to peg 1. Move disk 2 from peg 3 to peg 2. Move disk 1 from peg 1 to peg 2.