Diagnostické zprávy assembleru ARM

Microsoft ARM Assembler (armasm) generuje diagnostická upozornění a chyby, když k nim dojde. Tento článek popisuje nejčastěji zjištěné zprávy.

Syntax

filename(číslo řádku): [upozornění nachybu] čí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 formulářích této instrukce najdete v Referenční příručce architektury ARM.

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

A2196: instrukce nemůže být kódovaná ve 16 bitech.

Zadanou instrukci nelze zakódovat jako 16bitové instrukce pro palec. Zadejte 32 bitovou instrukci nebo přeuspořádání kódu pro uvedení cílového popisku do rozsahu 16bitové instrukce.

Assembler se může pokusit o kódování větve ve 16 bitech a selhání s touto chybou, i když je encodable větev 32. Tento problém lze vyřešit tak, že pomocí .W specifikátoru výslovně označíte větev jako 32-bit.

    ADD.N r0, r1, r2      ; A2196: instruction cannot be encoded in 16 bits

    B.W label             ; OK
    B.N label             ; A2196: instruction cannot be encoded in 16 bits
    SPACE 10000
label

A2202: syntaxe instrukce před protokolování přístupu uživatele není povolená v oblasti s MINIATURami.

Kód pro palec musí používat syntaxi protokolování přístupu uživatele (Unified Assembler Language). Stará syntaxe již není přijata.

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

A2513: rotace musí být sudá

V režimu ARM existuje alternativní syntaxe pro určení konstant. Namísto psaní #<const> můžete napsat #<byte>,#<rot> , který představuje konstantní hodnotu získanou otočením hodnoty <byte> vpravo hodnotou <rot> . Při použití této syntaxe je nutné provést hodnotu <rot> i.

    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

V pokynech pro načtení struktury NEON a ukládání ( VLDn , VSTn ) existuje alternativní syntaxe pro určení zpětného zápisu do základního registru. Místo vložení vykřičníku (!) za adresu můžete zadat okamžitou hodnotu, která označuje posun, který má být přidán do základního registru. Použijete-li 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; zarovnání není zaručené

Zarovnání, které je zadáno v ALIGN direktivě, je větší než zarovnání ohraničujícího AREA . V důsledku toho Assembler nemůže zaručit, že bude ALIGN dodržena tato direktiva.

Chcete-li tento problém vyřešit, můžete zadat v AREA direktivě ALIGN 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 určení konstant. Namísto psaní #<const> můžete napsat #<byte>,#<rot> , který představuje konstantní hodnotu získanou otočením hodnoty <byte> vpravo hodnotou <rot> . V některých kontextech už ARM nepoužívá tyto otočené konstanty. V těchto případech použijte #<const> místo toho základní 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 je v architektuře ARMv8 zastaralá o ARM. Doporučujeme změnit kód tak, aby používal podmíněné větve. Pokud chcete zjistit, které podmíněné instrukce jsou pořád podporované, Projděte si referenční příručku architektury ARM.

Toto upozornění se nevygeneruje, když se použije přepínač příkazového řádku -OLDI .

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

Viz také

Referenční informace o Command-Line assembleru ARM
Direktivy assembleru ARM