Assemblerprogrammering för ARM del 1

Relevanta dokument
Assemblerprogrammering för ARM del 1

Assemblerprogrammering för ARM del 1

Assemblerprogrammering, ARM-Cortex M4 del 1

Assemblerprogrammering för ARM del 2

Assemblerprogrammering för ARM del 3

Assemblerprogrammering, ARM-Cortex M4 del 3

Assemblerprogrammering - fördjupning

Introduktion till ARM Cortex-M4

Arbetsbok för MD407. Göteborg i oktober 2017, Roger Johansson

Tentamen (Exempel) Datorteknik Y, TSEA28

Tentamen (Exempel) Datorteknik Y, TSEA28

Övning1 Datorteknik, HH vt12 - Talsystem, logik, minne, instruktioner, assembler

Tentamen. Datorteknik Y, TSEA28

Maskinorienterad programmering

Assemblerprogrammering del 2

Tentamen med lösningsförslag

Programmering av inbyggda system 2014/2015

Tentamen (Exempel) Datorteknik Y, TSEA28

Tentamen (Exempel) Datorteknik Y, TSEA28

Tentamen. Datorteknik Y, TSEA28

Programmering av inbyggda system. Kodningskonventioner. Viktor Kämpe

Programmering av inbyggda system 2012/2013. Kodningskonventioner och programbibliotek. maskinnära programmering i C och assemblerspråk

Tentamen. Datorteknik Y, TSEA28

Tentamen. Datorteknik Y, TSEA28

Digital- och datorteknik

Datorteknik. Tomas Nordström. Föreläsning 3. För utveckling av verksamhet, produkter och livskvalitet.

TSEA28 Datorteknik Y (och U)

LEU500-Maskinorienterad programmering LP3-2016/2017

F5: Högnivåprogrammering

F5: Högnivåprogrammering

Styrenheten styrsignalsekvenser programflödeskontroll

CE_O2. Nios II. Subrutiner med mera.

TSEA28 Datorteknik Y (och U)

Tentamen. Datorteknik Y, TSEA28

Digital- och datorteknik

CE_O1. Nios II. Enkla assembler-instruktioner.

IS1200 Datorteknik. Övning CE_O4 Maskinnära programmering med C Förberedelser till hemlaboration 1

Övning1 Datorteknik, HH vt12 - Talsystem, logik, minne, instruktioner, assembler

Assemblerprogrammets struktur; exempel

Maskinorienterad Programmering /2011. Maskinorienterad Programmering 2010/11. Maskinnära programmering C och assemblerspråk

Tentamen med lösningsförslag

Maskinorienterad Programmering LP3-2017/2018

Grunderna i stegkodsprogrammering

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

I denna laboration undersöker vi hur aritmetiska beräkningar utförs. Vi tittar på olika variabeltyper: 8-bitars, 16-bitars, 32-bitars och flyttal.

Tentamen. Datorteknik Y, TSEA28

Maskinorienterad Programmering 2010/11

Maskinorienterad Programmering IT2, LP2-2016/2017

c a OP b Digitalteknik och Datorarkitektur 5hp ALU Design Principle 1 - Simplicity favors regularity add $15, $8, $11

Tentamen. Datorteknik Y, TSEA28

Tentamen. Datorteknik Y, TSEA28

Mål. Datorteknik. Innehåll. Innehåll (forts) Hur ser ett program ut? Hur skapas maskinkoden?

Kontrollskrivning Mikrodatorteknik CDT S2-704

Institutionen för elektro- och informationsteknologi, LTH

Datorteknik. Föreläsning 3. Assembler, stack och subrutiner, programmeringskonventionen. Institutionen för elektro- och informationsteknologi, LTH

1 Datorn som miniräknare. 1.1 Räkneoperationer. 1.2 Variabler

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

Tentamen. Datorteknik Y, TSEA28

Kodningskonventioner (XCC12) Specifikation av strncpy: Övningsexempel: Maskinorienterad Programmering 2011/2012

Datorarkitekturer med operativsystem ERIK LARSSON

Maskinorienterad Programmering LP2-2017/2018

float Mindre rella tal ( floating point number ) double Rella tal/flyttal ( double precision floating point number )

F4: Assemblerprogrammering

Ulf Assarsson. Grundläggande C-programmering del 2 Pekare och Arrayer. Läromoment:

Datorteknik ERIK LARSSON

Laboration 2 i Datorteknik- Assemblerprogrammering II

Datorsystemteknik DVG A03 Föreläsning 3

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

Parameteröverföring. Exempel. Exempel. Metodkropp

Mål. Datorteknik. Innehåll. Vad händer med en add-instruktion? Vad händer med en add-instruktion. Instruktioner som bitmönster i minnet

Institutionen för elektro- och informationsteknologi, LTH

Datorteknik. Föreläsning 2. Programmering i C och assembler MIPS instruktionsarkitektur. Institutionen för elektro- och informationsteknologi, LTH

Programräknaren visar alltid på nästa instruktion som skall utföras. Så fort en instruktion har hämtats så visar programräknaren på nästa instruktion.

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

Dataminne I/O Stack 0x005D 0x3D SP low byte 0x005E 0x3E SP high byte

Enkla datatyper minne

CE_O3. Nios II. Inför lab nios2time

Digital Aritmetik Unsigned Integers Signed Integers"

Assemblerprogrammering del 3

Ext-13 (Ver ) Exempel på RTN-beskrivning av FLEX-instruktioner

Assemblerprogrammering för HCS12

Stack och subrutiner Programmeringskonventionen

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

Repetition C-programmering

Data, typ, selektion, iteration

Assemblerprogrammering del 1

Lathund. C för inbyggda system

Extra lab. Nu på fredag kl 8-12 Frivillig Enbart hjälp med projektuppgiften Ingen examination

Förenklad förklaring i anslutning till kompedieavsnitten 6.3 och 6.4

Objektorienterad Programmering (TDDC77)

Maskinorienterad programmering

Styrteknik: MELSEC FX och numeriska värden

Tentamen Datorteknik Y, TSEA28 Datum

Variabler, värden och typer

Assemblerprogrammets. struktur; exempel

Digitala System: Datorteknik ERIK LARSSON

Ext-13 (Ver ) Exempel på RTN-beskrivning av FLEX-instruktioner

Övning2 Datorteknik, HH vt12 - Programmering

Klassdeklaration. Metoddeklaration. Parameteröverföring

Transkript:

Assemblerprogrammering för ARM del 1 Ur innehållet: Assemblerspråk Ordlängder och heltalstyper i C Variabeldeklarationer Programkonstruktioner Tilldelningar Uttrycksevaluering Ovillkorliga programflöden Funktion med returvärde Läsanvisningar: Arbetsbok kap 1 och 2 Quick-guide, instruktionslistan Assemblerprogrammering för ARM - del 1 1

Ordlängder och heltalstyper, ANSI C Maskinorienterad programmering Typ char signed char unsigned char short short int signed short signed short int unsigned short unsigned short int long long int signed long signed long int unsigned long unsigned long int int signed signed int unsigned unsigned int Förklaring Minsta adresserbara enhet som kan rymma en basal teckenuppsättning. Det är dock en heltalstyp som kan vara signed eller unsigned, detta är implementationsberoende. Tolkas som heltal med tecken. Måste minst kunna representera talområdet [ 127, +127], dvs. minst 8 bitar. Tolkas som heltal utan tecken. Måste minst kunna representera talområdet [0, 255], dvs. minst 8 bitar. Kort heltalstyp med tecken. Måste minst kunna representera talområdet [ 32767, +32767], dvs. minst 16 bitar. Observera att talområdet [ 32768, +32767] som fås vid 2-komplementsrepresentation, också är tillåtet. Kort heltalstyp utan tecken. Måste minst kunna representera talområdet [0, +65535], dvs. minst 16 bitar. Lång heltalstyp med tecken. Måste minst kunna representera talområdet [ 2147483647, +2147483647], dvs. minst 32 bitar. Lång heltalstyp utan tecken. Måste minst kunna representera talområdet [0, +4294967295], dvs. minst 32 bitar. Implementationsbestämd heltalstyp med tecken. Måste minst kunna representera talområdet [ 32767, +32767], dvs. minst 16 bitar. Observera att talområdet [ 32768, +32767] som fås vid 2- komplementsrepresentation, också är tillåtet. Observera speciellt att int kan vara synonym med short eller long. Typen int utan tecken. Assemblerprogrammering för ARM - del 1 2

Rättningsvillkor ("alignment") Av prestandaskäl har vi restriktioner på var olika datatyper kan placeras i minnet: int (32-bitar, word) får bara finnas på en adress jämnt delbar med 4, s.k "word alignment") short (16-bitar, halfword) får bara finnas på en adress jämnt delbar med 2, s.k "halfword alignment") char (8 bitar) kan finnas på såväl udda som jämn adress Assemblerdirektiv:.ALIGN 1 @ LC = (LC + 1) & ~1) dvs. avrundar uppåt till jämn adress.align 2 @ LC = (LC + 3) & ~3) avrundar till address delbar med 4 LDR R0,symbol @ R0 M(symbol) översätts av assemblatorn till den verkliga instruktionen: LDR R0,[PC,offset] offset = (PC-symboladress) << 2, dvs. antal Words....ALIGN symbol:.word symbolvärde...på motsvarande sätt översätts LDR R0,=symbol så att adressen till symbol hamnar i R0 Assemblerprogrammering för ARM - del 1 3

Deklarationer char c; /* 8-bitars datatyp, storlek byte */ short s; /* 16-bitars datatyp, storlek halfword */ long l; /* 32-bitars datatyp, storlek word */ int i; /* 32-bitars datatyp, storlek word */ char c; short s; long l; int i; Assemblerspråk: c:.space 1.ALIGN 1 s:.space 2.ALIGN 2 l:.space 4 i:.space 4.GLOBL c,s,l,i Assemblerprogrammering för ARM - del 1 4

Instruktioner för tilldelningar Instruktion Betydelse Datatyp LDRB Load byte unsigned char LDRSB Load signed byte signed char LDRH Load halfword unsigned short LDRSH Load signed halfword signed short LDR Load word unsigned/signed int MOV Move (0..0xFF) liten konstant STRB Store byte char STRH Store halfword short STR Store word int ARM är en så kallad load/store -arkitektur vilket innebär att endast load/store instruktioner läser/skriver i minnet. Övriga instruktioner opererar direkt på register. Assemblerprogrammering för ARM - del 1 5

Register och adresseringssätt Exempel: Med deklarationen: int i; LDR R3,=i @ R3 i LDR R3,[R3] @ R3 M(i) samma sak som... LDR R3,i @ R3 M(i) Assemblerprogrammering för ARM - del 1 6

Tilldelningar char c; c = 1; short s; s = 1000; int i; i = 10000; Om det är en liten konstant (8 bitar) kan vi använda MOV-instruktionen Assemblerspråk: c:.space 1 MOV R0,#1 LDR R7,=c STRB R0,[R7]... s:.space 2 LDR R0,=1000 LDR R7,=s STRH R0,[R7]... i:.space 4 LDR R0,=10000 LDR R7,=variable STR R0,[R7]... Assemblerprogrammering för ARM - del 1 7

Tilldelningar: a = b; Maskinorienterad programmering Tilldelningar görs alltid via något register, grundregel, load/storeoperationer anpassade efter datatyp... Exempel: Följande deklarationer är gjorda på global nivå, visa hur deklarationerna uttrycks i assemblerspråk. char c1,c2; short s1,s2; int i1,i2; visa också hur följande tilldelningssatser kan kodas i ARM-v6 assemblerspråk: c1 = c2; s1 = s2; i1 = i2; Vi löser på tavlan... Assemblerprogrammering för ARM - del 1 8

Datatyper med olika storlekar Olika datatyper i höger/vänsterled kan kräva typkonvertering Exempel: char c; int i; större till mindre typ ger trunkering: c = i; dvs. c = (char) i; mindre till större typ kräver teckenutvidgning i = c; dvs. i = (int) c; Decimalt char short int -128 0x80 0xFF80 0xFFFFFF80 127 0x7F 0x7F 0x7F Dvs. vid teckenutvidgning kopieras teckenbiten till alla bitar med högre signifikans Assemblerprogrammering för ARM - del 1 9

Instruktioner för teckenutvidgning SXTB Rx,Ry??? 0XXXXXXX 00000000 00000000 00000000 0XXXXXXX??? 1XXXXXXX 11111111 11111111 11111111 1XXXXXXX Sign Extend Byte 8 till 32 bitar UXTB Rx,Ry SXTH Rx,Ry UXTH Rx,Ry??? 0XXXXXXX 00000000 00000000 00000000 0XXXXXXX??? 1XXXXXXX 00000000 00000000 00000000 1XXXXXXX?? 0XXXXXXX 00000000 00000000 0XXXXXXX XXXXXXXX XXXXXXXX?? 1XXXXXXX XXXXXXXX 11111111 11111111 1XXXXXXX XXXXXXXX?? 0XXXXXXX XXXXXXXX 00000000 00000000 0XXXXXXX XXXXXXXX?? 0XXXXXXX XXXXXXXX 00000000 00000000 0XXXXXXX XXXXXXXX Unsigned Extend Byte 8 till 32 bitar Sign Extend Halfword 16 till 32 bitar Unsigned Extend Halfword 16 till 32 bitar Assemblerprogrammering för ARM - del 1 10

Loadinstruktioner med teckenutvidgning Teckenutvidgningen sker direkt Maskinorienterad programmering Unsigned Extend Byte LDRB Rx,[Ry,#k] Signed Extend Byte LDRSB Rx,[Ry,Rz]??? 0XXXXXXX 00000000 00000000 00000000 0XXXXXXX??? 1XXXXXXX 00000000 00000000 00000000 1XXXXXXX??? 0XXXXXXX 00000000 00000000 00000000 0XXXXXXX??? 1XXXXXXX 11111111 11111111 11111111 1XXXXXXX Dvs. antingen: LDRB Rx,[Ry,#k] SXTB Rx,Rx eller MOV Rz,#0 LDRSB Rx,[Ry,Rz] På samma sätt med LDRH och LDRSH Assemblerprogrammering för ARM - del 1 11

Tilldelningar med typkonvertering Exempel: typkonvertering... signed char c; short s; int i; visa också hur följande tilldelningssatser kan kodas i ARM-v6 assemblerspråk: a) c = s; b) s = c; c) s = i; Anm: typen char kan enligt C-standard vara unsigned eller signed beroende på kompilatorn. För GCC-ARM gäller att char = (unsigned char) Vi löser på tavlan... Assemblerprogrammering för ARM - del 1 12

Subrutiner ( funktioner ) och goto C-operator Betydelse Operation Instruktion RTN f() funktionsanrop Branch and link BL <label> LR PC, PC label return Branch and exchange BX Rx PC Rx goto ovillkorlig Branch B <label> PC label sub C:... sub ();... Exempel: BL sub @ returadress -> LR... sub:... BX LR Returadressen sparas i register. Snabbt, men klarar ej rekursion Assemblerprogrammering för ARM - del 1 13

Returvärde från funktion Konvention: Returvärde i R0 för char, short och int Exempel: char f1( void ); short f2( void ); int f3(void) Alla dessa funktioner lämnar returvärdet i R0. Exempel: Utgå från deklarationerna: char c; int i; koda tilldelningarna c = f1(); i = f3(); Vi löser på tavlan... Assemblerprogrammering för ARM - del 1 14

Uttrycksevaluering DEST = (type of DEST) (uttryck); "värdeuttryck" Exempel: int a,b,c; a = b+c; (uttryck); "sanningsuttryck", dvs ==0 eller!= 0 Exempel: (a+1); /* falskt om a==-1 */ (a <= b); /* falskt om a>b */ Assemblerprogrammering för ARM - del 1 15

Instruktioner för unära operationer C-operator Betydelse Datatyp Instruktion ~ bitvis not signed/unsigned MVN - negation signed/unsigned NEG (RSB) DEST = operation (type of DEST) OPERAND; Exempel: Antag följande deklarationer på toppnivå : signed char a,b; Koda följande tilldelningssatser i assembler: a = ~b; a = -b; Vi löser på tavlan... Assemblerprogrammering för ARM - del 1 16

Instruktioner för binära operationer C-operator Betydelse Datatyp Instruktion + addition signed/unsigned ADD Rd,Rs1,Rs2 - subtraktion signed/unsigned SUB Rd,Rs1,Rs2 * multiplikation signed/unsigned MUL Rd,Rs1,Rs2 / division unsigned finns ej som instruktion, % modulus mjukvaruimplementerat & bitoperation AND signed/unsigned AND Rd,Rs1,Rs2 bitoperation OR signed/unsigned ORR Rd,Rs1,Rs2 ^ bitoperation EOR signed/unsigned EOR Rd,Rs1,Rs2 << rotation vänster signed/unsigned LSLRd,Rs1,Rs2 >> rotation höger signed ASR Rd,Rs1,Rs2 unsigned LSR Rd,Rs1,Rs2 Observera att alla operationer utförs på 32-bitars tal i register Assemblerprogrammering för ARM - del 1 17

Kodgenerering, binära operationer DEST = (type of DEST) OPERAND1 operation (type of DEST) OPERAND2; LDRx R1,OPERAND1 (ev. teckenutvidga) LDRx R2,OPERAND2 (ev. teckenutvidga) operation R0,R1,R2 LDR R7,=DEST STRx R0,[R7] Anm: LDRB och LDRH teckenutvidgar alltid som unsigned Assemblerprogrammering för ARM - del 1 18

Exempel: Addition av 16-bitars tal short int ssa,ssb,ssc;... sa = sb + sc; Eftersom alla instruktioner opererar på 32-bitar måste ingående operander först anpassas: unsigned short int... usa = usb + usc; usa,usb,usc; sa:.space 2 sb:.space 2 sc:.space 2... LDR R1,=sb LDRH R1,[r1] SXTH R1,R1 LDR R2,=sc LDRH R2,[R2] SXTH R2,R2 ADD R0,R1,R2 LDR R7,=sa STRH R0,[R7] usa:.space 2 usb:.space 2 usc:.space 2... LDR R1,=usb LDRH R1,[R1] @ UXTH R1,R1 @ teckenutvidga LDR R2,=usc LDRH R2,[R2] @ UXTH R2,R2 @ teckenutvidga ADD R0,R1,R2 LDR R7,=usa STRH R0,[R7] Assemblerprogrammering för ARM - del 1 19

Exempel: Uttrycksevaluering Exempel: Utgå från att följande deklarationer är gjorda på global nivå. char f(void); int a,b; Visa en kodsekvens, i ARM assemblerspråk, som evaluerar följande uttrycks värde till register R0. f() + a * ~( b & 4 ); Vi löser på tavlan... Assemblerprogrammering för ARM - del 1 20