R8C:ASM関数の戻り値(unsigned char)の判定について

toitecです。
嫌いなC言語にチャレンジしたところ、下記内容にて
躓いてしまいました。勉強不足/仕様/バグなのか、
手っ取り早く質問してみました。
よろしくお願いします。

===== 内容 =====
if文の判定式において、アセンブラ原型関数の戻り値
(unsigned char型)の判定がおかしい。
Hew:Version 4.09.00.007

===== ソース =====
// アセンブラ関数原型宣言
extern unsigned char _test_func(void);
  // unsigned char なので戻り値:R0Lのはず

// プロトタイプ宣言
void main(void);

void main()
{
  unsigned char i;

  i = test_func();

  if (test_func() == 0)
  {
    i = 0xff;
  }
}

===== アセンブルリストから抜粋 =====
;## # C_SRC : {
    .glb _main
_main:
    enter #01H
;## # C_SRC : i = test_func();
    jsr _test_func
    mov.b R0L\,-1[FB] ; i   <-:正しく
                    R0Lで処理
;## # C_SRC : if (test_func() == 0)
    jsr _test_func
    cmp.w #0000H\,R0 <-:R0にて
                    判断???
    stz #0ffH\,-1[FB] ; i
;## # C_SRC : }
    exitd
Parents
  • ramothです。


    > // アセンブラ関数原型宣言
    > extern unsigned char _test_func(void);

    > i = test_func();

    見たところ、プロトタイプ宣言の関数名に _
    (アンダースコア)が付いてしまっています。
    おそらくアセンブラ側の関数先頭のラベルが、_ +関数名となる
    のと混乱しているようです。

    プロトタイプ宣言の _ を取ればうまくいくはずです。

    いまのままだと、プロトタイプ宣言は 未参照+実体不存在の関数
    (これはコンパイラはエラーとはしません)と解釈し、
    関数呼び出し部分はプロトタイプ宣言を行っていない関数呼び出し
    (これはC言語の仕様で 戻り値=int の関数であると仮定してしまいます)
    と解釈するので、戻り値はアセンブラ側のR0の値となります。

Reply
  • ramothです。


    > // アセンブラ関数原型宣言
    > extern unsigned char _test_func(void);

    > i = test_func();

    見たところ、プロトタイプ宣言の関数名に _
    (アンダースコア)が付いてしまっています。
    おそらくアセンブラ側の関数先頭のラベルが、_ +関数名となる
    のと混乱しているようです。

    プロトタイプ宣言の _ を取ればうまくいくはずです。

    いまのままだと、プロトタイプ宣言は 未参照+実体不存在の関数
    (これはコンパイラはエラーとはしません)と解釈し、
    関数呼び出し部分はプロトタイプ宣言を行っていない関数呼び出し
    (これはC言語の仕様で 戻り値=int の関数であると仮定してしまいます)
    と解釈するので、戻り値はアセンブラ側のR0の値となります。

Children
No Data