UP | HOME

Practice6 - 2023年度 システムプログラミング

課題内容

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 上でロードして実行. 実行例は以下の通り:

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.

解説

解答例

Practice6-2: GCCにおける引数とスタックの関係

hanoi.s を例に spim-gcc の引数保存に関するスタックの利用方法について,説明せよ. そのことは,規約上許されるスタックフレームの最小値 24 とどう関係しているか. このスタックフレームの最小値規約を守らないとどのような問題が生じるかについて解説せよ.

解答例

Author: Yoshinari Nomura

Emacs 27.1 (Org mode 9.3)