RX660シリーズでのインラインアセンブラ上の外部参照が上手く出来ない


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 AsmCode
extern void AsmCode(void)
{
.GLB _gaibu_hensu ;E0552029 アセンブラコードに使用できない記述がある
.IMPORT _gaibu_hensu ;E0552004 無効なオペランドがある

;アセンブラのコード
}
//その他の処理

エラー内容から、
.GLBは使用できず、.IMPORTを使用する為に宣言のやり方を変える必要があるのではないかと予想していたのですが、
RXシリーズのコンパイラの資料では、.GLBを使用するように記載されており、混乱しております。
参照する変数のアセンブラ内の書き方をいろいろと変えたり、([]でくくったり#や@を付けたり)
sorce1.c内部にグローバル変数を作ってそれを呼び出してみたりといろいろと試しているのですが、
どれも全て上記コメント内のエラーを返してくるため、何が原因かが分からない状態です。
また、この件に関する資料やブログ等の情報が少ないうえに、今回アセンブラコードを触るのが初めてなこともあり、
何が間違っているのかがつかみ切れていない状態です。
お知恵をお貸しいただけますと、幸いです。

Parents
  • > 今回アセンブラコードを触るのが初めてなこともあり、何が間違っているのかがつかみ切れていない状態です。
    どうしてもアセンブラで書く事情がある、という前提であれば
    イチから書き方を考えるよりコンパイラに吐かせたリスティングファイルを参考にするのが良いです。
    https://tool-support.renesas.com/autoupdate/support/onlinehelp/ja-JP/csp/latest/CS+.chm/Compiler-CCRX.chm/Output/ccrx02c0501y0301.html
    似たようなことをするものをCソースで作っておいてビルドしてみればおおよそ見当が付くのでは。
    色々やっているうちに、Cでも良いか、となる気はしますが。

  • ほやさん

    ご返信ありがとうございます。
    コンパイルオプションから、「アセンブリ・ソース・ファイルを出力する」設定で、
    アセンブラ(.srcファイル)を生成させて、
    それを参考にアセンブラコードを書くという形でやっておりましたが、
    リスティングファイルを吐き出させるというのは初めて知りました。
    ありがとうございます。参考にさせていただきます。

  • GAさまのやりたい事と違うかも知れませんが。

    global.h(外部参照をまとめたファイル)

    extern int gaibu_hensu(void);

    source2.c(関数実体)

    int gaibu_hensu(void)
    {
    	return 0;
    }

    source1.c(今回作りたいインラインアセンブラのファイル)

    #include "global.h"
    
    //C言語版
    void func1(void)
    {
    	gaibu_hensu();
    }
    
    //アセンブラコード版
    #pragma inline_asm func2
    void func2(void)
    {
    	BSR _gaibu_hensu
    }

    上記の様なファイルを作ってビルドしてみました。

    func2()がインラインアセンブラのコードで、外部関数を呼ぶコードが含まれています。func1()は、比較のためのC言語版[参考]です。

    上記をビルドして、アセンブラコードを吐き出させてみると、(オリジナルのファイル名は source1.lst)

    source1_lst.txt
    * RX FAMILY ASSEMBLER V3.06.00.01 [13 Oct 2023] *  SOURCE LIST  Thu Mar 28 13:26:41 2024
    
    LOC.     OBJ.              0XMDA SOURCE STATEMENT
    
                                     ;RX Family C/C++ Compiler (V3.06.00  [28 Nov 2023])  28-Mar-2024 13:26:41
                                     
                                     ;*** CPU TYPE ***
                                     
                                     ;-ISA=RXV3
                                     
                                     ;*** COMMAND PARAMETER ***
                                     
                                     ;src\user\source1.c
                                     ;-isa=rxv3
                                     ;-fpu
                                     ;-lang=c99
                                     ;-include=src\user
                                     ;-include=src\smc_gen\r_pincfg
                                     ;-include=src\smc_gen\r_config
                                     ;-include=src\smc_gen\r_bsp\mcu\rx660\register_access\ccrx
                                     ;-include=src\smc_gen\r_bsp\mcu\rx660
                                     ;-include=src\smc_gen\r_bsp\mcu\all
                                     ;-include=src\smc_gen\r_bsp\board\user
                                     ;-include=src\smc_gen\r_bsp\board\generic_rx660
                                     ;-include=src\smc_gen\r_bsp
                                     ;-include=src\smc_gen\general
                                     ;-output=obj=DefaultBuild\source1.obj
                                     ;-debug
                                     ;-g_line
                                     ;-listfile=DefaultBuild\source1.lst
                                     ;-optimize=0
                                     ;-tfu=intrinsic
                                     ;-map=DefaultBuild\1st\RX660.bls
                                     ;-nologo
                                     ;-asmopt=-bank
                                     
                                     		.glb	_func1
                                     		.glb	_gaibu_hensu
                                     		.glb	_func2
                                     		.SECTION	P,CODE
    00000000                         _func1:
                                     		.STACK	_func1=4
                                     		.LINE  "C:\xxx\src\user\source1.c",6
    00000000 05rrrrrr             A  		BSR _gaibu_hensu
    00000004 02                      		RTS
    00000005                         _func2:
                                     		.STACK	_func2=4
                                     		._LINE_TOP  inline_asm
    00000005 05rrrrrr             A  	BSR _gaibu_hensu
                                     		._LINE_END  inline_asm
    00000009 02                      		RTS
                                     		.END
    
    Information List
    
    TOTAL ERROR(S)    00000
    TOTAL WARNING(S)  00000
    TOTAL LINE(S)     00048   LINES
    
    Section List
    
    Attr         Size               Name
    CODE     0000000010(0000000AH)  P
    
    Cpu Type
    
    -ISA=RXV3 -FPU
    
    Command Parameter
    
    -subcommand=C:\xxx\AppData\Local\Temp\$ccrx5386267\$ccrx\source1.src.cmd
        -nologo
        -isa=rxv3
        -fpu
        -fint_register=0
        -endian=little
        -debug
        -bank
    -listfile=C:\xxx\DefaultBuild\source1.lst
    -output=C:\xxx\DefaultBuild\source1.obj
    

    の様なコードとなります。

    .glb _gaibu_hensu

    は、生成コード内に含まれているので、ユーザ側で記載しなくても良いのかと思います。

    func1(), func2()どちらも

    BSR _gaibu_hensu

    RTS

    となっており、「目的がインラインアセンブラコードの中から外部関数を呼ぶという事であれば」source1.cの様に書けば良いのではないかと思います。やりたい事がイマイチ良く判らなかったので、質問の意図に合っていない場合は申し訳ないです。

  • tf さん

    ご返信ありがとうございます。
    また、外部関数の呼び出し方のご展開ありがとうございます。
    勉強になりました。
    今後の修正作業の参考とさせていただきます。

Reply
  • tf さん

    ご返信ありがとうございます。
    また、外部関数の呼び出し方のご展開ありがとうございます。
    勉強になりました。
    今後の修正作業の参考とさせていただきます。

Children
No Data