Programowanie w asemblerze Uwagi o ARM



Podobne dokumenty
Programowanie w asemblerze Uwagi o ARM

Programowanie w asemblerze ARM wprowadzenie

Programowanie mikroprocesorów jednoukładowych

Programowanie w asemblerze ARM: instrukcje

Wykład 2. Mikrokontrolery z rdzeniami ARM

PROCESORY ARM TRUDNO ZNALEŹĆ PROCESORY O TAK LICZNYCH, ORYGINALNYCH, NOWYCH, POMYSŁOWYCH ROZWIĄZANIACH!

Przedmiot : Programowanie w języku wewnętrznym. Ćwiczenie nr 4

Wykład 4. Środowisko programistyczne

Kompilator języka C na procesor 8051 RC51 implementacja

Zadanie Zaobserwuj zachowanie procesora i stosu podczas wykonywania następujących programów

Architektura komputerów. Asembler procesorów rodziny x86

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 4 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 44

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 5 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 41

Rejestry procesora. Nazwa ilość bitów. AX 16 (accumulator) rejestr akumulatora. BX 16 (base) rejestr bazowy. CX 16 (count) rejestr licznika

Podstawy programowania. Wykład Co jeszcze... Przypomnienia, uzupełnienia. Krzysztof Banaś Podstawy programowania 1

Podstawy programowania skrót z wykładów:

Programowanie w asemblerze Środowiska 64-bitowe

Microsoft IT Academy kurs programowania

MMX i SSE. Zbigniew Koza. Wydział Fizyki i Astronomii Uniwersytet Wrocławski. Wrocław, 10 marca Zbigniew Koza (WFiA UWr) MMX i SSE 1 / 16

Architektura systemów komputerowych Laboratorium 14 Symulator SMS32 Implementacja algorytmów

Lista Rozkazów: Język komputera

Architektura komputerów

Wstęp. do języka C na procesor (kompilator RC51)

Mikrokontroler ATmega32. Język symboliczny

Instrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory

Struktura i działanie jednostki centralnej

CPU ROM, RAM. Rejestry procesora. We/Wy. Cezary Bolek Uniwersytet Łódzki Wydział Zarządzania Katedra Informatyki

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

Architektura Systemów Komputerowych, Wydział Informatyki, ZUT

1 Podstawy c++ w pigułce.

Środowisko Keil. Spis treści. Krzysztof Świentek. Systemy wbudowane. 1 Trochę teorii. 2 Keil

Programowanie Niskopoziomowe

Wstęp do programowania

Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227 WYKŁAD 7 WSTĘP DO INFORMATYKI

Procesory firmy ARM i MIPS

Ćwiczenie nr 6. Programowanie mieszane

4 Literatura. c Dr inż. Ignacy Pardyka (Inf.UJK) ASK MP.01 Rok akad. 2011/ / 24

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40

Lista instrukcji procesora 8051 część 2 Skoki i wywołania podprogramów, operacje na stosie, operacje bitowe

Politechnika Świętokrzyska

Architektura komputerów, Informatyka, sem.iii. Rozwiązywanie konfliktów danych i sterowania w architekturze potokowej

1 Podstawy c++ w pigułce.

List s a R ozkazó z w: w Ję J z ę y z k y k k o k mp o u mp t u er e a a ( cd c. d )

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Architektura typu Single-Cycle

A Machine Architecture that is Really Intuitive and Easy. Dane: notacja dwójkowa, zapis w kodzie dopełnieniowym

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1

Sprzęt komputera - zespół układów wykonujących programy wprowadzone do pamięci komputera (ang. hardware) Oprogramowanie komputera - zespół programów

Techniki multimedialne

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

Programowanie w elektronice: Podstawy C

Kurs Zaawansowany S7. Spis treści. Dzień 1

Języki i metodyka programowania. Wprowadzenie do języka C

Spis treœci. Co to jest mikrokontroler? Kody i liczby stosowane w systemach komputerowych. Podstawowe elementy logiczne

Programowanie w asemblerze Linkowanie

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Wstęp do programowania

utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy,

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

Struktury, unie, formatowanie, wskaźniki

Programowanie hybrydowe łączenie C/C++ z asemblerem

Visual Basic for Application (VBA)

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

W większości języków programowania(nie we wszystkich) wymaga się, żeby użyte w programie zmienne były wcześniej zadeklarowane:

Ćwiczenie nr 3. Wyświetlanie i wczytywanie danych

2 Przygotował: mgr inż. Maciej Lasota

Wykład 2. Mikrokontrolery z rdzeniami ARM

end start ; ustawienie punktu startu programu i koniec instrukcji w assemblerze.

Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.

Podstawy Programowania C++

Typy danych. Przemysław Gawroński D-10, p lutego Wykład 1. (Wykład 1) Typy danych 25 lutego / 11

Metody Realizacji Języków Programowania

PRZEWODNIK PO PRZEDMIOCIE

Laboratorium Programowania Kart Elektronicznych

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

PARADYGMATY PROGRAMOWANIA Wykład 4

Zmienne, stałe i operatory

Sprzęt i architektura komputerów

Deklaracje. W większości języków programowania(nie we wszystkich) wymaga się, żeby użyte w programie zmienne były wcześniej zadeklarowane:

Język ludzki kod maszynowy

MATERIAŁY DO ZAJĘĆ II

2.1. W architekturze MIPS, na liście instrukcji widzimy dwie instrukcje dotyczące funkcji: .text main: la $a0, string1 # drukuj pierwszy łańcuch

Architektura systemów komputerowych Laboratorium 13 Symulator SMS32 Operacje na bitach

Informatyka. Wy-03 Dynamiczna alokacja pamięci, wyjątki. mgr inż. Krzysztof Kołodziejczyk

Programowanie. programowania. Klasa 3 Lekcja 9 PASCAL & C++

Programowanie w asemblerze Środowiska 64-bitowe

Programowanie I. O czym będziemy mówili. Plan wykładu nieco dokładniej. Plan wykładu z lotu ptaka. Podstawy programowania w językach. Uwaga!

Architektura potokowa RISC

Liczniki, rejestry lab. 09 Mikrokontrolery 8051 cz. 1

Tworzenie aplikacji rozproszonej w Sun RPC

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

Jak napisać program obliczający pola powierzchni różnych figur płaskich?

PRZEWODNIK PO PRZEDMIOCIE

Programowanie obiektowe zastosowanie języka Java SE

Tworzenie aplikacji w języku Java

Programowanie niskopoziomowe

JAVA. Platforma JSE: Środowiska programistyczne dla języka Java. Wstęp do programowania w języku obiektowym. Opracował: Andrzej Nowak

ARCHITEKTURA SYSTEMÓW KOMPUTEROWYCH

Czym jest Java? Rozumiana jako środowisko do uruchamiania programów Platforma software owa

Transkrypt:

Programowanie w asemblerze Uwagi o ARM 12 grudnia 2015

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ść intelektualna, mówi się że jest fabless (od fabricate): nie produkuje sama żadnych układów. Firma zajmuje się projektowaniem procesorów rodziny ARM. Projekty licencjonuje firmom partnerskim, które produkuja układy i sprzedaja je. Dzięki temu firma kontroluje architekturę ARM.

Historia Procesor ARM powstał w 1983 roku w angielskiej firmie Acorn, na potrzeby komputera o tej samej nazwie. Ponieważ żaden z istniejacych procesorów 16-bitowych nie spełniał postawionych wymagań, więc zaprojektowano własny procesor 32-bitowy. Podobno był to pierwszy komercyjny RISC.

Historia Inne firmy zainteresowały się tym procesorem. Apple potrzebowało procesora do projektu PDA (późniejszego Newton MessagePad). Spowodowało to odłaczenie się grupy procesorowej od firmy Acorn i utworzenie firmy Advanced RISC Machines Ltd.

Architektura Obecnie istnieje siedem podstawowych wersji architektury. Każda wersja jest oparta na poprzedniej. Numery wersji architektury to nie to samo co numery modeli, np. modele układu ARM9 moga realizować wersję ARMv4 lub ARMv5.

Architektura wersja 5 v5t: nadzbiór ARMv4T. Nowe instrukcje: BLX, CLZ i BKPT. v5te Nowe instrukcje do cyfrowego przetwarzania sygnałów. Nowe instrukcje mnożenia 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 pamięci. v5tej: przyśpieszenie sprzętowe dla języka Java.

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.

ARMv6 Instrukcje PKHBT i PKHTB do pakowania 16-bitowych liczb w jeden rejestr wynikowy (z dwóch rejestrów ź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ści 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

ARMv6 Nowe bity w rejestrze stanu: GE[3:0]: Dla SIMD, flaga większy-lub-równy dla każdego 8/16-bitowego wycinka. E: Aktualny ustawienie endianness, można zmieniać przez SETEND. A: maskowanie imprecise data abort exceptions

Tasowanie Trzy nowe instrukcje (wszystkie z wykonaniem warunkowym): REV r1,r2 Odwraca kolejność bajtów. REV16 r1,r2 Odwraca kolejność bajtów w pierwszej i drugiej parze. REVSH r1,r2 Zamienia miejscami dwa dolne bajty, po czym rozszerza bit znaku.

Synchronizacja Dwie nowe instrukcje: LDREXww r1,[r2] Ładuje z pamięci do rejestru, po czym ustawia monitor obserwujacy ten adres. STREXww r0,r1,[r2] Zapisuje r1 do pamięci i zwraca w r0 sukces, jeśli w międzyczasie nie było innych zapisów ani odczytów.

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 zastosowań wbudowanych. Tylko instrukcje Thumb-2.

Architektura wersja 7 Obsługiwana tylko przez najnowsze narzędzia, np. CodeSourcery s GCC ARM toolchain. Technologia NEON to 64/128-bitowa hybrydowa architektura SIMD do przyśpieszenia aplikacji multimedialnych i DSP. Daje dla nich co najmniej 3-krotne przyśpieszenie względem ARMv5 i dwukrotne względem ARMv6.

Zestawy instrukcji Bazowy 32-bitowy zbiór instrukcji ARM Ograniczony 16-bitowy zbiór Thumb (mała zajętość pamięci) 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.

NEON 32 rejestry 64-bitowe: d0 d15 Można je łaczyć w pary, otrzymujac 16 rejestrów 128-bitowych q0 q15.

NEON: instrukcje ładowanie kilku rejestrów z pamięci vld1.8 d0.d1.d2,[r0] z przeplotem vld3.8 d0.d1.d2,[r0] zapis analogicznie (vst).

Narzędzia ARM Software Development Toolkit (SDT) lekko przestarzały ARM Developer Suite (ADS) też RealView Compiler Tools (RVCT) RealView Development Suite (RVDS) Inne firmy: Keil (obecnie w ARM), Green Hills i Metrowerks.

Narzędzia 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ż 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

Uwagi ogólne C char jest unsigned, bo takie ładowanie z pamięci Unikać typów char i short dla liczników pętli, bo trzeba w kodzie ręcznie badać zakresy (rejestry tylko 32-bitowe, więc brak sygnalizacji przepełnienia/przeniesienia)

Dzielenie Ponieważ dzielenie jest symulowane programowo, należy go unikać. Instrukcja C current = (current + increment) % size; zajmuje 50 cykli. Natomiast poniższy kod current += increment; if (current >= size) current -= size; zajmuje podobno tylko 3 cykle (dla armcc).

Liczby rzeczywiste Standardowo brak sprzętowych liczb zmiennopozycyjnych, symulowane programowo W ARM7500FE jest Floating Point Accelerator (FPA). Jest też Vector Floating Point (VFP) akcelerator.

Asemblacja Asembler ARM to firmowo armasm. Użycie armcc -c main.c armasm proc.s armlink -o main.axf main.o square.o ARM ostatnio wprowadził nowa wersję składni, tzw. UAL (Unified Assembler Language), obejmujac a zarówno ARM jak i Thumb i zdejmujac a pewne ograniczenia na kolejność modyfikatorów instrukcji.

Składnia Dyrektywy ALIGN używa się, żeby wyrównać do granic 4 bajtów, np. po napisie (ciagu znaków) DEFB służy do definiowania ciagów bajtów (także stringi) DEFW służy do definiowania słów (4 bajty).

C API Konwencje użycia rejestrów: r0 r3 (a1 a4): argumenty/wartości funkcji, kolejne argumenty na stosie, nie trzeba zachowywać r4 r8 (v1 v5): rejestry dla zmiennych, trzeba je zachowywać i odtwarzać r9 (v6, sb): rejestr dla zmiennych, w position independent kodzie adres bazy statycznej, adres bazy stosu (przy kontroli), trzeba zachowywać r10 (v7, sl): rejestr dla zmiennych, adres ograniczenia stosu (przy kontroli), trzeba zachowywać r11 (v8, fp): rejestr dla zmiennych, dawniej frame pointer, trzeba zachowywać r12 (ip): scratch register, nie trzeba zachowywać

C API Argumenty 64-bitowe (long long, double) przekazywane w parach rejestrów. Zwracane w <r0,r1>.

Przykład ;; Hello World Version 2 B main hello DEFB "Hello World\n\0" goodbye DEFB "Goodbye Universe!\n\0" ALIGN main ADR R0,hello ;get the start address of ;the "Hello World" string SWI 3 ;print the message ADR R0,goodbye ;point at the goodbye string SWI 3 ;print the message SWI 2 ;stop the program

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

Przekazywanie parametrów w kodzie Rejestr łacz acy upraszcza przekazywanie parametrów bezpośrednio w kodzie BL Copy DCD BufferLength ;długość w bajtach DCD Buffer1 ;adres początkowy DCD Buffer2 ;adres początkowy 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 R0,[LR],#4 LDR R1,[LR],#4 LDR R2,[LR],#4

Parametry na stosie (1) AREA.text,CODE,READONLY EXPORT sumof ; int sumof(int N,...) n RN 0 ;pierwszy parametr sum RN 1 ;suma (zainicjowana) 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

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

Wykonanie warunkowe Następujacy kod w C if (c == a ) c = e c = i c == o ) licznik++; może być zapisany bez instrukcji skoku TEQ r1,# a TEQNE r1,# e TEQNE r1,# i TEQNE r1,# o ADDEQ r2,r2,#1 ;r1=c ;r2=licznik

Wykonanie warunkowe Zliczania liter w kodzie ASCII if ((c >= A && c <= Z ) (c >= a && c <= z ) licznik++; można dokonać następujaco (używajac porównań dla liczb bez znaku) SUB r3,r1,# A CMP r3,# Z - A SUBHI r3,r1,# a CMPHI r3,# z - a ADDLS r2,r2,#1

Pakowanie małych liczb Małe liczby całkowite można często pakować parami do rejestrów, na przykład kod w C short index,increment;... next = table[index]; index += increment; można zapisać następujaco LDRB r2,[r4,r3,lsr #16] ;r2 = next ADD r3,r3,r3,lsl #16 ;r3 = index increment gdzie to rejestr bazowy r4 zawiera adres tablicy table, zaś indeks bieżacy i krok sa upakowane w r3.

Pola bitowe Do wydobycia pola bitowego można oczywiście użyć maski wraz z instrukcja AND Ale można też inaczej, np. dla bitów 4 8 z r1 MOV r2,r1,lsl #24 MOV r2,r2,lsr #28 Jeśli liczba ma być ze znakiem, to w drugiej instrukcji należy użyć ASR.