Sdílet prostřednictvím


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

filename(line-number) : [error|warning] Anumber:message

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 AREAobjektu . 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 AREAALIGN 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