分享方式:


ARM 組譯工具診斷訊息

Microsoft ARM 組合器、 armasmarmasm64,會在遇到它們時發出診斷警告和錯誤。 本文說明最常遇到的訊息。

語法

filename 行號) : [錯誤|警告] 數位: 訊息

診斷訊息 - 錯誤

A2193:此指令會產生無法預期的行為

ARM 架構無法保證執行此指令時會發生什麼事。 如需此指示定義完善的表單詳細數據,請參閱 ARM架構參考手冊

    ADD r0, r8, pc         ; A2193: this instruction generates unpredictable behavior

A2196:指令無法以16位編碼

指定的指令無法編碼為16位 Thumb 指令。 指定 32 位指令或重新排列程式代碼,以將目標標籤帶入 16 位指令的範圍。

即使 32 位分支可編碼,組合器仍可能嘗試以 16 位編碼分支,但發生此錯誤而失敗。 您可以使用規範明確將分支標示為32位,以解決此問題 .W

    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:THUMB 區域中不允許預先 UAL 指令語法

Thumb 程式代碼必須使用 Unified Assembler Language (UAL) 語法。 已不再接受舊語法

    ADDEQS r0, r1         ; A2202: Pre-UAL instruction syntax not allowed in THUMB region
    ADDSEQ r0, r1         ; OK

A2513:旋轉必須是偶數

在 ARM 模式中,有替代語法可指定常數。 您可以撰寫 ,而不是寫入 #<const>#<byte>,#<rot>,代表藉由向右<rot>旋轉值<byte>所取得的常數值。 當您使用此語法時,您必須將 的值 <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:對齊值超過AREA對齊;不保證對齊

指示詞中指定的 ALIGN 對齊方式大於封 AREA入 的對齊方式。 因此,組合器無法保證 ALIGN 會接受 指示詞。

若要修正此警告,您可以在 指示詞ALIGNAREA指定等於或大於所需對齊的屬性。

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>,代表藉由向右<rot>旋轉值<byte>所取得的常數值。 在某些內容中,ARM 已取代使用這些旋轉常數。 在這些情況下,請改用基本 #<const> 語法。

    ANDS r0, r0, #1                ; OK
    ANDS r0, r0, #4, #2            ; A4508: Use of this rotated constant is deprecated

A4509:此形式的條件式指令已被取代

ARMv8 架構中的ARM已取代這種形式的條件式指令。 建議您變更程式碼以使用條件式分支。 若要查看仍支援哪些條件式指示,請參閱 ARM架構參考手冊

使用命令行參數時 -oldit ,不會發出這個警告。

    ADDEQ r0, r1, r8              ; A4509: This form of conditional instruction is deprecated

另請參閱

ARM 組譯工具命令列參考
ARM 組譯工具指示詞