GAと申します。表題の通り、RX660シリーズを使用したソフトを作成しております。以前別スレッドにてご相談させていただき、無事アセンブラコードが動き始めたのですが、一部どうしても解決出来ない事項があり、ご相談させていただきました。
◎状況取引先様から頂いた、元々H8Sシリーズにて使用されていたソフトを、CPU変更に伴い、RX660シリーズで作り直しています。その処理の中に、外部変数(別ファイルで定義されている変数)を参照する必要があるのですが、上手くビルドが出来ません。(該当部分をコメントアウトするとビルドが通るので、ここが原因となっているのは間違いありません。)
◎開発環境
・使用マイコン移植前:HD64F2145B移植先:R5F56609EDFP
・開発環境 CS+(移植前の開発環境は不明ですが、恐らくHEWだと思われます)
◎該当箇所(社外秘の為、詳細な内容を書くことが出来ないことをご了承ください)
・global.h(外部参照する変数・関数をまとめたファイル)#define GLOBAL extern#define GLOBAL_VAL(V)GLOBAL int gaibu_hensu GLOBAL_VAL( 0 );//他の宣言
・sorce1.c(関数実体のファイル)//その他の処理#pragma inline_asm AsmCodeextern void AsmCode(void){ .GLB _gaibu_hensu ;E0552029 アセンブラコードに使用できない記述がある .IMPORT _gaibu_hensu ;E0552004 無効なオペランドがある ;アセンブラのコード}//その他の処理
エラー内容から、.GLBは使用できず、.IMPORTを使用する為に宣言のやり方を変える必要があるのではないかと予想していたのですが、RXシリーズのコンパイラの資料では、.GLBを使用するように記載されており、混乱しております。参照する変数のアセンブラ内の書き方をいろいろと変えたり、([]でくくったり#や@を付けたり)sorce1.c内部にグローバル変数を作ってそれを呼び出してみたりといろいろと試しているのですが、どれも全て上記コメント内のエラーを返してくるため、何が原因かが分からない状態です。また、この件に関する資料やブログ等の情報が少ないうえに、今回アセンブラコードを触るのが初めてなこともあり、何が間違っているのかがつかみ切れていない状態です。お知恵をお貸しいただけますと、幸いです。
[CC ヘルプ] 中の CC-RX →コンパイラ篇→拡張言語仕様→アセンブラ記述関数インライン展開、によると
- テンポラリラベルと RX 命令だけが記述できる
- アセンブラ制御命令 (.GLB はこれに該当)は記述できない
- CCRX ABI を守ってね(同マニュアル 9章)
- スタック使用量はインラインアセンブラ部に関しては使用量0として扱われる
とあります。実際にウチで #pragma inline_asm なサンプル書いたところそのようになりました (CCRX Ver3.05.00)
まずもってフツーに考えると素人が手書きしたアセンブラよりコンパイラの生成するコードのほうが高速なのですが、どうしてもなにがなんでもインラインアセンブラ使う必要があるんですか? 私なら当該アセンブラ部分を C/C++ で書き直すほうを選択します。
まあ技術的興味って奴からこんなの書いてみたところおよそ期待通りの動作をしていますので参考にしてください。
extern int foo, bar;
int piyofunc() { return foo+bar;}
#pragma inline_asm hogefuncint hogefunc() { MOV.L #_foo, R14; MOV.L #_bar, R15; MOV.L [R14],R1; ADD [R15].L,R1;}
要するに変数 foo や bar を使うための擬似命令 .glb _foo がインラインアセンブラ部で手書きできないのならばコンパイラに生成してもらおう、ってのが piyofunc() を書いている意味です。んでもってそういう記述が生成済みならインラインアセンブラ部からも変数ラベル _foo とかが使える、ということで。
上記関数は故意にコンパイラの生成する機械語と順番を入れ替えてあります。どちらがパイプラインストールする回数が少ないかとか数えてみてください(この例では単純すぎて大差ないです)
インラインアセンブラ部で CC-RX ABI が守れないと即暴走しますので、この説明だけでゼッタイ書ける!と自信が無いのであればアセンブラ手書きはお勧めしません(っていうか私が上司ならアセンブラ手書きを禁止します)。
cacao99さん
ご返信ありがとうございます。
>- テンポラリラベルと RX 命令だけが記述できる>- アセンブラ制御命令 (.GLB はこれに該当)は記述できない→ご教授いただきありがとうございます。アセンブラ制御命令は書けないのですね。 理解致しました。
>まずもってフツーに考えると素人が手書きしたアセンブラよりコンパイラの生成するコードのほうが高速なのですが、どうしてもなにがなんでもインラインアセンブラ使う必要があるんですか? 私なら当該アセンブラ部分を C/C++ で書き直すほうを選択します。→実は該当箇所の目的が、セルフチェックとしてアセンブラ命令が実行できることを確認する、という処理なのです。 目的があってアセンブラを使うのではなく、アセンブラを使うことが目的なのです。 (個人的にアセンブラ命令が実行できることをわざわざ確認する必要があるのかは疑問なのですが、要求仕様なので仕方なく…。)
>まあ技術的興味って奴からこんなの書いてみたところおよそ期待通りの動作をしていますので参考にしてください。>要するに変数 foo や bar を使うための擬似命令 .glb _foo がインラインアセンブラ部で手書きできないのならばコンパイラに生成してもらおう、ってのが piyofunc() を書いている意味です。んでもってそういう記述が生成済みならインラインアセンブラ部からも変数ラベル _foo とかが使える、ということで。→ご展開いただきありがとうございます。 内容確認させていただき、参考にしてこちらのコードに落とし込んだところ、無事ビルドは通りました。 とても助かりました、ありがとうございます。