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 構造体の読み込みと格納命令 (VLDnVSTn) には、ベース レジスタへの書き戻しを指定するための代替構文があります。 アドレスの後に感嘆符 (!) を挿入する代わりに、基底レジスタに追加するオフセットを示す即値を指定できます。 この構文を使用する場合は、命令によって読み込まれた、または保存された正確なバイト数を指定する必要があります。

    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

関連項目

ARM アセンブラーのコマンド ライン リファレンス
ARM アセンブラー ディレクティブ