W851は、データ・アラインしたことを通知する-W2オプション指定時にのみ出力されるワーニングのため、無視して構いません。
-W2指定時にW851を表示しないようにするには、データ・アラインしないように、
変数の定義順序を見直してください。
2バイト・アラインの場合、
__sreg char a;
__sreg int b;
と定義すると、変数aとbの間に1バイトの隙間ができます。
・BYTE(char、unsigned char)型変数、およびその配列
・1バイト・サイズの構造体、共用体
は、1バイト・アラインで配置されます。
これ以外の変数は、すべて2バイト・アラインで配置されます。
2バイト・アラインとは、配置される先頭アドレスが偶数番地であることを意味します。
変数宣言の見直し後、-W2を指定してコンパイルし、W851が出ていなければ、
データ・アラインによる1バイトの隙間ができていないことになります。
出力アセンブラ・ソースでも確認できます。
以下に簡単な例を挙げます。
"W851"のところで1バイトの隙間ができます。
__sreg char a;
__sreg short b; <- W851
__sreg char a;
__sreg long b; <- W851
__sreg char a;
__sreg char b[3];
-78K0-
-78K0S-
-78K4-
-78K0R-