アセンブラによるMINI-Cの関数の作成

(Mini-c 関数の作成)

 アセンブラを使い”C”の関数を書く場合、引数と戻り値が、どうなっているかが 問題となります。MINI_Cの場合を、サンプルで調べてみますと、関数に書かれて いる引数は、左の方から順番にスタックに詰まれています。仮に

"void  out(0x001f,0x00a7)"

と書いて、この関数が呼ばれると、スタックエリアは次のようになります。 (スタックポインタの初期値を0000hとします)

アドレスメモリー内容
FFFAh アドレスカウンタの下位
FFFBh アドレスカウンタの上位
FFFCh A7h−−−(int data)
FFFDh 00h−−−(int data)
FFFEh 1Fh−−−(int port)
FFFFh 00h−−−(int port)

スタックポインタはFFFAhとなっていますから、Aレジスタにデータを取り出すには

    ld    hl,2
    add   hl,sp
    ld    a,(hl)

以上のようにすればデータを取り込むことができます。また、関数内で変数を使用する 場合は、CPU内のレジスターを使用しないで、必ずスタックに確保するようにします。 Intの変数“buff_1”を使用すると、スタックは次のようになります。

アドレスメモリー内容
FFF8h 変数“buff_1”の下位
FFF9h 変数“buff_1”の上位
FFFAh アドレスカウンタの下位
FFFBh アドレスカウンタの上位
FFFCh A7h−−−(int data)
FFFDh 00h−−−(int data)
FFFEh 1Fh−−−(int port)
FFFFh 00h−−−(int port)

この時、スタックポインタはFFF8hとなりますから、この場合、関数から戻る際には スタックポインタを、アドレスカウンタの下位のアドレスに戻すことを 忘れないでください。
 また、戻り値は下のサンプル”int  (int port)”を見れば分かるように、 MINI_Cの場合CPUの”HL”レジスタに入れて、渡すようになっています。

目次に戻る


/****************************************/
/*					*/
/*		[ io.h ]		*/
/*					*/
/****************************************/


//------------------------------------------------------------------------
// void out( int port, int data )
//
//	機能)	I/Oポートへデータを出力します。
//
//	引数)	int port	出力先I/Oポートアドレス
//		int data	出力データ(下位バイト)
//
//------------------------------------------------------------------------
void out( int port, int data )
{
#asm
	ld	hl, 4
	add	hl, sp
	ld	c, (hl)
	ld	hl, 2
	add	hl, sp
	ld	a, (hl)
	out	(c), a
#endasm
}


//------------------------------------------------------------------------
// int in( int port )
//
//	機能)	I/Oポートからデータを取得します。
//
//	引数)	int port	入力先I/Oポートアドレス
//
//	戻値)	戻り値は、int型で返します。入力したデータは
//		下位バイトへ格納されます
//
//------------------------------------------------------------------------
int in( int port )
{
#asm
	ld	hl, 2
	add	hl, sp
	ld	c, (hl)
	in	a, (c)
	ld	l, a
	ld	h, 0
#endasm
}




目次に戻る