こんばんは At Sat, 08 Dec 2001 01:09:37 +0900, Masahiro Ochiai <user@xxxxxxxxxxxxx> wrote: > > > こんばんは 落合です。 > > H8/3664でプログラム作ってます。過去のログに無いようでしたので送信しました。 > > −gcc-2.95.2上での話です。− > > H8tinyシリーズはH8/300Hの他のCPUと違って、実効アドレスが16ビットとコンパクトになっています。 > > 割り込みベクタも全て16ビット幅です。マニュアルに具体的な記載が見あたらないのですが、jsr命令で > > も同様に2バイトの戻りアドレスがスタックに詰まれると思います。そうすると、jsr先の関数で引数を参照 > > した際に、コンパイラは戻りアドレスを4バイトと想定して、スタックフレームのオフセットを計算してしまう > > ので、正しく引数を取得できないようです。 暇だったので、調べてみました。(2.95.3です) -mh / -ms を指定した場合は、戻りアドレスは必ず4バイトで計算しています。 Normal Modeの事は考慮されていないようです。 不便といえば不便なので、パッチを作ってみました。 (2.95.3用。2.95.2でも多分大丈夫でしょう) -- ここから -- diff -ru gcc-2.95.3/gcc/config/h8300/h8300.h gcc-2.95.3.new/gcc/config/h8300/h8300.h --- gcc-2.95.3/gcc/config/h8300/h8300.h Mon Mar 22 09:08:28 1999 +++ gcc-2.95.3.new/gcc/config/h8300/h8300.h Sat Dec 8 21:23:45 2001 @@ -91,6 +91,8 @@ alignment. */ #define TARGET_ALIGN_300 (target_flags & 8192) +#define TARGET_MODE (target_flags & 16384) + /* Macro to define tables used to set the flags. This is a list in braces of pairs in braces, each pair being { "NAME", VALUE } @@ -110,6 +112,7 @@ {"h", 4096, "Generate H8/300H code"}, \ {"no-h", -4096, "Do not generate H8/300H code"}, \ {"align-300", 8192, "Use H8/300 alignment rules"}, \ + {"n", 16384, "NormalMode Stackframe"}, \ { "", TARGET_DEFAULT, NULL}} /* Do things that must be done once at start up. */ @@ -188,7 +191,8 @@ #define MAX_FIXED_MODE_SIZE 32 /* Allocation boundary (in *bits*) for storing arguments in argument list. */ -#define PARM_BOUNDARY (TARGET_H8300H || TARGET_H8300S ? 32 : 16) +#define PARM_BOUNDARY \ + ((TARGET_H8300H || TARGET_H8300S) && !TARGET_MODE ? 32 : 16) /* Allocation boundary (in *bits*) for the code of a function. */ #define FUNCTION_BOUNDARY 16 diff -ru gcc-2.95.3/gcc/config/h8300/t-h8300 gcc-2.95.3.new/gcc/config/h8300/t-h8300 --- gcc-2.95.3/gcc/config/h8300/t-h8300 Thu Dec 17 06:02:56 1998 +++ gcc-2.95.3.new/gcc/config/h8300/t-h8300 Sat Dec 8 21:55:20 2001 @@ -18,8 +18,8 @@ echo '#endif' >> fp-bit.c cat $(srcdir)/config/fp-bit.c >> fp-bit.c -MULTILIB_OPTIONS = mh/ms mint32 -MULTILIB_DIRNAMES = h8300h h8300s int32 +MULTILIB_OPTIONS = mh/ms mn mint32 +MULTILIB_DIRNAMES = h8300h h8300s normal int32 MULTILIB_EXCEPTIONS = mint32 LIBGCC = stmp-multilib -- ここまで -- パッチを当ててGCCを作りなおすと、-mn というオプションが使えるようにな ります。 指定してコンパイルすると、戻りアドレスを2バイトで計算するようになりま す。 試してみてください。 -- 佐藤 嘉則 <qzb04471@xxxxxxxxxxx>