お世話になっています。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★★★★★★★