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 AREA
elementu . 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