ARM アセンブラー診断メッセージ
Microsoft ARM アセンブラー ( armasm および armasm64 は、検出されたときに診断警告とエラーを出力します。 この記事では、最も一般的に発生するメッセージについて説明します。
構文
filename ( line-number ) : [error|warning] A number : message
診断メッセージ - エラー
A2193: この命令は、予期しない動作を生成します
ARM アーキテクチャでは、この命令の実行時に何が起こるかを保証できません。 この命令の適切に定義された形式の詳細については、「ARM Architecture Reference Manual」(ARM アーキテクチャリファレンスマニュアル) を参照してください。
ADD r0, r8, pc ; A2193: this instruction generates unpredictable behavior
A2196: 命令は 16 ビットでエンコードできません
指定した命令を 16 ビットの Thumb 命令としてエンコードすることはできません。 32 ビット命令を指定するか、ターゲット ラベルを 16 ビット命令の範囲に戻すようにコードを再配置します。
アセンブラーで、16 ビットの分岐のエンコードが試みられ、32 ビットの分岐がエンコード済みであっても、このエラーで失敗する場合があります。 この問題を解決するには、.W
指定子を使用して、分岐を 32 ビットとして明示的にマークします。
ADD.N r0, r1, r2 ; A2196: instruction can't be encoded in 16 bits
B.W label ; OK
B.N label ; A2196: instruction can't be encoded in 16 bits
SPACE 10000
label
A2202: UAL 以前の命令の構文は THUMB 領域で許可されていません
Thumb コードでは、統合アセンブラー言語 (UAL) 構文を使用する必要があります。 古い構文は受け入れられなくなりました
ADDEQS r0, r1 ; A2202: Pre-UAL instruction syntax not allowed in THUMB region
ADDSEQ r0, r1 ; OK
A2513: ローテーションは偶数である必要があります
ARM モードでは、定数を指定するための代替構文があります。 #<const>
を記述する代わりに、#<byte>,#<rot>
を書き込むことができます。これは、値を右に回転させて取得した定数値<byte>
<rot>
。 この構文を使用する場合は、<rot>
の値を偶数にする必要があります。
MOV r0, #4, #2 ; OK
MOV r0, #4, #1 ; A2513: Rotation must be even
A2557: 書き戻すバイト数が正しくありません
NEON 構造体の読み込みと格納命令 (VLDn
、 VSTn
) には、ベース レジスタへの書き戻しを指定するための代替構文があります。 アドレスの後に感嘆符 (!) を挿入する代わりに、基底レジスタに追加するオフセットを示す即値を指定できます。 この構文を使用する場合は、命令によって読み込まれた、または保存された正確なバイト数を指定する必要があります。
VLD1.8 {d0-d3}, [r0]! ; OK
VLD1.8 {d0-d3}, [r0], #32 ; OK
VLD1.8 {d0-d3}, [r0], #100 ; A2557: Incorrect number of bytes to write back
診断メッセージ - 警告
A4228: アラインメント値が領域の配置を超えています。配置は保証されません
ALIGN
ディレクティブで指定された配置が、外側のAREA
の配置よりも大きい。 その結果、アセンブラーは、 ALIGN
ディレクティブが受け入れされることを保証できません。
この警告を修正するには、 AREA
ディレクティブで、目的の配置以上の ALIGN
属性を指定します。
AREA |.myarea1|
ALIGN 8 ; A4228: Alignment value exceeds AREA alignment; alignment not guaranteed
AREA |.myarea2|,ALIGN=3
ALIGN 8 ; OK
A4508: この回転定数の使用は非推奨です
ARM モードでは、定数を指定するための代替構文があります。 #<const>
を記述する代わりに、#<byte>,#<rot>
を書き込むことができます。これは、値を右に回転させて取得した定数値<byte>
<rot>
。 一部のコンテキストでは、ARM により、これらの回転定数の使用が非推奨とされています。 このような場合は、代わりに基本 #<const>
構文を使用します。
ANDS r0, r0, #1 ; OK
ANDS r0, r0, #4, #2 ; A4508: Use of this rotated constant is deprecated
A4509: この形式の条件付き命令は非推奨です
この形式の条件付き命令は、ARMv8 アーキテクチャでは ARM によって非推奨とされています。 条件分岐を使用するようにコードを変更することをお勧めします。 引き続きサポートされている条件付き命令については、「ARM Architecture Reference Manual」(ARM アーキテクチャリファレンスマニュアル) を参照してください。
この警告は、 -oldit
コマンド ライン スイッチが使用されている場合には生成されません。
ADDEQ r0, r1, r8 ; A4509: This form of conditional instruction is deprecated