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さん、ありがとうございます。

    友人からも同様の指摘を頂きました。
    それでも、なんとなく腑に落ちないので調査して
    みました。

    結論としては

    1.引数がない場合は、「_」の有/無の両方とも
      コンパイラは正常終了する。
      この時、
      ・「_」有りの場合は戻り値が int型で処理
      ・「_」無しの場合は戻り値が char型で処理

    2.引数がある場合は
      ・「_」有りの場合は戻り値が int型で処理
      ・「_」無しの場合は、エラー

    提示したサンプルソースが、解決に対しては不適切
    でした。実際に作成したソースは「引数あり」でし
    たので、「_」を追記していました。
    状況が明確になったので、前に進めそうです。

    ご協力、ありがとうございました。
Reply
  • ramothさん、ありがとうございます。

    友人からも同様の指摘を頂きました。
    それでも、なんとなく腑に落ちないので調査して
    みました。

    結論としては

    1.引数がない場合は、「_」の有/無の両方とも
      コンパイラは正常終了する。
      この時、
      ・「_」有りの場合は戻り値が int型で処理
      ・「_」無しの場合は戻り値が char型で処理

    2.引数がある場合は
      ・「_」有りの場合は戻り値が int型で処理
      ・「_」無しの場合は、エラー

    提示したサンプルソースが、解決に対しては不適切
    でした。実際に作成したソースは「引数あり」でし
    たので、「_」を追記していました。
    状況が明確になったので、前に進めそうです。

    ご協力、ありがとうございました。
Children
No Data