Programowanie w asemblerze Uwagi o ARM Zbigniew Jurkiewicz, Instytut Informatyki UW
12 grudnia 2015
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Uwagi o ARM
Historia
Firma ARM Ltd. powstała w 1990 roku jako Advanced RISC Machines Ltd., joint venture firm Acorn Computers, Apple Computer i VLSI Technology. Majatkiem ˛ firmy jest własno´sc´ intelektualna, mówi sie˛ z˙ e jest „fabless” (od fabricate): nie produkuje sama z˙ adnych układów. Firma zajmuje sie˛ projektowaniem procesorów rodziny ARM. Projekty licencjonuje firmom partnerskim, które produkuja˛ układy i sprzedaja˛ je. Dzieki ˛ temu firma kontroluje architekture˛ ARM.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Uwagi o ARM
Historia
Procesor ARM powstał w 1983 roku w angielskiej firmie Acorn, na potrzeby komputera o tej samej nazwie. Poniewa˙z z˙ aden z istniejacych ˛ procesorów 16-bitowych ´ wiec nie spełniał postawionych wymagan, ˛ zaprojektowano własny procesor 32-bitowy. Podobno był to pierwszy komercyjny RISC.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Uwagi o ARM
Historia
Inne firmy zainteresowały sie˛ tym procesorem. Apple potrzebowało procesora do projektu PDA (pó´zniejszego Newton MessagePad). Spowodowało to odłaczenie ˛ sie˛ grupy procesorowej od firmy Acorn i utworzenie firmy Advanced RISC Machines Ltd.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Uwagi o ARM
Architektura
Obecnie istnieje siedem podstawowych wersji architektury. Ka˙zda wersja jest oparta na poprzedniej. Numery wersji architektury to nie to samo co numery modeli, np. modele układu ARM9 moga˛ realizowa´c wersje˛ ARMv4 lub ARMv5.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Uwagi o ARM
Architektura wersja 5
v5T: nadzbiór ARMv4T. Nowe instrukcje: BLX, CLZ i BKPT. v5TE Nowe instrukcje do cyfrowego przetwarzania sygnałów. Nowe instrukcje mno˙zenia dla DSP: SMULxy, SMLAxy, SMULWy, SMLAWy i SMLALxy. Arytmetyka z nasyceniem: flaga Q, instrukcje QADD, QSUB, QDADD i QDSUB. Pre-load hinty dla ładowania z pamieci. ˛
v5TEJ: przy´spieszenie sprz˛etowe dla jezyka ˛ Java.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Uwagi o ARM
Architektura wersja 6
v6 Obsługa danych „mixed endian”: SETEND, REV, REV16, REVSH. Ponad 60 nowych instrukcji SIMD, np. SMUSD, SMUADX, USAD8, USADA8. Ładowanie danych niewyrównanych. Nowe instrukcje synchronizacji: LDREX, STREX.
v6T2: Thumb-2: rozszerzona, kompletna wersja Thumb. Od tej architektury cechy „TEJ” sa˛ z definicji.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Uwagi o ARM
ARMv6 Instrukcje PKHBT i PKHTB do pakowania 16-bitowych liczb w jeden rejestr wynikowy (z dwóch rejestrów z´ ródłowych). Mini-operacje wektorowe: dodawanie/odejmowanie par liczb 16-bitowych i czwórek liczb 8-bitowych, np. SADD16, USUB8. Te same operacje z odpowiednim nasyceniem, np. QADD8. Nasycanie do podanej liczby bitów SSAT r3,#8,r2 USAT r3,#12,r2,LSL #3
Instrukcje zamiany kolejno´sci bajtów dla całego rejestru i dla dwóch połówek 16-bitowych: REV i REV16. Wybór „endianness” dla przesyłania danych SETEND BE SETEND LE Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Uwagi o ARM
ARMv6
Nowe bity w rejestrze stanu: GE[3:0]: Dla SIMD, flaga wiekszy-lub-równy ˛ dla ka˙zdego 8/16-bitowego wycinka. E: Aktualny ustawienie „endianness”, mo˙zna zmienia´c przez SETEND. A: maskowanie imprecise data abort exceptions
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Uwagi o ARM
Tasowanie
Trzy nowe instrukcje (wszystkie z wykonaniem warunkowym): REV r1,r2 Odwraca kolejno´sc´ bajtów. REV16 r1,r2 Odwraca kolejno´sc´ bajtów w pierwszej i drugiej parze. REVSH r1,r2 Zamienia miejscami dwa dolne bajty, po czym rozszerza bit znaku.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Uwagi o ARM
Synchronizacja
Dwie nowe instrukcje: LDREXww r1,[r2] Ładuje z pamieci ˛ do rejestru, po czym ustawia monitor „obserwujacy” ˛ ten adres. STREXww r0,r1,[r2] Zapisuje r1 do pamieci ˛ i zwraca w r0 sukces, je´sli w miedzyczasie ˛ nie było innych zapisów ani odczytów.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Uwagi o ARM
Architektura wersja 7
Nazwana „Cortex core” (wszystkie poprzednie to „ARM core”). v7A, v7R Dynamic Compiler Support. Execution Environment (Thumb-2EE). VFP v3 (Vector Floating Point). NEON advanced SIMD. Thumb-2 obowiazkowo. ˛
v7M Minimalna wersja dla zastosowan´ wbudowanych. Tylko instrukcje Thumb-2.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Uwagi o ARM
Architektura wersja 7
Obsługiwana tylko przez najnowsze narz˛edzia, np. CodeSourcery’s GCC ARM toolchain. Technologia NEON to 64/128-bitowa hybrydowa architektura SIMD do przy´spieszenia aplikacji multimedialnych i DSP. Daje dla nich co najmniej 3-krotne przy´spieszenie wzgledem ˛ ARMv5 i dwukrotne wzgledem ˛ ARMv6.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Uwagi o ARM
Zestawy instrukcji
Bazowy 32-bitowy zbiór instrukcji ARM Ograniczony 16-bitowy zbiór Thumb (mała zajeto´ ˛ sc´ pamieci) ˛ Nowy mieszany 16/32-bitowy zestaw Thumb-2 Jazelle DBX do bajtkodów Javy Zestaw NEON do 64/128-bitowego SIMD Zestaw VFP do wektorowego przetwarzania liczb zmiennopozycyjnych.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Uwagi o ARM
NEON
32 rejestry 64-bitowe: d0–d15 Mo˙zna je łaczy´ ˛ c w pary, otrzymujac ˛ 16 rejestrów 128-bitowych q0–q15.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Uwagi o ARM
NEON: instrukcje
ładowanie kilku rejestrów z pamieci ˛ vld1.8 d0.d1.d2,[r0]
z przeplotem vld3.8 d0.d1.d2,[r0]
zapis analogicznie (vst).
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Uwagi o ARM
Narz˛edzia
ARM Software Development Toolkit (SDT) — lekko przestarzały ARM Developer Suite (ADS) — te˙z RealView Compiler Tools (RVCT) RealView Development Suite (RVDS) Inne firmy: Keil (obecnie w ARM), Green Hills i Metrowerks.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Uwagi o ARM
Narz˛edzia
Kompilator C z ARM Developer Suite version 1.1 (ADS1.1) to armcc: armcc -c -o test.o test.c fromelf -text/c test.o > test.txt
Jest te˙z asembler aasm. arm-elf-gcc to kompilator GNU: arm-elf-gcc -fomit-frame-pointer -c -o test.o test.c arm-elf-objdump -d test.o > test.txt
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Uwagi o ARM
Uwagi ogólne
C char jest unsigned, bo takie ładowanie z pamieci ˛ Unika´c typów char i short dla liczników petli, ˛ bo trzeba w kodzie recznie ˛ bada´c zakresy (rejestry tylko 32-bitowe, wiec ˛ brak sygnalizacji przepełnienia/przeniesienia)
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Uwagi o ARM
Dzielenie
Poniewa˙z dzielenie jest symulowane programowo, nale˙zy go unika´c. Instrukcja C current = (current + increment) % size;
zajmuje 50 cykli. Natomiast poni˙zszy kod current += increment; if (current >= size) current -= size;
zajmuje podobno tylko 3 cykle (dla armcc).
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Uwagi o ARM
Liczby rzeczywiste
Standardowo brak sprz˛etowych liczb zmiennopozycyjnych, symulowane programowo W ARM7500FE jest Floating Point Accelerator (FPA). Jest te˙z Vector Floating Point (VFP) akcelerator.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Uwagi o ARM
Asemblacja
Asembler ARM to firmowo armasm. U˙zycie armcc -c main.c armasm proc.s armlink -o main.axf main.o square.o
ARM ostatnio wprowadził nowa˛ wersje˛ składni, ˛ tzw. UAL (Unified Assembler Language), obejmujac ˛ a˛ zarówno ARM jak i Thumb i zdejmujac ˛ a˛ pewne ograniczenia na kolejno´sc´ modyfikatorów instrukcji.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Uwagi o ARM
Składnia
Dyrektywy ALIGN u˙zywa sie, ˛ z˙ eby wyrówna´c do granic 4 bajtów, np. po napisie (ciagu ˛ znaków) DEFB słu˙zy do definiowania ciagów ˛ bajtów (tak˙ze stringi) DEFW słu˙zy do definiowania słów (4 bajty).
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Uwagi o ARM
C API Konwencje u˙zycia rejestrów: r0–r3 (a1–a4): argumenty/warto´sci funkcji, kolejne argumenty na stosie, nie trzeba zachowywa´c r4–r8 (v1–v5): rejestry dla zmiennych, trzeba je zachowywa´c i odtwarza´c r9 (v6, sb): rejestr dla zmiennych, w position independent kodzie adres bazy statycznej, adres bazy stosu (przy kontroli), trzeba zachowywa´c r10 (v7, sl): rejestr dla zmiennych, adres ograniczenia stosu (przy kontroli), trzeba zachowywa´c r11 (v8, fp): rejestr dla zmiennych, dawniej frame pointer, trzeba zachowywa´c r12 (ip): scratch register, nie trzeba zachowywa´c Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Uwagi o ARM
C API
Argumenty 64-bitowe (long long, double) przekazywane w parach rejestrów. Zwracane w .
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Uwagi o ARM
Przykład
;; Hello World Version 2 B main hello DEFB goodbye DEFB ALIGN main
"Hello World\n\0" "Goodbye Universe!\n\0"
ADR R0,hello SWI ADR SWI SWI
3 R0,goodbye 3 2
;get the start address of ;the "Hello World" string ;print the message ;point at the goodbye string ;print the message ;stop the program
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Uwagi o ARM
Inny przykład ;; Increment R0 until it reaches same value as in R1 ;; Then print a success message B fred
;nothing special about "main"!
four DEFW 4 success DEFB "Register 0 has reached the value of \0" ALIGN fred LDR R1,four MOV R0,#1 next CMP R0,R1 BNE skip ADR R0,success SWI 3 MOV R0,R1 SWI 4 MOV R0,#10 SWI 0 SWI 2 skip ADD R0,R0,#1 B next
;LDR loads R1 with *contents* of location four ;put the value 1 (decimal) into R1 ;does R0 now have same number in it as R1 does? ;get start address of success message ;print the message ;move value from R1 into R0 for printing ;print the decimal value that is now in R0
;stop the program
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Uwagi o ARM
Przekazywanie parametrów w kodzie Rejestr łacz ˛ acy ˛ upraszcza przekazywanie parametrów bezpo´srednio w kodzie BL DCD DCD DCD
Copy BufferLength Buffer1 Buffer2
;długo´ s´ c 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´snie ustawiajac ˛ rejestr łacz ˛ acy ˛ na wła´sciwy adres Copy
LDR LDR LDR
R0,[LR],#4 R1,[LR],#4 R2,[LR],#4
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Uwagi o ARM
Parametry na stosie (1)
AREA |.text|,CODE,READONLY EXPORT sumof ; int sumof(int N, ...) RN 0 ;pierwszy parametr RN 1 ;suma (zainicjowana)
n sum sumof
SUBS n,n,#1 MOVLT sum,#0 SUBS n,n,#1 ADDGE sum,sum,r2 SUBS n,n,#1 ADDGE sum,sum,r3 MOV r2,sp
;gdy 0 elementów ;gdy jest drugi element ;gdy jest trzeci element ;do chodzenia po stosie
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Uwagi o ARM
Parametry na stosie (2)
loop SUBS n,n,#1 LDMGEFD r2!,{r3} ADDGE sum,sum,r3 BGE loop MOV r0,sum MOV pc,lr END
;gdy jest kolejny element
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Uwagi o ARM
Wykonanie warunkowe Nastepuj ˛ acy ˛ kod w C
if (c == ’a’) || c = ’e’ || c = ’i’ || c == ’o’) licznik++;
mo˙ze by´c zapisany bez instrukcji skoku
TEQ r1,#’a’ TEQNE r1,#’e’ TEQNE r1,#’i’ TEQNE r1,#’o’ ADDEQ r2,r2,#1
;r1=c
;r2=licznik
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Uwagi o ARM
Wykonanie warunkowe Zliczania liter w kodzie ASCII
if ((c >= ’A’ && c = ’a’ && c