Programowanie w asemblerze ARM — wprowadzenie
Transkrypt
Programowanie w asemblerze ARM — wprowadzenie
Programowanie w asemblerze ARM — wprowadzenie Zbigniew Jurkiewicz, Instytut Informatyki UW 17 stycznia 2017 Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze ARM — wprowadzenie 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 sie˛ że jest „fabless” (od fabricate): nie produkuje sama ż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 ARM — wprowadzenie 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ń, wiec ˛ zaprojektowano własny procesor 32-bitowy. Podobno był to pierwszy komercyjny RISC. Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze ARM — wprowadzenie Historia Inne firmy zainteresowały sie˛ tym procesorem. Apple potrzebowało procesora do projektu PDA (późniejszego 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 ARM — wprowadzenie ARM Rynek (tanich) procesorów wbudowanych (embedded) 2 mld procesorów w 2005 Telefony komórkowe, modemy, układy hamulcowe w samochodach Cała rodzina procesorów — projektów dopasowanych do różnych potrzeb Ponad 50 wspieranych systemów operacyjnych. ARM core to cz˛esto fragment wiekszego ˛ układu, sprzedawanego przez ostatecznego producenta Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze ARM — wprowadzenie Architektura Obecnie istnieje osiem 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ć wersje˛ ARMv4 lub ARMv5. Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze ARM — wprowadzenie Architektura Procesor w zasadzie 32-bitowy, ale Dwa zestawy instrukcji: ARM (32 bity) i Thumb (16 bitów) Dzieki ˛ temu w razie potrzeby mniejsza zajetość ˛ pamieci ˛ Brak dzielenia, symulowane programowo Brak liczb zmiennopozycyjnych, symulowane programowo Rozszerzenia do przetwarzania sygnałów (DSP — Digital Signal Processing) Wydajna obsługa wyjatków. ˛ Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze ARM — wprowadzenie RISC Architektura RISC (Reduced Instruction Set Computer) Proste instrukcje jednakowej długości, mniej klas instrukcji Jednakowy czas wykonania: jeden cykl = jedna instrukcja Przetwarzanie potokowe, wiele rejestrów Wszystkie rejestry uniwersalne, architektura load-store Złożoność w kompilatorze, a nie w procesorze Bezpośrednia realizacja bez mikroprogramowania Złożone operacje (np. dzielenie) wykonywane programowo Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze ARM — wprowadzenie Architektura ARM Oparta na koncepcji RISC, ale nieco inne priorytety Zmniejszenie zużycia pradu, ˛ bo zwykle zasilanie z baterii Duża gestość ˛ upakowania instrukcji, bo cz˛esto ograniczona pamieć ˛ Zmniejszenie rozmiaru obszaru układu zajetego ˛ przez procesor, w układach single-chip daje wiecej ˛ miejsca na inne elementy Ograniczenia na koszt Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze ARM — wprowadzenie Architektura ARM Różnice wzgledem ˛ „czystego” RISC Zmienny czas wykonania dla niektórych instrukcji, np. load-store-multiple ładujaca ˛ ciag ˛ komórek pamieci ˛ do kolejnych rejestrów Układ przesuwania dla jednego z rejestrów wejściowych — wydłuża czas wykonania instrukcji Alternatywny 16-bitowy zestaw instrukcji Thumb Instrukcje wykonywane warunkowo Rozszerzone instrukcje do DSP (np. 16x16 bitów mnożenie i saturacja) Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze ARM — wprowadzenie Architektura ARM Szyny z protokołem AMBA (Advanced Microcontroller Bus Architecture) Wszystkie urzadzenia ˛ odwzorowane na pamieć ˛ (memory-mapped) dostep ˛ do rejestrów urzadzenia ˛ jak do komórek pamieci ˛ zbedne ˛ dodatkowe instrukcje Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze ARM — wprowadzenie ISA Rejestry 32-bitowe Instrukcje obliczeniowe: 2 rejestry źródłowe + rejestr wynikowy 7 trybów pracy, normalny to user. Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze ARM — wprowadzenie Rejestry Dla trybów user i system 16 aktywnych rejestrów uniwersalnych r0-r15 oraz rejestr stanu procesora cpsr. Niektóre rejestry maja˛ specjalne przeznaczenie i dodatkowe nazwy r13 (sp) — stack pointer: wskaźnik wierzchołka stosu r14 (lr) — link register: do przechowania adresu powrotnego przy wywołaniu procedury r15 (pc) — program counter: licznik instrukcji Istnieja˛ instrukcje, które w sposób specjalny traktuja˛ r14 i r15. Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze ARM — wprowadzenie Rejestr stanu procesora Dwa rejestry stanu procesora cpsr — current program status register: bieżacy ˛ rejestr stanu spsr — saved program status register: zapamietany ˛ rejestr stanu, dostepny ˛ tylko w trybach uprzywilejowanych. Pola: 4 flagi dla wyniku operacji: N, Z, C, V Dodatkowe flagi w niektórych modelach J (Jazelle) do wykonywania 8-bitowych instrukcji Javy Q dla saturacji przy rozszerzeniach DSP Tryb pracy procesora Dwie maski do przerwań I i F (zwykłe i szybkie przerwania) T : wybór zestawu Thumb Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze ARM — wprowadzenie Tryby pracy procesora user (usr): nieuprzywilejowany system (sys): jak user, ale można dowolnie zmieniać rejestr stanu abort (abt): po błednym ˛ odwołaniu do pamieci ˛ undefined (und): po napotkaniu niezdefiniowanej lub niezaimplementowanej instrukcji fast interrupt request (fiq) i interrupt request (irq): dla dwóch poziomów przerwań supervisor (svc): poczatkowy ˛ stan, używany także dla jadra ˛ systemu operacyjnego i po reset. Dodatkowe prywatne banki rejestrów dla trybów uprzywilejowanych, zastepuj ˛ a˛ rejestry r13, r14, a dla szybkich przerwań także r8-r12. Dodaja˛ rejestr spsr. Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze ARM — wprowadzenie Instrukcje Zaczniemy od najprostszej instrukcji. MOV r0,r1 MOV r4,#10 Wpisuje ona do rejestru zawartość innego rejestru lub stała. ˛ Sufiks S powoduje ustawianie flag, nawet w instrukcji MOV MOVS r0,r1 Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze ARM — wprowadzenie Instrukcje Drugi (lub jedyny) argument instrukcji może być dodatkowo obrócony lub przesuniety, ˛ np. instrukcja MOV r0,r1,LSL #2 odpowiada instrukcji przesuniecia ˛ zawartości r1 w lewo o 2 bity z zapisaniem wyniku w r0. Inny przykład z wyliczonym przesunieciem: ˛ MOV r0,r1,ASR r3 Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze ARM — wprowadzenie Skok wyliczany Jeśli rejestrem wynikowym instrukcji (nie tylko MOV!) jest pc, to działa ona jak skok pod wyliczony adres, na przykład MOV pc,r1 Jeśli r1 zawiera adres tablicy skoków, to żeby wybrać jeden z nich ADD pc,r1,r2 LSL #2 W takiej sytuacji flagi wolno ustawiać tylko w trybach uprzywilejowanych. Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze ARM — wprowadzenie Wykonanie warunkowe Wiekszość ˛ instrukcji może mieć sufiks ograniczajacy ˛ (flagami stanu), kiedy bed ˛ a˛ one wykonane, np. instrukcja MOVEQS r0,r1,ASR r3 bedzie ˛ wykonana tylko wtedy, gdy flaga zera jest ustawiona (a sama przestawi flagi). Niektóre dostepne ˛ sufiksy: AL (always, domyślny), EQ, NE, GT, LE, LT, GE, MI, PL. Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze ARM — wprowadzenie Wykonanie warunkowe Przykład: obliczanie GCD dwóch liczb całkowitych define function gcd (a :: <integer>, b :: <integer>) => (r :: <integer>) while (a ~= b) if (a > b) a := a - b; else b := b - a; end if; end while; a end function; Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze ARM — wprowadzenie Wykonanie warunkowe W asemblerze zakładamy, że argumenty sa˛ w rejestrach r0 i r1, a wynik ma być w r0. bez wykonania warunkowego gcd CMP r0,r1 BEQ koniec BLT mniejsze SUB r0,r0,r1 B gcd mniejsze SUB r1,r1,r0 B gcd koniec BX lr ;??? Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze ARM — wprowadzenie Wykonanie warunkowe z wykonaniem warunkowym gcd CMP r0,r1 SUBGT r0,r0,r1 SUBLT r1,r1,r0 BNE gcd BX lr ;??? Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze ARM — wprowadzenie Instrukcje arytmetyczne Dodawanie i odejmowanie liczb całkowitych ze znakiem i bez znaku, pierwszy argument musi być rejestrem. ADD r0,r1,r1,LSL #1 ;mnożenie przez 3 Instrukcje odwróconego odejmowania RSB r0,r1,#0 ;negacja RSC r4,r1,r2,LSL #1 Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze ARM — wprowadzenie Instrukcje logiczne Typowe operacje: AND, ORR (inclusive-or), EOR (exclusive-or) BIC (BIt Clear): czyści w pierwszym argumencie bity wskazane drugim argumentem BIC r0,r1,#3 Negacja jako MVN: neguje bitowo argument i zapisuje do wyniku. Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze ARM — wprowadzenie Instrukcje porównania Typowe operacje: porównanie arytmetyczne CMP i logiczne TST, wynik tylko we flagach rejestru stanu procesora TEQ (test na równość): używa XOR TEQ r1,#3 Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze ARM — wprowadzenie Mnożenie MUL: zwyczajne mnożenie. MLA: mnożenie z akumulacja˛ wyniku, 3 argumenty. Mnożymy dwa pierwsze argumenty i otrzymany iloczyn dodajemy do trzeciego argumentu. „Długie” instrukcje mnożenia: SMLAL, SMULL, UMLAL, UMULL. Cztery argumenty, pierwsze dwa po sklejeniu sa˛ 64-bitowym miejscem na wynik. Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze ARM — wprowadzenie Przykład AREA |.text|,CODE,READONLY EXPORT square ;int square (int i) square MUL r1,r0,r0 MOV r0,r1 MOV pc,lr END ;return Konwencja: wynik w r0, argumenty w r0, r1, ... Do powrotu z procedury zamiast MOV można użyć BX lr Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze ARM — wprowadzenie Sterowanie Rejestr r15 ma też druga˛ nazwe: ˛ pc. Zwykle używa sie˛ tej drugiej nazwy, napotkanie w naturze r15 jest mało prawdopodobne. Jest to bowiem licznik instrukcji (znany w gwarze x86 jako ip — instruction pointer). Normalnie (gdy nie ma skoku ani wywołania funkcji) rejestr ten zwiekszany ˛ jest o 4 po wykonaniu każdej instrukcji. Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze ARM — wprowadzenie Skok bezwarunkowy (i bezsensowny) .text .global main main: mov r0, #2 b end mov r0, #3 end: bx lr Zbigniew Jurkiewicz, Instytut Informatyki UW Programowanie w asemblerze ARM — wprowadzenie