[H8-ML(2631)] Re: 大きな配列をタイマー割り込みで参照
From: hamayan <hamayan@xxxxxxxxxxxxxxx>
Date: 2002年12月27日(金)15時46分31秒
お世話になっています。hamayan です。

手持ちのH8/3069Fに転送して、逆アセンブル結果を出力しました。
HTERMの逆アセンブルウインドウは、画面の内容がクリップボードに
コピーできなかったので、手打ちでコードを書いています。もしかし
たらタイプミスが有るかも知れません。

コメントは、私が付けた物です。

元のCソース
/*************************************************************************/
/*	アセンブルコードにどう展開されるかの試験							 */
/*************************************************************************/
#include	<h83069f.h>
int		*adrR = ((int *)0x1234);
int		*adrL = ((int *)0x5678);
volatile unsigned int DA0;
volatile unsigned int DA1;
int		count,foreleg,hindleg,b;

void Test( void )
{
    register unsigned a = (count & (64  - 1));

    DA0 = *(adrR + a);
    DA1 = *(adrL + a);
    count++;

    P1DR.BIT.B0 = ( foreleg >> b );
    P1DR.BIT.B1 = ( hindleg >> b );
}

逆アセンブル出力
JSR	@H'40545C:24		;スタックチェック?
MOV.L	#H'004140CE:32,ER1	;変数count
MOV.W	@ER1,R5			;
AND.W	#H'003F:16,R5		;丸め
EXTU.L	ER5			;符号拡張
SHLL.L	ER5			;int型のインデックスに変換
MOV.L	ER5,ER4			;
MOV.L	@H'4100A0:24,ER0	;adrR
ADD.L	ER5,ER0			;アドレス計算
MOV.W	@ER0,R0			;データ取得
MOV.W	R0,@H'4140CA:24		;DA0に代入
MOV.L	@H'4100A4:24,ER0	;adrL
ADD.L	ER4,ER0			;アドレス計算
MOV.W	@ER0,R0			;データ取り出し
MOV.W	R0,@H'4140CC:24		;DA1に代入
MOV.W	@ER1,R0			;変数countを再度取り出し
INC.W	#1,R0			;count++
MOV.W	R0,@ER1
;ここから下は、ビット操作。
MOV.W	@H'4140D0:24,R0		;変数foreleg
MOV.W	@H'4140D5:24,R1L	;変数b
DEC.B	R1L			;
BMI	400494:8		;マイナスなら、下のBLD何とかにジャンプ
SHAR.W	R0			;右シフト
BRA	40048C:8		;上のDEC.Bにジャンプ
BLD	#0:3,R0L		;bit0をキャリーに転送
BST	#0:3,@H'FFFFD0:8	;P1DRのBIT0にキャリーを転送
MOV.W	@H'4140D2:24,R0		;変数hindleg
MOV.B	@H'4140D5:24,R1L	;以下、同様
DEC.B	R1L
BMI	4004AE:8
SHAR.W	R0
BRA	4004A6:8
BLD	#0:3,R0L
JSR	@H'40543A:24
RTS

上半分と、下半分の処理のコード量は、同じ位に見えますが、
ビット操作では、ループ処理に展開されているので、遥かに
時間が掛かる筈です。
面白いのは、変数bはint型なのに、アセンブルでは8bit
で扱われています。シフト命令の最大値は255と言う事か。
register unsigned a = (count++ & (64  - 1));
にすると、二回もメモリから取り出したり、しまったりが無いから
その分、ちょっと高速化したのでしょう。
意外と2000円のコンパイラとは言え、コードの変換効率が高
いのが判るでしょう。成るべくレジスタを使いまわして。

これの、総ステート数を計算すれば、実行可能か、どうか判断でき
るのでは。

うーん、次からは折角日立が無料でデバックモニターを配っている
ので、是非利用して、解析に役立てて下さい。

------------------------------------------------------------
)^o^()^o^()^o^()^o^()^o^()^o^()^o^()^o^()^o^()^o^()^o^()^o^(
☆☆☆☆☆☆☆☆☆☆☆☆designed by hamayan☆☆☆☆☆☆☆☆☆
from はまやん
アドレスは
	hamayan@xxxxxxxxxxxxxxxx
★★★★★★★★★end of message and thank you★★★★★★★

スレッド概略
[表示中](起点)


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]