FAQ 1010388 : CubeSute+でRL78/78K0Rコンパイラを使用しています。 割り込み関数内で関数呼び出しを行うと、汎用レジスタのPUSH後およびPOP前にアセンブラコードが出力されますが、この処理は何をしているのでしょうか。

回答

コンパイラがランタイム・ライブラリを呼び出すために使用している引数用のsaddr領域の退避/復帰コードが出力されます。

【出力コード例1】

<Cソース・ファイル>
#pragma interrupt	INTP0	inter		/*ソフトウエア割り込みの割り込み*/
void func(void);
__interrupt void	inter();		/*プロトタイプ宣言*/

__interrupt void	inter()
{
	func();
};

<生成コード>
_inter:
	push	ax
	push	bc
	push	de
	push	hl
	mov	c,#0CH        ;ここから
	dec	c
	dec	c
	movw	ax,_@SEGAX[c]
	push	ax
	bnz	$$-6
	mov	a,ES
	mov	x,a
	mov	a,CS
	push	ax          ;ここまで
	call	!!_func
	pop	ax          ;ここから
	mov	CS,a
	mov	a,x
	mov	ES,a
	movw	de,#_@SEGAX
	mov	c,#06H
	pop	ax
	movw	[de],ax
	incw	de
	incw	de
	dec	c
	bnz	$$-5         ;ここまで
	pop	hl
	pop	de
	pop	bc
	pop	ax
	reti

なお、この処理時間を短縮したい場合、最適化オプションで"-qx1(スピード優先)"に選択することで、コード数は増加しますが、処理時間を優先した退避/復帰コードが出力されます。

 

【出力コード例2】

<生成コード>
 _inter:
	push	ax
	push	bc
	push	de
	push	hl
	movw	ax,_@RTARG6      ;ここから
	push	ax
	movw	ax,_@RTARG4
	push	ax
	movw	ax,_@RTARG2
	push	ax
	movw	ax,_@RTARG0
	push	ax
	movw	ax,_@SEGDE
	push	ax
	movw	ax,_@SEGAX
	push	ax
	mov	a,ES
	mov	x,a
	mov	a,CS
	push	ax           ;ここまで
	call	!!_func
	pop	ax            ;ここから
	mov	CS,a
	mov	a,x
	mov	ES,a
	pop	ax
	movw	_@SEGAX,ax
	pop	ax
	movw	_@SEGDE,ax
	pop	ax
	movw	_@RTARG0,ax
	pop	ax
	movw	_@RTARG2,ax
	pop	ax
	movw	_@RTARG4,ax
	pop	ax
	movw	_@RTARG6,ax      ;ここまで
	pop	hl
	pop	de
	pop	bc
	pop	ax
	reti

 

上記、コード数は増加しますが、【出力コード例1】に比べ割り込み関数の先頭と終わりの退避/復帰コードの
実行時間が約1/3になります。

詳細につきましては、こちらから以下を参照ください。

  CubeSuite+ 統合開発環境 ユーザーズマニュアル
  RL78, 78K0R コーディング編
3.2.4 拡張機能の使用方法
割り込み関数(#pragma vect/#pragma interrupt)
  および
3.4 saddr領域のラベル一覧

 

適用製品

RL78、78Kファミリ用Cコンパイラパッケージ
RL78ファミリ, 78K0R用コンパイラ [CA78K0R]
78K0R用コンパイラ [CC78K0R]
78K0用コンパイラ [CA78K0]
78K0用コンパイラ [CC78K0]
78K0S用コンパイラ [CC78K0S]
他にご質問がございましたら、リクエストを送信してください