Udostępnij za pośrednictwem


Komunikaty diagnostyczne asemblera ARM

Asemblerzy usługi Microsoft ARM, armasm i armasm64 emitują ostrzeżenia diagnostyczne i błędy po ich napotkaniu. W tym artykule opisano najczęściej spotykane komunikaty.

Składnia

nazwa pliku ( wiersz-numer ) : [ostrzeżenie o błędzie|] Liczba: komunikat

Komunikaty diagnostyczne — błędy

A2193: ta instrukcja generuje nieprzewidywalne zachowanie

Architektura usługi ARM nie może zagwarantować, co się stanie po wykonaniu tej instrukcji. Aby uzyskać szczegółowe informacje na temat dobrze zdefiniowanych formularzy tej instrukcji, zapoznaj się z podręcznikiem dokumentacji architektury usługi ARM.

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

A2196: instrukcje nie mogą być zakodowane w 16 bitach

Określona instrukcja nie może być zakodowana jako 16-bitowa instrukcja Thumb. Określ instrukcję 32-bitową lub zmień kolejność kodu, aby przenieść etykietę docelową do zakresu instrukcji 16-bitowej.

Asembler może próbować zakodować gałąź w 16 bitach i zakończyć się niepowodzeniem z powodu tego błędu, mimo że gałąź 32-bitowa jest enododable. Ten problem można rozwiązać, używając specyfikatora .W , aby jawnie oznaczyć gałąź jako 32-bitową.

    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: Składnia instrukcji wstępnej usługi rejestrowania dostępu użytkowników nie jest dozwolona w regionie THUMB

Kod kciuka musi używać składni ujednoliconego języka asemblera (UAL). Stara składnia nie jest już akceptowana

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

A2513: Rotacja musi być parzysta

W trybie ARM istnieje alternatywna składnia określania stałych. Zamiast pisać #<const>, możesz napisać #<byte>,#<rot>wartość , która reprezentuje stałą wartość uzyskaną przez rotację wartości <byte> bezpośrednio przez <rot>. Jeśli używasz tej składni, musisz ustawić wartość parzystą <rot> .

    MOV r0, #4, #2       ; OK
    MOV r0, #4, #1       ; A2513: Rotation must be even

A2557: Nieprawidłowa liczba bajtów do zapisania zwrotnego

W przypadku ładowania struktury NEON i przechowywania instrukcji (VLDn, VSTn) istnieje alternatywna składnia określania zapisywania zwrotnego w rejestrze podstawowym. Zamiast umieszczać wykrzyknik (!) po adresie, można określić natychmiastową wartość wskazującą przesunięcie, które ma zostać dodane do rejestru podstawowego. Jeśli używasz tej składni, musisz określić dokładną liczbę bajtów załadowanych lub przechowywanych przez instrukcję.

    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

Komunikaty diagnostyczne — ostrzeżenia

A4228: Wartość wyrównania przekracza wyrównanie OBSZARU; wyrównanie nie jest gwarantowane

Wyrównanie określone w ALIGN dyrektywie jest większe niż wyrównanie otaczającego AREAelementu . W rezultacie asembler nie może zagwarantować, że ALIGN dyrektywa zostanie uznana.

Aby naprawić to ostrzeżenie, możesz określić dyrektywę AREA ALIGN atrybut, który jest równy lub większy niż żądane wyrównanie.

AREA |.myarea1|
ALIGN 8           ; A4228: Alignment value exceeds AREA alignment; alignment not guaranteed

AREA |.myarea2|,ALIGN=3
ALIGN 8           ; OK

A4508: Użycie tej obróconej stałej jest przestarzałe

W trybie ARM istnieje alternatywna składnia określania stałych. Zamiast pisać #<const>, możesz napisać #<byte>,#<rot>wartość , która reprezentuje stałą wartość uzyskaną przez rotację wartości <byte> bezpośrednio przez <rot>. W niektórych kontekstach usługa ARM przestarzała korzystanie z tych obracanych stałych. W takich przypadkach należy użyć podstawowej #<const> składni.

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

A4509: Ta forma instrukcji warunkowej jest przestarzała

Ta forma instrukcji warunkowej została uznana za przestarzałą przez usługę ARM w architekturze ARMv8. Zalecamy zmianę kodu w celu używania gałęzi warunkowych. Aby sprawdzić, które instrukcje warunkowe są nadal obsługiwane, zapoznaj się z podręcznikiem dokumentacji architektury usługi ARM.

To ostrzeżenie nie jest emitowane, gdy -oldit jest używany przełącznik wiersza polecenia.

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

Zobacz też

Dokumentacja wiersza polecenia asemblera ARM
Dyrektywy ARM dotycząca asemblera