ブートローダを書いたときの困りごとその2

その1.GNU拡張アセンブラ
例えば、asm("xorl %eax,%eax")みたいなやつ。
Interface 2002年7月号のサンプルプログラムではasm内の文字列が複数行にわたって記述されているものがあったが、これが軒並みコンパイルエラー。
例えばこんなやつ。

asm("
movl $_data_end,%edi
movl $_bss_end,%ecx
");

面倒だけど一行一行asm("....");を記述してあげることでコンパイルエラー解消。
理由は不明だが、GCCのバージョンアップによって昔(GCC2.95)のときに許されていたコードがアウトになったのか・・・。

その2.code16gccとcode32の混在
これが一番ハマった。
例えば以下のようなプログラムを一つのソースファイルに書いた場合。

asm(".code16gcc");
プログラム(ここにあるプログラムは16bitコードで吐き出されてほしい)

asm(".code32"); /* 以後は32bitコードで吐き出されてほしい */
プログラム

これをコンパイルするとどうも全てのプログラムが32bitコードで吐き出されてしまうみたいだ。
なぜだろう、う〜ん。