低レベルの機能をアセンブラで書いたものをC言語から利用したり、モニタの機能をC言語から利用するために、C言語の関数呼び出しのデータの受け渡し方法を確認してみました。

関数呼び出し時のレジスタ等の利用法の関数呼び出し規約は、下記のSDCCのユーザーガイドの4.3.3節に書かれています。興味のある方は確認しておくとよいでしょう。

以下に具体的な調査例を示していますが、マニュアルに書かれていることの確認となりました。

関数引数等の複雑なパーターンは調べていません。

Contents

整数引数と返り値

整数の関数引数は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