割り込みハンドラ

昨日「割り込みハンドラを作るためのプラグマがある」と書きました。そのプラグマが#pragma interruptです。

#pragma interrupt
void func( void )
{
}

上のように関数の前にinterruptプラグマを置くと、直後の関数は割り込みハンドラとしてコンパイルされます。割り込みハンドラは頭でコンテキストを退避した後、終了時にrtiを実行します。さて、コンパイル結果を見てみましょう。

	[ -- SP ] = ASTAT ;
	[ -- SP ] = FP ;
	[ -- SP ] = ( R7:0 , P5:0 ) ;
	SP += -64 ;
	SP += -52 ;
	JUMP.S 2 /*0xFFA0075C*/ ;
	SP += 60 ;
	SP += 56 ;
	( R7:0 , P5:0 ) = [ SP ++ ] ;
	FP = [ SP ++ ] ;
	ASTAT = [ SP ++ ] ;
	RTI ;

rtiのほかにもastatの退避と復帰をおこなうところが割り込みハンドラならではです。内部でi0などを使う場合は対応するLxが自動的に退避されて0初期化されます。