Programowanie w asemblerze Uwagi o ARM

Programowanie w asemblerze Uwagi o ARM Zbigniew Jurkiewicz, Instytut Informatyki UW 12 grudnia 2015 Zbigniew Jurkiewicz, Instytut Informatyki UW Pr...
Author: Dawid Sowiński
3 downloads 0 Views 256KB Size
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