Assemblerprogrammering för ARM del 3

Relevanta dokument
Assemblerprogrammering för ARM del 1

Assemblerprogrammering för ARM del 2

Assemblerprogrammering för ARM del 1

Assemblerprogrammering, ARM-Cortex M4 del 3

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

Assemblerprogrammering - fördjupning

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

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

Assemblerprogrammering för ARM del 1

Assemblerprogrammering, ARM-Cortex M4 del 1

Tentamen med lösningsförslag

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

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

Övning från förra gången: readword

Programmering av inbyggda system. Pekare och Arrayer. Viktor Kämpe

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

Enkla datatyper minne

TDIU01 - Programmering i C++, grundkurs

Pekare. Pekare. Varför använder vi pekare? Vad är en pekare? Pekare. Deklaration/initiering av pekare

Klassdeklaration. Metoddeklaration. Parameteröverföring

TDDC76 - Programmering och Datastrukturer

Tentamen med lösningsförslag

Att använda pekare i. C-kod

Översikt Introduktion DST 1. Nicholas Wickström. IDE, Högskolan i Halmstad. N. Wickström

Tentamen med lösningsförslag

Assemblerprogrammering del 2

Hantering av textsträngar och talsträngar. William Sandqvist

Maskinorienterad programmering

Programmering av inbyggda system. Pekare och Arrayer. Ulf Assarsson. Originalslides av Viktor Kämpe

Digital- och datorteknik

4. Maskinnära programmering i C. Förberedelser till hemlaboration 1.

4 Sammansatta datatyper

Digital- och datorteknik

Programmering i C++ EDA623 Typer. EDA623 (Föreläsning 4) HT / 33

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

Fortsä'ning Pekare. Ulf Assarsson. Originalslides av Viktor Kämpe

2 Pekare och dynamiska variabler.

Innehåll. Pekare Syntax

F5: Högnivåprogrammering

TDIU01 - Programmering i C++, grundkurs

F5: Högnivåprogrammering

Digital- och datorteknik

Programmering A. Johan Eliasson

Parameteröverföring. Exempel. Exempel. Metodkropp

Programmering av inbyggda system 2014/2015

LEU500-Maskinorienterad programmering LP3-2016/2017

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

1 Funktioner och procedurell abstraktion

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

Johan Karlsson Datavetenskap för teknisk kemi, 10p, moment 1 Datavetenskap Umeå Universitet. Tentamen

Övning2 Datorteknik, HH vt12 - Programmering

Lågnivåprogrammering. Föreläsning 2 Lågnivåprogrammering. Binära tal. En enkel modell av datorns inre

Tentamen i. för D1 m fl, även distanskursen. lördag 19 januari 2013

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

TDDC76 - Programmering och Datastrukturer

*Pekarvärden *Pekarvariabler & *

Pekare och arrayer. Indexering och avreferering

Programmeringsteknik för Ingenjörer VT06. Föreläsning 10

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

Tommy Färnqvist, IDA, Linköpings universitet

F4 Klasser och Metoder. ID1004 Objektorienterad programmering Fredrik Kilander

Programmering i C. Vad är C? Målsättning. Litteratur. Jämförelse med Java. Exempel : Ett program som skriver ut texten Hello, world

TDIU01 - Programmering i C++, grundkurs

LEU240 Mikrodatorsystem

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

PC-teknik, 5 p LABORATION ASSEMBLERINTRODUKTION

Kapitel 1. C++-programmets beståndsdelar. C++-programmets beståndsdelar. Kapitel 1 grunderna i C++

6 Lågnivåprogrammering

Programmering av inbyggda system. Kodningskonventioner. Viktor Kämpe

Per Holm Lågnivåprogrammering 2014/15 24 / 177. int och double = = 2, 147, 483, 647

Tentamen i Programmering grundkurs och Programmering C

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

Fortsä'ning Pekare. Ulf Assarsson. Originalslides av Viktor Kämpe

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

Lösningsförslag: Instuderingsfrågor, del D

CE_O1. Nios II. Enkla assembler-instruktioner.

Repetition C-programmering

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

GPIO - General Purpose Input Output

Lathund. C för inbyggda system

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

2D1387, Programsystemkonstruktion med C++ Johnny Bigert, Kursens hemsida:

Programmering, grundkurs, 8.0 hp HI1024, HI1900 etc., Tentamen TEN1. Måndagen den 10 januari 2011,

Innehåll. 1 Funktionsmallar. 2 Pekare och konstanter. 3 Typomvandlingar. struct Name { string s; //... };

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

Föreläsning 2, vecka 8: Repetition

Agenda. Arrayer deklaration, åtkomst Makron Flerdimensionella arrayer Initiering Strängar Funktioner och arrayer. Övningar nu och då

CPU. Carry/Borrow IX. Programräknare

TDP004. Minne och pekare. Eric Elfving Institutionen för datavetenskap

Elektroteknik MF1016 föreläsning 9 MF1017 föreläsning 7 Mikrodatorteknik

Tentamen *:58/ID100V Programmering i C Exempel 3

Introduktion C-programmering

Föreläsning 6 pekare och pekare tillsammans med arrayer

C++-programmets beståndsdelar

Skizz till en enkel databas

Byggstenar. C++-programmets beståndsdelar. C++-programmets beståndsdelar. Grundläggande datatyper

Föreläsning 6: Metoder och fält (arrays)

Programbibliotek. Ur innehållet: Olika typer av bibliotek Kompilatorbibliotek C-bibliotek Run-time miljö Så skapar du ett nytt bibliotek

Transkript:

Assemblerprogrammering för ARM del 3 Ur innehållet Fält och sammansatta typer (poster) Pekarvariabler och pekarkonstanter Pekararitmetik, operationer på fält Läsanvisningar: Arbetsbok kap 2 Quick-guide, instruktionslistan 1

Fält vektorer N element, indexeras 0..N-1 char charvec[n]; sizeof (charvec) = N bytes short shortvec[n]; sizeof(shortvec)= N*2 bytes int intvec[n]; sizeof (intvec) = N*4 bytes 2

Adressberäkning och adresseringssätt const k=?; (0..N-1) char charvec[n]; charvec[k]; Maskinorienterad programmering LDR R0,=charvec LDRB R0,[R0,#k] int i; char charvec[n]; charvec[i]; LDR R0,=charvec LDR R1,i LDRB R0,[R0,R1] Adress: charvec+k Konstant index: LDR Rd,[Rb,#k] @ Rd M(Rb+k) Adress: charvec+i Register index: LDR Rd,[Rb,Ri] @ Rd M(Rb+Ri) 3

Adressberäkning och adresseringssätt Maskinorienterad programmering int i; short shortvec[n]; shortvec[i]; int i; int intvec[n]; intvec[i]; LDR R0,=shortvec LDR R1,i LSL R1,R1,#1 LDRHS R0,[R0,R1] LDR LDR LSL LDR R0,=intvec R1,i R1,R1,#2 R0,[R0,R1] 4

Flerdimensionella fält matriser N M element, indexeras [0..N-1] [0..M-1] char int mc [N][M]; i1,i2; Referens: mc[i1][i2] Adress: mc + (i1*m) + i2 Kompilatorn ersätter multiplikationen med skift/add kombinationer eftersom mul-instruktionen tar betydligt fler klockcykler att utföra. M = 2 x + y Exempelvis då M=10: 10 = 2 3 +2 5

EXEMPEL 1 EXEMPEL: Vi har deklarationerna: int i,j; int veci[80]; int vm[10][5]; Visa kodsekvenser som evaluerar följande uttryck till register R0. a) veci[j]; b) vm[i][j] Vi löser på tavlan... 6

Sammansatta typer - struct (post) Inkapsling av flera variabler, ev. med olika typer struct snamn{ }; typedef struct snamn TSTRUCTNAMN; alternativt: typedef struct snamn /* snamn kan utelämnas här */ { } TSTRUCTNAMN; EXEMPEL: Datatyp för koordinater typedef struct { int x,y,z; } COORD; EXEMPEL: Deklaration av två koordinater COORD start, end; 7

Referenser end EXEMPEL: Vi har deklarationerna: COORD start, end; Koda följande tilldelningar i assemblerspråk start.x = 1; start.z = 3; end.y = 20; start Lösning: LDR MOV STR MOV STR LDR MOV STR R3,=start R2,#1 R2,[R3] R2,#3 R2,[R3,#8] R3,=end R2,#20 R2,[R3,#4] 8

Inbäddad post Ev. rättningsvillkor måste respekteras. En annan post kan ingå i en större post. Vi har deklarationen: struct { int a; char b; short c; COORD d; } st; Visa kodsekvenser som evaluerar följande uttryck i register R0. a) st.c b) st.d.y.align 2 offset_a = 0 offset_b = offset_a + sizeof(a) offset_c = offset_b + sizeof(b) + align(1) offset_d_x= offset_c + sizeof(c) + align(2) offset_d_y= offset_d_x+ sizeof(d.x) + align(2) offset_d_z= offset_d_x+ sizeof(d.x) + align(2) a) LDR R0,=st LDRH R0,[R0,#6] @ R0= st + 6 (offset_c) b) LDR R0,=st LDR R0,[R0,#12] @ R0= st + 12 (offset_d_y) 9

Union Vi har deklarationen: union { char a; short b; long c; } u; Storleken (sizeof(u)) är garanterad att rymma den största, av de typer, som ingår i unionen. a) u.align 2 offset_a = 0 offset_b = 0 offset_c = 0 b a =u a) Visa hur u representeras i minnet. Visa kodsekvenser som evaluerar följande uttryck i register R0. b) u.a; c) u.b; d) u.c; c b) LDR R3,=u LDRB R0,[R3] c) LDR R3,=u LDRH R0,[R3] d) LDR R3,=u LDR R0,[R3] 10

Grundläggande pekartyper, ARM-M4 char *cptr; /* pekar på 8-bitars datatyp */ short *sptr; /* pekar på 16-bitars datatyp */ int *iptr; /* pekar på 32-bitars datatyp */ Exempel: cptr = ( char *) 0x40021010 sptr = ( short *) 0x40021010 iptr = ( int *) 0x40021010 Adressutrymmet är 32 bitar. PC, SP och ALLA pekartyper är 32 bitar 11

Operatorer för pekare & * Vi har: int i, *ptr; Om pekarvariabeln ptr innehåller adressen till x gäller att ptr == &x, ptr är en referens till x och att: *ptr == x är en dereferens av ptr Dvs: ptr är en minnesadress *ptr är innehållet på denna minnesadress &ptr är pekarvariabelns adress i minnet 12

Referenser, dereferenser och tilldelningar Exempel: Vi har deklarationerna: char c,*cptr; int *iptr; Koda följande tilldelningar i assemblerspråk a) cptr = iptr; b) *cptr = *iptr c) cptr = &c; d) c = *cptr; @ a) cptr = iptr; LDR R0,iptr LDR R7,=cptr STR R0,[R7] @ b) *cptr = *iptr LDR R7,cptr LDR R0,iptr LDR R0,[R0] STRB R0,[R7] @ c) cptr = &c; LDR R7,=cptr LDR R0,=c STR R0,[R7] @ d) c = *cptr; LDR R0,cptr LDRB R0,[R0] LDR R7,=c STRB R0,[R7] Maskinorienterad programmering 13

Pekare och portar En "port" är i själva verket ett register som finns på en konstant adress i minnesutrymmet. För att läsa från, eller skriva till registret måste vi därför kunna dereferera en konstant. Alltså måste konstanten först typkonverteras till en pekare, syntaxen kräver då: *(( typ *) konstant) Exempel: Då en 16 bitars port på address 0x40021010 refereras enligt: *((unsigned short*) 0x40021010); kodas detta i assembler: LDR R0,=0x40021010 LDRH R0,[R0] 14

EXEMPEL 2 Exempel: Visa, såväl i C som i assembler, hur de fyra minst signifikanta bitarna hos en läs- och skrivbar port på address 0x40021014 sätts till 1, medan övriga bitar lämnas opåverkade. Vi löser på tavlan 15

Pekare till fält Exempel: De globala variablerna i, och vecc är definierade enligt: int i; char vecc[20]; Visa en kodsekvens som evaluerar uttrycket &vecc[i-1] till register R0. Lösning: @ adress = vecc + i-1 LDR R0,=vecc LDR R1,i SUB R1,R1,#1 ADD R0,R0,R1 Exempel: De globala variablerna i, och mc är definierade enligt: int i; char mc[12][8]; Visa en kodsekvens som evaluerar uttrycket &mc[i][4] till register R0. Lösning: @ adress = mc + i*8 + 4 LDR R0,=mc LDR R1,i LSL R1,R1,#3 ADD R0,R0,R1 ADD R0,R0,#4 16

Pekare till sammansatta typer Exempel: typedef struct coord { int x,y,z; struct coord *sp; } COORD; COORD start; COORD end; COORD *coordlist; Koda tilldelningarna: coordlist = &start; start.sp = &end; coordlist->sp = &end; @ start.sp = &end; LDR R3,=start LDR R2,=end STR R2,[R3,#12] @ coordlist = &start; LDR R3,=start LDR R2,=coordList STR R3,[R2] @ coordlist->sp = &end; LDR R3,=coordlist LDR R3,[R3] LDR R2,=end STR R2,[R3,#12] 17

Pekare till funktioner LDR LDR STR Maskinorienterad programmering Vi har följande funktioner: void do_this( void ) {} void do_that( void ) {} Vi kan deklarera en variabel func, som en pekare till en sådan funktion. void (*func)(void); Vi har sedan ytterligare ett instrument att påverka programflödet: if(... ) func = &do_this; else func = &do_that;... R2,=do_this R3,=func R2,[R3] func(); /* do_this eller do_that... */ LDR R3,func BLX R3 18

Pekare till funktioner Exempel: Visa i C och assembler hur en pekare till funktionen void do_this( void ) placeras på address 0x2001C000 i minnet. Maskinorienterad programmering Tilldelningen kodas i C: *((void (**)(void) ) 0x2001C000 ) = &do_this; Tilldelningen kodas i assembler: LDR R0,=do_this LDR R1,=0x2001C000 STR R0,[R1] 19

Pekare till pekare Exempel: cp = *dcp; kodas LDR R3,=dcp LDR R3,[R3] @ R3=dcp LDR R3,[R3] @ R3=*dcp LDR R2,=cp STR R3,[R2] c = **dcp; kodas LDR R3,=dcp LDR R3,[R3] @ R3=dcp LDR R3,[R3] @ R3=*dcp LDRB R2,[R3] @ R3=**dcp LDR R3,=c STRB R2,[R3] Maskinorienterad programmering Deklarationen : char **dcp; läses dcp är en pekare till en pekare till en char. 20

Increment/Decrement operatorer Operatorer för att öka eller minska med 1: int i,j; i = j++; i = ++j; i = j--; i = --j; /* i j; j j+1; */ postinkrement /* j j+1; i j; */ preinkrement /* i j; j j-1; */ postdekrement /* j j-1; i j; */ predekrement Samma operatorer för pekare ger ökning/minskning baserad på typ: char *cp; +/- sizeof( char) cp++ ; /* cp cp+1; */ short *sp; +/- sizeof( short) sp++ ; /* sp sp+2; */ int *ip; +/- sizeof( int) ip++ ; /* ip ip+4; */ 21

Pekararitmetik Exempel: I standard-c biblioteket finns funktionen strcpy, för att kopiera en ASCII-sträng i minnet. Strängslut markeras med tecknet \0, dvs. 0 och detta tecken ska vara det sista som kopieras. Funktionen returnerar dest och kan implementeras på följande sätt, visa hur strcpy kan kodas i assemblerspråk. char *strcpy( char *dest, char * src ) { char *rval = dest; do{ *dest++ = *src++; } while( *(src-1) ); return rval; } Vi löser på tavlan... 22