TK303です。はじめまして。
私もまったく同じ状況、現象で悩んでいたことがあります。
On Mon, 04 Nov 2002 17:30:51 +0900
Kosaka Toshifumi <kosaka@xxxxxxxxxxxxxx> wrote:
> H8/3664(AKI-3664フラットマイコンキット)でのことです。
> 秋月で販売していたCコンパイラ(以下のバージョン)を利用しています。
> H8S,H8/300 SERIES C Compiler Ver. 2.0D Evaluation software
> H SERIES LINKAGE EDITOR Ver. 5.3B Evaluation software
>
> SCIに出力するための簡易版printf
> void SCI_printf(char *format,...)
> を作っていたのですが,
> #include <stdarg.h>
> をインクルードして
ここまで関数名以外はまったく同じ状況でした。
コンパイラ、リンカも同じで、簡易printfを作成してSCIへ出力するという
動作も同じです。
> void SCI_printf(char *format,...)
> {
> ここに必要な変数....
> va_list arg_ptr;
> va_start(arg_ptr,format);
> arg_ptr-=2; /*なぜかわからないが,ここで2を引かないと動かない*/
> /*たぶんコンパイラがアドレスビット幅について混乱しているらしい*/
> while (*format) {
>
> このように2バイトずらさないと動きません。
> このルーチンは3048では動作していたものを3664用にそのまま持ってきたものです。
3048のルーチンを3664に持ってきたのも同じです。
そして、思ったように動作しなかったので同じように arg_ptrを-2してました。
結局、私の場合はコンパイルオプション -ABS8 を外すとうまくいきました。
(他のオプションは -cpu=300hn と-I(ヘッダのインクルードパス) を指定)
-ABS8 オプションがあると、可変長引数を取る関数の場合、引数の割当て
(スタックまたはレジスタ)が変わってくるのが原因だと思っているのですが、
詳しいことは未だわかっていません。
(一番の謎は、自分が知らない間に -ABS8 オプションを付けていたことなのですが)
プログラムがある程度大きくなると、-ABS8 をつけている場合にリンク時に
エラーとなっていたのでこのオプションを外したのですが、引数がずれる問題も
直ったのが解決のきっかけです。
一度この -ABS8 オプションを確認してみてください。
(#pragma でも指定できたような気がするのでそちらも要チェックかも)
はずしていたらすみません。(でもあまりにも状況が似ているもので・・・)