ARM 組譯工具診斷訊息
Microsoft ARM 組合器、 armasm 和 armasm64,會在遇到它們時發出診斷警告和錯誤。 本文說明最常遇到的訊息。
語法
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 結構載入和儲存指示上,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:對齊值超過AREA對齊;不保證對齊
指示詞中指定的 ALIGN
對齊方式大於封 AREA
入 的對齊方式。 因此,組合器無法保證 ALIGN
會接受 指示詞。
若要修正此警告,您可以在 指示詞ALIGN
上AREA
指定等於或大於所需對齊的屬性。
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