Programowanie w asemblerze ARM: instrukcje

Transkrypt

Programowanie w asemblerze ARM: instrukcje
Programowanie w asemblerze
ARM: instrukcje
Zbigniew Jurkiewicz, Instytut Informatyki UW
17 stycznia 2017
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze ARM: instrukcje
Instrukcje sterujace:
˛
skoki
Instrukcja skoku
B etykieta
Dzieki
˛ sufiksom warunków mamy skoki warunkowe.
Adres wzgledny
˛
(do pc), w zakresie ok. 32 MB.
Wariant
BX rejestr
pozwala na przejście do trybu Thumb (jeśli dolny bit adresu
ustawiony), a także na dynamiczne obliczenie adresu.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze ARM: instrukcje
Skoki warunkowe
Rejestr stanu cpsr (Current Program Status Register)
zawiera cztery podstawowe flagi dla warunków: N
(Negative), Z (Zero), C (carry) and V (oVerflow).
Skoki warunkowe maja˛ mnemoniki b<warunek>, przy czym
warunek to jeden z ciagów
˛
liter: eq (equal), neq (not
equal), ge (greater or equal, dla liczb ze znakiem), lt (lower
than), gt (greather than), le (lower or equal), mi
(minus/negative), pl (plus/positive), os (overflow set), oc
(overflow clear), hi (higher, bez znaku), ls (lower or same),
cs/hs (carry set/higher or same), cc/lo (carry clear/lower).
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze ARM: instrukcje
Wywołania procedur
Instrukcja wywołania procedury to skok ze śladem
(adresem powrotnym) w rejestrze lr
BL etykieta
Tu też wolno używać sufiksów warunków.
Tak jak B ma wariant
BLX rejestr
pozwalajacy
˛ na przejście do trybu Thumb oraz
dynamiczne obliczenie adresu.
Ma też wariant
BLX etykieta
z bezwarunkowym przejściem do trybu Thumb.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze ARM: instrukcje
Przesłania do/z pamieci
˛
Instrukcje
LDR rejestr,adres
STR rejestr,adres
służa˛ do przepisywania 4 bajtów z pamieci
˛ do rejestru i
odwrotnie.
Argument adres składa sie˛ z rejestru i przesuniecia,
˛
zostanie opisany za chwile.
˛
Warianty do przesyłania pojedynczych bajtów z
rozszerzeniem bitu znaku (LDRSB) i bez (LDRB, STRB).
Warianty do przesyłania par bajtów z rozszerzeniem bitu
znaku (LDRSH) i bez (LDRH, STRHB).
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze ARM: instrukcje
Tryby adresowe
Adres składa sie˛ zawsze z rejestru adresu bazowego i
przesuniecia:
˛
rejestru lub stałej.
Przy zapisywaniu instrukcji można pominać
˛ przesuniecie,
˛
oznacza to przesuniecie
˛
0, tzn. poniższe instrukcje sa˛
równoważne
LDR r0,[r1]
LDR r0,[r1,#0]
Indeksowanie z przesunieciem
˛
pozwala na pre- i
postinkrementacje,
˛ nazywane nie wiadomo czemu
preindex i postindex.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze ARM: instrukcje
Preinkrementacja
Adres efektywny wyznacza sie˛ dodajac
˛ przesuniecie
˛
do
bazy. W wariancie podstawowym po wykonaniu przesłania
rejestr bazowy nie ulega zmianie
LDR r0,[r1,#4]
LDR r3,[r4,r5]
LDR r5,[r6,r7,LSR #4]
W wariancie preindexing with writeback adres efektywny
jest wpisywany do rejestru bazowego, co oznacza
zwiekszenie
˛
rejestru bazowego o wartość przesuniecia
˛
LDR r0,[r1,#4]!
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze ARM: instrukcje
Postinkrementacja
Przy tej metodzie adresem efektywnym jest zawartość
rejestru bazowego, natomiast po dokonaniu przesłania jest
on zawsze zwiekszany
˛
o wartość przesuniecia
˛
LDR r0,[r1],#4
LDR r5,[r6],-r7,LSR #4
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze ARM: instrukcje
Przesłania wielokrotne
Można jedna˛ instrukcja˛ przesłać do/z kilku rejestrów cały
blok pamieci
˛
LDMIA r0,{r1-r3,r5}
STMDB r0,{r1-r3,r5}
Ma ona wariant z finalna˛ modyfikacja˛ rejestru bazowego
LDMIB r7!,{r1-r3,r5}
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze ARM: instrukcje
Przesłania wielokrotne
Bazowy mnemonik operacji to LDM i STM.
Modyfikatory określaja,
˛ kiedy i jak ma być obliczany adres
efektywny
IA = Increment After
IB = Increment Before
DA = Decrement After
DB = Decrement Before
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze ARM: instrukcje
Przesłania wielokrotne
Przykład: kopiowanie 32 bajtów, adres źródłowy w r0, docelowy
w r1
LDMIA r0,{r2-r9}
STMIA r1,{r2-r9}
Uwaga: kolejność kopiowania jest zgodna z numerami
rejestrów, niezależnie od kolejności zapisu w instrukcji.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze ARM: instrukcje
Operacje na stosie
Architektura dopuszcza cztery rodzaje stosów, określone
kombinacja˛ dwóch cech:
kierunku w jakim przyrasta stos, stos może być
rosnacy
˛ (A od ascending), gdzie stos przyrasta w kierunku
wiekszych
˛
adresów
malejacy
˛ (D od descending)
na co wskazuje rejestr wierzchołka sp, stos może być
pełny (F od full), sp wskazuje na ostatni zajety
˛ (zapełniony)
element stosu
pusty (E od empty), sp wskazuje na pierwsze wolne
miejsce
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze ARM: instrukcje
Operacje na stosie
Kombinacje par liter (np. FD) stanowia˛ modyfikatory,
dołaczane
˛
do instrukcji LDM i STM.
Można jedna˛ instrukcja˛ odkładać na stos wiele rejestrów
STMFD sp!,{r0-r2}
W rzeczywistości sa˛ instrukcje wielokrotnego zapisu, np.
LDMFD to LDMDA.
Standardowe konwencje (ATPCS) zalecaja˛ używanie
pełnego stosu malejacego,
˛
czyli instrukcji LDMFD i
STMFD.
Poczawszy
˛
od ARMv5 stos musi być wyrównany do
granicy 8 bajtów, bo wprowadzono instrukcje LDRD i
STRD.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze ARM: instrukcje
Instrukcje zamiany
Instrukcja SWP zamienia zawartość pamieci
˛ z zawartościa˛
rejestru, na przykład
SWP r0,r1,[r2]
wpisuje zawartość rejestru r1 do komórki pamieci
˛ o
adresie w rejestrze r2. Do rejestru r0 trafia natomiast
dotychczasowa zawartość komórki pamieci.
˛
Instrukcja ta jest atomowa: odczyt i zapis ma miejsce
podczas pojedynczej operacji na szynie.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze ARM: instrukcje
Instrukcje zamiany
Aktywne czekanie na semaforze można zrealizować
nastepuj
˛ aco
˛
busy
MOV
MOV
SWP
CMP
BEQ
r1,=semafor
r2,#1
r3,r2,[r1]
r3,#1
busy
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze ARM: instrukcje
Przerwania
Instrukcja SWI to przerwanie programowe.
SWI 0x80
Zależnie od środowiska wywołuje ona emulator (np.
KoMoDo) lub jadro
˛
systemu operacyjnego.
Argumenty i wyniki przekazuje sie˛ w rejestrach.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze ARM: instrukcje
Stan procesora
Instrukcja MRS pobiera zawartość rejestru stanu
procesora do zwykłego rejestru.
Instrukcja MSR pozwala załadować do rejestru stanu
procesora wybrany fragment z innego rejestru lub stałej.
Przykład: zamaskowanie przerwań w trybie
uprzywilejowanym
MRS r1,cpsr
BIC r1,r1,#0x80
MSR cpsr_c,r1
W instrukcji MSR przy rejestrze stanu podaje sie˛
modyfikatorem, które grupy pól maja˛ być zmodyfikowane.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze ARM: instrukcje
Stan procesora
W instrukcji MSR przy rejestrze stanu podaje sie˛ w
modyfikatorze, które grupy pól maja˛ być zmodyfikowane:
f: flagi warunków [24:31]
c: sterowanie (maski przerwań, tryb) [0:7]
x: bity rozszerzeń [8:15]
s: status (zarezerwowane) [16:23]
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze ARM: instrukcje
Instrukcje koprocesorów
Instrukcja CDP pozwala wywołać operacje˛ koprocesora
Instrukcje MRC i MCR służa˛ do przesyłania miedzy
˛
rejestrami procesora i koprocesora.
Instrukcje LDC i STC służa˛ do przesyłania bloków pamieci
˛
miedzy
˛
procesorem i koprocesorem.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze ARM: instrukcje
Ładowanie stałych
Ponieważ instrukcje ARM sa˛ 32-bitowe, brak w nich
miejsca na stałe 32-bitowe.
Dozwolone sa˛ tylko niektóre stałe, zwykle sa˛ to
Liczby bez znaku zapisane na 8-bitach
Moga˛ one dodatkowo być obrócone (w lewo lub prawo) o
parzysta˛ liczbe˛ bitów
Czyli pole stałej to 8 znaczacych
˛
bitów plus specyfikacja
obrotu.
Tak wiec
˛ dozwolone sa˛ stałe
5,0xff,0x104,0x0bc00000,0xe0000005
ale nie
0x101,0x102
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze ARM: instrukcje
Ładowanie stałych
Do ładowania innych liczb służa˛ dwie (pseudo)instrukcje,
realizowane „jakoś” istniejacymi
˛
instrukcjami.
Instrukcja LDR może ładować stałe liczbowe
LDR r3,=27321
Do ładowania adresu (etykiety w kodzie) służy instrukcja
ADR r3,koniec
Oczywiście adres to taki sam ciag
˛ bitów jak stała, ale
kontekst użycia umożliwia inne „oszustwa” przy realizacji.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze ARM: instrukcje
Ładowanie stałych
Przykład: kopiowanie napisu
main
ADR r0,to
ADR r1,from
BL strcopy
SWI 0x11
from
to
;hipotetyczny exit
DCB "Pierwszy napis",0
DCB "Drugi napis
",0
ALIGN
strcopy
LDRB r2,[r1],#1
STRB r2,[r0],#1
CMP r2,#0
BNE strcopy
MOV pc,lr ;???
;load byte, then update address
;store byte, then update address
;koniec?
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze ARM: instrukcje
Rozszerzenia w ARMv5
Zliczanie liczby wiodacych
˛
zer
CLZ r1,r2
Arytmetyka z nasyceniem
QADD r1,r2,r3
Nowa „lepka” flaga warunku Q.
Mnożenie ze znakiem dla liczb 16-bitowych, z
wskazywaniem modyfikatorem wybranych połówek
rejestrów
SMULTB r1,r2,r3
Przesłania 64-bitowe LDRD i STRD, operuja˛ na parze
rejestrów, pierwszy musi być parzysty.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze ARM: instrukcje
Zliczanie zer
Zliczanie zer w górnych pozycjach wyglada
˛ dziwnie, ale
przydaje sie˛ do normalizacji zapisu stałopozycyjnego.
Liczbe˛ bez znaku w r0 można znormalizować przez
CLZ r1,r0
MOV r0,r0,LSL r1
Wynik w r1, a w r2 wielkość przesuniecia.
˛
Dla liczb ze znakiem trudniej
EOR r1,r0,r0,LSL #1
CLZ r1,r1
MOV r0,r0,LSL r1
Zbigniew Jurkiewicz, Instytut Informatyki UW
;pozycja ostatniego bitu znaku
Programowanie w asemblerze ARM: instrukcje
Przekazywanie parametrów w kodzie
Rejestr łacz
˛ acy
˛ upraszcza przekazywanie parametrów
bezpośrednio w kodzie
BL
DCD
DCD
DCD
Copy
BufferLength
Buffer1
Buffer2
;długość w bajtach
;adres poczatkowy
˛
;adres poczatkowy
˛
Po wywołaniu rejestr łacz
˛ acy
˛ zawiera adres poczatku
˛
bloku
parametrów. Procedura (po ewentualnym zachowaniu
rejestrów) pobiera parametry równocześnie ustawiajac
˛ rejestr
łacz
˛ acy
˛ na właściwy adres
Copy
LDR
LDR
LDR
R0,[LR],#4
R1,[LR],#4
R2,[LR],#4
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze ARM: instrukcje
Licznik rozkazów
Z uwagi na istnienie potoku instrukcji w momencie
wykonania licznik rozkazów pc (r15) wskazuje (co
najmniej?) dwie instrukcje dalej.
Oznacza to, że wartościa˛ pc jest <adres bieżacej
˛
instrukcji>+8 (a w trybie Thumb +4)!
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze ARM: instrukcje