低レベルの機能をアセンブラで書いたものをC言語から利用したり、モニタの機能をC言語から利用するために、C言語の関数呼び出しのデータの受け渡し方法を確認してみました。
関数呼び出し時のレジスタ等の利用法の関数呼び出し規約は、下記のSDCCのユーザーガイドの4.3.3節に書かれています。興味のある方は確認しておくとよいでしょう。
以下に具体的な調査例を示していますが、マニュアルに書かれていることの確認となりました。
関数引数等の複雑なパーターンは調べていません。
整数引数と返り値
整数の関数引数はHLで、返り値はDEで受け渡す。
int abc(int x)
{
return 100 + x ;
}
47 ;func.c:2: int abc(int x)
48 ; ---------------------------------
49 ; Function abc
50 ; ---------------------------------
000000 51 _abc::
52 ;func.c:4: return 100 + x ;
000000 01 64 00 [10] 53 ld bc, #0x0064
000003 09 [11] 54 add hl, bc
000004 EB [ 4] 55 ex de, hl
56 ;func.c:5: }
000005 C9 [10] 57 ret
ポインタの引数と返り値
ポインタの関数引数はHLで、返り値はDEで受け渡す。
char *abc1(char *p)
{
return (char*)(p + 200) ;
}
58 ;func.c:7: char *abc1(char *p)
59 ; ---------------------------------
60 ; Function abc1
61 ; ---------------------------------
000006 62 _abc1::
63 ;func.c:9: return (char*)(p + 200) ;
000006 01 C8 00 [10] 64 ld bc, #0x00c8
000009 09 [11] 65 add hl, bc
00000A EB [ 4] 66 ex de, hl
67 ;func.c:10: }
00000B C9 [10] 68 ret
文字引数と返り値
文字の関数引数はAで、返り値はAで受け渡す。
char abc2(char c)
{
return c+1 ;
}
69 ;func.c:12: char abc2(char c)
70 ; ---------------------------------
71 ; Function abc2
72 ; ---------------------------------
00000C 73 _abc2::
74 ;func.c:14: return c+1 ;
00000C 3C [ 4] 75 inc a
76 ;func.c:15: }
00000D C9 [10] 77 ret
整数の2引数と返り値
整数の一つ目の引数はHLで、2つ目はDEで引き渡す。
int xyz(int x, int y)
{
return x + y ;
}
78 ;func.c:17: int xyz(int x, int y)
79 ; ---------------------------------
80 ; Function xyz
81 ; ---------------------------------
00000E 82 _xyz::
83 ;func.c:21: return x + y ;
00000E 19 [11] 84 add hl, de
00000F EB [ 4] 85 ex de, hl
86 ;func.c:22: }
000010 C9 [10] 87 ret