Diagnostické zprávy assembleru ARM
Assemblery Microsoft ARM, armasm a armasm64 vygenerují diagnostická upozornění a chyby, když na ně narazí. Tento článek popisuje nejčastěji používané zprávy.
Syntaxe
název souboru (řádek-číslo): [upozornění chyby|] Číslo: zpráva
Diagnostické zprávy – chyby
A2193: Tato instrukce generuje nepředvídatelné chování
Architektura ARM nemůže zaručit, co se stane, když se tato instrukce spustí. Podrobnosti o dobře definovaných formách této instrukce najdete v referenční příručce k architektuře ARM.
ADD r0, r8, pc ; A2193: this instruction generates unpredictable behavior
A2196: Instrukce nelze zakódovat do 16 bitů
Zadaná instrukce se nedá zakódovat jako 16bitová instrukce thumb. Zadejte 32bitovou instrukci nebo změňte uspořádání kódu tak, aby cílový popisek přenesl do rozsahu 16bitové instrukce.
Assembler se může pokusit zakódovat větev v 16 bitech a selhat s touto chybou, i když je 32bitová větev zapouzdřená. Tento problém můžete vyřešit pomocí specifikátoru .W
a explicitně označit větev jako 32bitovou.
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: Syntaxe instrukcí pre-UAL není povolená v oblasti THUMB
Kryptografický kód musí používat syntaxi UAL (Unified Assembler Language). Stará syntaxe se už nepřijímá.
ADDEQS r0, r1 ; A2202: Pre-UAL instruction syntax not allowed in THUMB region
ADDSEQ r0, r1 ; OK
A2513: Otočení musí být sudé
V režimu ARM existuje alternativní syntaxe pro zadávání konstant. Místo psaní můžete napsat #<const>
#<byte>,#<rot>
, což představuje konstantní hodnotu, která je získána otočením hodnoty <byte>
doprava <rot>
. Pokud použijete tuto syntaxi, musíte nastavit hodnotu sudé <rot>
.
MOV r0, #4, #2 ; OK
MOV r0, #4, #1 ; A2513: Rotation must be even
A2557: Nesprávný počet bajtů pro zpětný zápis
Na načtení a uložení struktury NEON (VLDn
, VSTn
) existuje alternativní syntaxe pro určení zpětného zápisu do základního registru. Místo umístění vykřičníku (!) za adresu můžete zadat okamžitou hodnotu, která označuje posun, který se má přidat do základního registru. Pokud použijete tuto syntaxi, je nutné zadat přesný počet bajtů, které byly načteny nebo uloženy instrukcí.
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
Diagnostické zprávy – upozornění
A4228: Hodnota zarovnání překračuje zarovnání OBLASTI; sladění není zaručeno
Zarovnání zadané v ALIGN
direktivě je větší než zarovnání ohraničujícího AREA
objektu . V důsledku toho assembler nemůže zaručit, že direktiva ALIGN
bude dodržena.
Chcete-li toto upozornění opravit, můžete pro direktivu AREA
ALIGN
zadat atribut, který je roven nebo větší než požadované zarovnání.
AREA |.myarea1|
ALIGN 8 ; A4228: Alignment value exceeds AREA alignment; alignment not guaranteed
AREA |.myarea2|,ALIGN=3
ALIGN 8 ; OK
A4508: Použití této otočené konstanty je zastaralé
V režimu ARM existuje alternativní syntaxe pro zadávání konstant. Místo psaní můžete napsat #<const>
#<byte>,#<rot>
, což představuje konstantní hodnotu, která je získána otočením hodnoty <byte>
doprava <rot>
. V některých kontextech ARM přestal používat tyto otočené konstanty. V těchto případech použijte místo toho základní #<const>
syntaxi.
ANDS r0, r0, #1 ; OK
ANDS r0, r0, #4, #2 ; A4508: Use of this rotated constant is deprecated
A4509: Tato forma podmíněné instrukce je zastaralá
Tato forma podmíněné instrukce se v architektuře ARMv8 vyřadila z ARM. Doporučujeme změnit kód tak, aby používal podmíněné větve. Pokud chcete zjistit, které podmíněné pokyny jsou stále podporované, projděte si referenční příručku k architektuře ARM.
Toto upozornění se nevygeneruje při použití přepínače příkazového -oldit
řádku.
ADDEQ r0, r1, r8 ; A4509: This form of conditional instruction is deprecated
Viz také
Referenční dokumentace pro použití nástroje assembleru ARM v příkazovém řádku
Direktivy assembleru ARM