■質問
SHのデータ割り付けはBig EndianですかLittle Endianですか。
■回答
日立SuperH RISC engineファミリはBig Endianです。
ただし、SH-3、SH-3E、SH-4ではCPUのBig/Little切り替え機能に対応して"-endian=Big(Little) "のオプションをサポートしています。
【注】
(1) "-endian"オプションは、"-cpu"オプションの任意のサブオプションと組み合わせが可能 ですが、 Little Endianのオブジェクトプログラムは、SH-3、SH-3E、SH-4以外では実 行できません。
(2) Big Endian のオブジェクトとLittle Endian のオブジェクトを混在して使うことはでき ません。
(3) Endianの違いにより、プログラムの実行結果に影響がでることがあります。
例)Endianの違いで影響のでるコーディング
f( ){
int a=0x12345678;
char *p;
p=((char *)(&a));
if(*p==0x12){ (1) } else{ (2) }
}
この場合、Big Endian ならば(1)の処理が実行され、Little Endianならば*pは0x78ですか ら、(2)の処理が実行されます。
(データの割付けについて詳しくは「SuperH RISC engine C/C++コンパイラユーザーズマニュ アル 2.2.2 (4) Little Endianのメモリ割り付け」を参照してください。)
(4) -denormalize=on|off オプション指定により、非正規化数を扱うか0とするかの選択
が可能です。(-cpu=sh4時のみ)
ただし、 -denormalize=on のとき、FPUに非正規化数が入力されると例外発生する
ので、非正規化数を処理するための例外処理をソフトウェアで記述する必要があります。
・オプションと標準ライブラリの対応について 標準ライブラリには、次の 74 種類があります。
表5.6オプションと標準ライブラリの対応表(1) コンパイラオプション ライブラリ名
cpu pic endian denormal round fpu double=float
shclib.lib sh1 - big - - - なし
shclibf.lib sh1 - big - - - あり
shcnpic.lib sh2 0 big - - - なし
shcpic.lib sh2 1 big - - - なし
shcnpicf.lib sh2 0 big - - - あり
shcpicf.lib sh2 1 big - - - あり
shc2enp.lib sh2e 0 big - - - なし
shc2ep.lib sh2e 1 big - - - なし
shc2enpf.lib sh2e 0 big - - - あり
shc2epf.lib sh2e 1 big - - - あり
shc3npb.lib sh3 0 big - - - なし
shc3pb.lib sh3 1 big - - - なし
shc3npl.lib sh3 0 little - - - なし
shc3pl.lib sh3 1 little - - - なし
shc3npbf.lib sh3 0 big - - - あり
shc3pbf.lib sh3 1 big - - - あり
shc3nplf.lib sh3 0 little - - - あり
shc3plf.lib sh3 1 little - - - あり
shcenpb.lib sh3e 0 big - - - なし
shcepb.lib sh3e 1 big - - - なし
shcenpl.lib sh3e 0 little - - - なし
shcepl.lib sh3e 1 little - - - なし
shcenpbf.lib sh3e 0 big - - - あり
shcepbf.lib sh3e 1 big - - - あり
shcenplf.lib sh3e 0 little - - - あり
shceplf.lib sh3e 1 little - - - あり
sh4nbmzz.lib sh4 0 big Off zero なし
-sh4pbmzz.lib sh4 1 big Off zero なし
-sh4nlmzz.lib sh4 0 little Off zero なし
-sh4plmzz.lib sh4 1 little Off zero なし
-sh4nbmdz.lib sh4 0 big On zero なし
-sh4pbmdz.lib sh4 1 big On zero なし
-sh4nlmdz.lib sh4 0 little On zero なし
-sh4plmdz.lib sh4 1 little On zero なし
-sh4nbmzn.lib sh4 0 big Off nearest なし
-表5.6オプションと標準ライブラリの対応表(2) コンパイラオプション ライブラリ名
cpu pic endian denormal round fpu double=float
sh4pbmzn.lib sh4 1 big Off nearest なし
-sh4nlmzn.lib sh4 0 little Off nearest なし
-sh4plmzn.lib sh4 1 little Off nearest なし
-sh4nbmdn.lib sh4 0 big On nearest なし
-sh4pbmdn.lib sh4 1 big On nearest なし
-sh4nlmdn.lib sh4 0 little On nearest なし
-sh4plmdn.lib sh4 1 little On nearest なし
-sh4nbfzz.lib sh4 0 big Off zero single
-sh4pbfzz.lib sh4 1 big Off zero single
-sh4nlfzz.lib sh4 0 little Off zero single
-sh4plfzz.lib sh4 1 little Off zero single
-sh4nbfdz.lib sh4 0 big On zero single
-sh4pbfdz.lib sh4 1 big On zero single
-sh4nlfdz.lib sh4 0 little On zero single
-sh4plfdz.lib sh4 1 little On zero single
-sh4nbfzn.lib sh4 0 big Off nearest single
-sh4pbfzn.lib sh4 1 big Off nearest single
-sh4nlfzn.lib sh4 0 little Off nearest single
-sh4plfzn.lib sh4 1 little Off nearest single
-sh4nbfdn.lib sh4 0 big On nearest single
-sh4pbfdn.lib sh4 1 big On nearest single
-sh4nlfdn.lib sh4 0 little On nearest single
-sh4plfdn.lib sh4 1 little On nearest single
-sh4nbdzz.lib sh4 0 big Off zero double
-sh4pbdzz.lib sh4 1 big Off zero double
-sh4nldzz.lib sh4 0 little Off zero double
-sh4pldzz.lib sh4 1 little Off zero double
-sh4nbddz.lib sh4 0 big On zero double
-sh4pbddz.lib sh4 1 big On zero double
-sh4nlddz.lib sh4 0 little On zero double
sh4plddz.lib sh4 1 little On zero double
-sh4nbdzn.lib sh4 0 big Off nearest double
-sh4pbdzn.lib sh4 1 big Off nearest double
-sh4nldzn.lib sh4 0 little Off nearest double
-sh4pldzn.lib sh4 1 little Off nearest double
-sh4nbddn.lib sh4 0 big On nearest double
-sh4pbddn.lib sh4 1 big On nearest double
-sh4nlddn.lib sh4 0 little On nearest double
-sh4plddn.lib sh4 1 little On nearest double
-5.21 #pragma inline_asm 使用時のアセンブル
■質問
#pragma inline_asm を使用したプログラムでアセンブル時に"ILLEGAL DATA AREA ADDRESS
(エラー番号452)"のエラーがでてしまいます。
■回答
(1)"-code=asmcode"オプションを付けてコンパイルしていますか。
(2)アセンブリコード中でデータテーブルを記述していませんか。
これには次のような原因が考えられます。
#pragma inline_asm(bar) int bar()
{
MOV.L #160,R9 }
上記コーディング中の
MOV.L #160,R9
の部分は、SuperHマイコンの命令では値"160"を直接レジスタへMOVする命令がありません。
通常データプールを作成し、ロードしなければなりません。アセンブラではこれを自動的に認 識し、データプールを生成していますが、逆に生成された分、コンパイラの出力したアセンブ ラソース上のアラインメントがずれてしまい、エラーとなります。現在のコンパイラでは、こ のようにアセンブラが自動的にデータを生成してしまうケースを想定していないため、当面
「inline_asm関数中のアセンブラソースには、アセンブラが自動的にデータプールを生成してし まうようなコーディング」はできません。ただし、上記例のケースでは以下のようにコーディ ングを変更することで回避可能です。
【回避例】
<変更前>
MOV.L #160,R9 <変更後>
MOV #100,R9 ADD #60,R9