William Sandqvist Datorteknik övning 3 stackhantering subrutin som anropar subrutin programutveckling.

Slides:



Advertisements
Liknande presentationer
Interface.  Interface är en datatyp och har alltså egen syntax och en hel del egna regler för vad arv från interface innebär.  Interface är renodlad.
Advertisements

INTRODUKTION TILL PROGRAMMERING
Array Skriv ett program som frågar följande: ”Hur många tal vill du mata in?” användaren matat in ett tal t.ex n. då frågar programmet n ggr följande.
void hittaMax(int tal[], int antal, int *pmax) { int i; ??=tal[0]; for(i=1;i??) ??=tal[i]; } int main() { int v[]={1,2,3,4,2}; int.
Anders Sjögren Lagringsklasser •en variabel i C har två attribut –type( int, float, char..... ) –lagringsklass( auto, extern, register, static ) •lagringsklassens.
Programstruktur: C för enchipsdatorer
Funktioner och programorganisation
2D1311 Programmeringsteknik med PBL
De fundamentala datatyperna
William Sandqvist Datorteknik övning 2 Subrutinanrop William Sandqvist
C-programmering ID120V William Sandqvist Länkad lista
Programmeringsteknik K och Media
Föreläsning 10 Länkade lista Stack och Kö Att arbeta med listor
Föreläsning 4 Python: Definiering av egna funktioner Parametrar
Föreläsning 6 Referenser Objekt som parametrar public/private Klassvariabler och klassmetoder.
i olika programmeringsspråk
Tentamensdags och lab 3…. Större program delas normalt upp i flera filer/moduler vilket har flera fördelar:  Programmets logiska struktur när man klumpar.
William Sandqvist Funktion som byter plats på två variabler /* swap1.c first attempt at a swaping function */ /* from Stephen Prata, C Primer.
OOP F4:1 Marie Olsson OOP Objekt-orienterad programmering Föreläsning 4 Metoder klass-metoder instans-metoder.
Programmering i C# 3. Klasser.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 6 ( ) INNEHÅLL: -Mera om tabeller.
Pekare och speciell programstruktur i inbyggda system
Pointers. int a=5; int f(int b) { a--; b++; return b; } int main() { int a=3; printf("%d,",f(a)); printf("%d",a); return 0; }
Programmering B PHP Lektion 2
Föreläsning 2 Kort Översikt Över Javaspråket. Källkodsformat Unicode används åäöμψζ tillåtna Inte alla miljöer klarar av det Källkod Bytekod Java VM för.
Deklarera en struct som kan användas för att representera en rät linje Använd den I main för att deklarera en variabel som du initierar så att den representerar.
William Sandqvist C:s minnesmodell.
Grundläggande programmering
Problemlösning Veckodagsproblemet Gissa talet Siffersumman.
Anders Sjögren Pekare. Anders Sjögren Skapa ett program som byter plats på två heltal Pekare.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 7 ( ) INNEHÅLL: -Metoder -Lokala variabler -Mera om klasser: -Nyckelorden.
1 Föreläsning 6 Programmeringsteknik och Matlab 2D1312/2D1305 Metoder & parametrar Array API och klassen ArrayList.
Namnrum, räckvidd och rekursion Linda Mannila
Föreläsning 1 Reserverade ord Javas API Identifierare Litteraler Variabler Kompilering och interpretering.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 2 ( ) INNEHÅLL: -Variabler och datatyper -Tilldelning av variabler -Aritmetiska.
Problemlösningsmetodik
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 5 ( ) INNEHÅLL: -Metoder.
F4 - Funktioner & parametrar 1 Programmeringsteknik, 4p vt-00 Modularisering ”svarta lådor” Väl definierade arbetsuppgifter Enklare validering Enklare.
William Sandqvist C-programmering ID120V Stack och Kö William Sandqvist
För utveckling av verksamhet, produkter och livskvalitet. Stack och Kö - Implementering - Tilllämpningar.
Föreläsning 4 Klasser Och Objekt.
Stack och Kö -Implementering -Tilllämpningar -- Kapitel 16, 11.
Anders Sjögren Filer - långtidslagring. Anders Sjögren Filtyper i DOS talet ett ( intx=1; ) lagrat i en –textfil, (en sekvens av tecken ( bytes )) enligt.
F. Drewes, Inst. f. datavetenskap1 Föreläsning 9: Implementering av underprogram Aktiveringsposter Exekveringsstacken Implementera dynamisk räckvidd.
Anders Sjögren Deklarationsområde och funktioner.
ITM1 Kapitel 8 Datastrukturer Grundläggande datavetenskap, 4p Utgående från boken Computer Science av: J. Glenn Brookshear.
TILLÄMPAD DATALOGI (TILDA) Övningsgrupp 2 Marcus Hjelm
1 Ingenjörsmetodik IT & ME 2007 Föreläsare Dr. Gunnar Malm.
F2 1 Programmeringsteknik, 4p vt-00 Kommentarer Allt mellan /* och */ Varje kommentar byts ut mot en blank av kompilatorn /* Exempel på uttryck, tilldelningsoperatorn.
Programmeringsteknik för K och Media
© Anders Broberg, Ulrika Hägglund, Lena Kallin Westin, 2003 Datastrukturer och algoritmer Gruppövning 0.
William Sandqvist Funktionsbibliotek När man utvecklat en funktion så långt att den är "färdigutvecklad" kan man lika gärna spara den på.
Jonny Karlsson PROCESSPROGRAMMERING Föreläsning 8 ( ) Innehåll: -Exekveringstrådar.
Kronljusströmställaren 0, 1, 2, 3
William Sandqvist Datorteknik övning 1 Introduktion till assemblerprogrammering av Nios II William Sandqvist
Anders Sjögren Data (i primärminnet) som en länkad lista datatypen för varje element i listan är en struktur, post ( struct )
1 Föreläsning 2 Reserverade ord Javas API Identifierare Litteraler Variabler Kompilering och interpretering.
2 June G1518, föreläsning 4, ht2006 (D2)1 2G1518 Datorteknik Föreläsning 4 Programutveckling, Intro till lab 1 Kursboken, kapitel 1, 4, 5 och 8 ht.
William Sandqvist Övning 10 Processorkonstruktion med pipe-line.
Datorteknik övning 4 Maskinnära programmering med C inför hemlab 1
Anders Sjögren Enkelt program med funktion /* two_func.c - a program that uses two functions in one file */ /* from Stephen Prata C Primer Plus ISBN
Program indata ? utdata 1/20 Vahid Mosavat, Nada, KTH.
1 Föreläsning 4 Metoder & parametrar Array API och klassen ArrayList.
1 IS1200 Datorteknik, övning 4 Maskinnära programmering med C Förberedelser till hemlaboration 1.
Föreläsning 3 Väsentliga delar i ett Javaprogram Input i paketet extra
William Sandqvist Datorteknik övning 4 Maskinnära programmering med C inför hemlab 1.
11 August 2015IS1200 Datorteknik, föreläsning 41 IS1200 Datorteknik Föreläsning 4 Programutveckling, Intro till lab 1 Kursboken, kapitel 1, 4, 5 och 8.
Anders Sjögren Programmering i ANSI-C Ett första program för att se vart vi ska...
William Sandqvist Övning 10 Processorkonstruktion med pipe-line.
Anders Sjögren Funktioner något in och något annat ut.
Presentationens avskrift:

William Sandqvist Datorteknik övning 3 stackhantering subrutin som anropar subrutin programutveckling

William Sandqvist Datorteknik övning 3

William Sandqvist Laborationerna

2.6 Hur anropas mul10() ? William Sandqvist tal = mul10(43); Anrop i C-program: movi r4, 43 # parameter i R4 call mul10 # call subrutin movia r8, tal # adressen till ”tal” i R8 stw r2,0(r8) # lagra resultat vid ”tal:”... mul10: slli r10,r4,3 # skifta tre steg (ggr 8) slli r11,r4,1 # skifta ett steg (ggr 2) add r2,r10,r11 # addera i returvärdesregistret R2 ret # returnera Assemblerprogram:

William Sandqvist 3.1 Stackoperationer a) Visa hur en stack fungerar. b) Ge exempel på hur man med befintliga instruktioner för Nios- II kan utföra stackoperationerna PUSH reg och POP reg. c) Skriv makron för operationerna PUSH reg och POP reg.

William Sandqvist Stack  En stack är en datastruktur  LIFO Last in – first out (som att lägga tallrikar på en tallrikstrave).  Hela stacken kan läsas, men bara det senast inlagda värdet kan tas bort. Stacken har den egenskapen att den vänder på ordningen på data.

William Sandqvist Stackpekare Ett register, stackpekaren, innehåller adressen till det senast inlagda värdet.

William Sandqvist push – inläggning på stack 1)Stackpekaren minskas med 4 Byteadresser – så att den pekar på lediga platsen 2)Skriv data på lediga platsen

William Sandqvist pop – borttagning från stack 1)Läs värdet 2)Öka stackpekaren med 4 Byteadresser. Värdet ligger kvar i minnet men kommer att ”skrivas över” vid nästa push på denna adress.

William Sandqvist Makron Med makron för push och pop är det mindre risk att man hanterar stackpekaren på ett inkonsekvent sätt..macro PUSH reg subi sp,sp,4 stw \reg, 0(sp).endm.macro POP reg ldw \reg, 0(sp) addi sp,sp,4.endm

William Sandqvist Behövs PUSH/POP ? Nios II kan använda indexerad operandutpekning och offset-värden för att nå alla data på stacken relativt stackpekaren. Då behövs det bara hälften så många instruktioner för att hantera stacken jämfört med push/pop, eftersom offset beräknas vid kompileringen. sp Medan en kompilator kan ”hålla reda på” var på stacken den lagrat olika data, så är det vi som laboranter som behöver ett enkelare system, det vill säga push/pop. Vid laborationerna väger den prestandaförlusten lätt!

William Sandqvist 3.2 Subrutinanrop i flera nivåer Vilka speciella åtgärder måste vidtagas om man gör ett subrutinanrop i en subrutin? Kallas även för inkapslad subrutin eller nested procedure.

William Sandqvist Returaddress Returadressen lagras i register R31

William Sandqvist Subrutin i flera nivåer Hur går det nu med första returadressen?

William Sandqvist Returadress på stacken En subrutin som anropar en annan subrutin måste lägga sin egen returadress på stacken före anropet.

William Sandqvist push r31 1)Minska stackpekarens värde med 4 -så att den pekar ut nästa lediga plats 2)Skriv data -innehållet i R31kopieras till nya platsen

William Sandqvist Subrutinstruktur

William Sandqvist 3.3 Subrutin med värdeanrop Skriv välkommenterad Nios-II assemblerkod för en subrutin sumv() som adderar två 32-bitars heltal vars värden lagrats i register R4 och R5 innan anropet av sumv(). Resultatet av beräkningarna skall finnas i register R2 efter returhopp från sumv(). Nedan visas hur motsvarande C programkod ser ut. Handkompilera denna kod till assemblerkod för Nios-II. int sumv(int x, int y) { return x+y; }

William Sandqvist värdeanrop.global sumv sumv: add r2,r4,r5 ret int sumv(int x, int y) { return x+y; } R2R4 R5 Värdeanrop. Det anropande programmet skickar med (kopior) av variabelvärden som parametrar i R4 och R5. Call-by value

William Sandqvist 3.4 Huvudprogram med värdeanrop Skriv välkommenterad Nios-II assemblerkod för ett huvudprogram som använder subrutinen sumv(), se föregående uppgift, för att addera två heltal. Nedan visas ett exempel på hur ett sådant C-program kan se ut. Handkompilera denna kod till assemblerkod för Nios-II int a, b, res; extern int sumv(int, int); int main(void) { a = 3; b = 4;... res = sumv(a, b);... return 0; }

William Sandqvist assembler.data.align 2 a:.word 0 b:.word 0 res:.word 0.text.align 2.include ”../mymacro.s” Kompilering sker i en undermapp därför måste sökvägen till filen med makron (tex PUSH och POP) anges med../

William Sandqvist assembler … main skall returnera till startup-koden här returneras till startup-koden sumv får använda r8 (titta efter om den gör det?).global main main: PUSH r31 # spara mains returadress movia r8,a # basadress till variabler movi r9,3 stw r9,0(r8) # global a=3 movi r9,4 stw r9,4(r8) # global b=4... ldw r4,0(r8) # a i R4 ldw r5,4(r8) # b i R5 PUSH r8 # caller-save R8 call sumv POP r8 # restore R8 stw r2,8(r8) # returvärde till global res mov r2,r0 # main skall returnera 0 POP r31 # återställ mains returadress ret

William Sandqvist Denna gång använde subrutinen bara R4 R5 och R2, så det var onödigt att spara R8 på stacken. Sådant kan man bara veta om man skrivit alla program själv.

William Sandqvist 3.5 Subrutin med referensanrop Skriv välkommenterad Nios-II assemblerkod för en subrutin suma() som adderar två 32-bitars heltal vars adresser lagrats i register R4 och R5 före anropet av suma(). Resultatet av beräkningen skall finnas i register R2 efter returhopp från suma(). Nedan visas hur motsvarande C-programkod ser ut Handkompilera denna kod till assemblerkod för Nios-II int suma(int* x, int* y) { return (*x + *y); }

William Sandqvist pekare * adress & och avreferering * int b; Deklaration av heltalsvariabeln b. Plats reserveras. b = 18; Definition av variabeln b. Nu innehåller den talet 18. &b Adressoperatorn. Adressen till variabeln b. int * c; Deklaration av int-pekarvariabeln c. c = &b; Nu pekar c på b. *c Avrefereringsoperatorn. Det som c pekar på. *c = 19; Talet 19 lagras på den plats som c pekar ut. Nu innehåller b = 19. Kort om C-språkets pekare 18 ( ) 18 ( ) 19 ( )

William Sandqvist referensanrop.global suma suma: ldw r8,0(r4) ldw r9,0(r5) add r2,r8,r9 ret int suma(int* x, int* y) { return (*x + *y); } R2R4R5 ( )

William Sandqvist 3.6 Huvudprogram med referensanrop Skriv välkommenterad Nios-II assemblerkod för ett huvudprogram som använder subrutinen suma(), se föregående uppgift, för att addera två heltal. Nedan visas ett exempel på hur ett sådant C-program kan se ut. Handkompilera denna kod till assemblerkod för Nios-II int a, b, res; extern int suma(int*, int* ); int main(void) { a = 3; b = 4;... res = suma(&a, &b);... return 0; } 3 4

William Sandqvist assembler.data.align 2 a:.word 0 b:.word 0 res:.word 0.text.align 2.include ”../mymacro.s” Precis som tidigare …

William Sandqvist assembler ….global main main: PUSH r31 # spara mains returadress movia r8,a # basadress till variabler movi r9,3 stw r9,0(r8) # global a=3 movi r9,4 stw r9,4(r8) # global b=4... mov r4,r8 # adress till a i R4 addi r5,r8,4 # adress till b i R5 PUSH r8 # caller-save R8 call suma POP r8 # restore R8 stw r2,8(r8) # returvärde till global res mov r2,r0 # main skall returnera 0 POP r31 # återställ mains returadress ret Tur att vi sparar R8, suma använder både R8 och R9 !

William Sandqvist Varför värdeöverföring?  Undvika sidoeffekter (som globala variabler kan ha) Om man i ett stort projekt upptäcker att en global variabel plötsligt har ett oväntat värde, så är alla misstänkta. Vilken funktion som helst når den globala variabeln och kan ha utfört ändringen. Det hade aldrig varit möjligt att skriva UNIX i C om globala variabler hade använts annat än undantagsvis.

William Sandqvist Varför referensöverföring?  Undvika sidoeffekter (som globala variabler kan ha)  Flera returvärden än ett enda är möjligt (retur genom parameterlistan)  Överföring av dataposter som inte rymms i register ( arrayer, strängar, struct )  Möjligt att skriva generella funktioner som opererar på valfria datatyper.

William Sandqvist 3.7 programutveckling

William Sandqvist 3.8 Minnesdisposition Gles adressrymd Endast en liten del av minnet är utbyggt. (vanligt för inbyggda system) Stackpekaren initieras av startup- koden så det behöver inte (=ska inte) Du göra code motsvarar.text Mellan adresserna 0x800 till 0xA20 finns I/O- kretsar – med allt det roliga på DE2-kortet

William Sandqvist 3.10 Labprogram Funktionsprototyper i C beskriver vad funktionerna heter och hur de används. int hexasc(int digit); void puttime(int* timeloc); void tick(int* timeloc); void delay(int millisec);

William Sandqvist hexasc() int hexasc(int digit); Inparameter ett tal mellan 0 och 15 (om inte, ”maska” till rätt storlek) Returvärde ett 7-bitarstal motsvarande ASCII-koden för tecknet 0…9...A...F Tips: siffrorna 0..9 har ASCII-koder i nummerordning därför är: ’3’ = ’0’ + 3; /* kompilatorn kan ”slå upp” ASCII-koderna */

William Sandqvist ASCII-tabellen Ett tecken lagras i en Byte. Hej! A

William Sandqvist timeloc global variabel för tiden

William Sandqvist tick() räkna upp med ett (klockmässigt)

William Sandqvist tick()

William Sandqvist tick() klockmässighet

William Sandqvist void tick( unsigned int * timep ) { /* Get current value, store locally */ register unsigned int t = * timep; t += 1; /* Increment local copy */ /* If result was not a valid BCD-coded time, adjust now */ if( (t & 0x f) == 0x a ) t += 0x ; if( (t & 0x000000f0) == 0x ) t += 0x000000a0; /* Seconds are now OK */ if( (t & 0x00000f00) == 0x00000a00 ) t += 0x ; if( (t & 0x0000f000) == 0x ) t += 0x0000a000; /* Minutes are now OK */ if( (t & 0x000f0000) == 0x000a0000 ) t += 0x ; if( (t & 0x00ff0000) == 0x ) t += 0x00dc0000; /* Hours are now OK */ if( (t & 0x0f000000) == 0x0a ) t += 0x ; if( (t & 0xf ) == 0xa ) t = 0; /* Days are now OK */ * timep = t; /* Store new value */ } Vid lab1 kan Du använda given funktion tick() skriven i C. Förstår Du koden?

William Sandqvist tick() Strukturdiagram Strukturdiagram för tick() till en ”minut:sekund” -klocka

William Sandqvist 3.11 Biblioteksrutiner int putchar(int ch); Ett tecken i R4 sänds ut på jtag_uart och visas i Nios-II IDE Consol fönster. Om allt gick bra returneras i R2 samma tecken som sändes. Detta är ”statusinformation”, men man behöver inte ta hand om detta returvärde.

William Sandqvist 3.12 Fördröjningsrutin Det behövs en subrutin wait() som medför att instruktionen call wait tar cirka 100 ms att exekvera. Nios II har klockfrekvensen 50 MHz. Körtiden approximeras genom att varje instruktion antas ta en klockcykel. wait() måste återlämna alla register oförändrade.

William Sandqvist exekveringstid

William Sandqvist 3.13 Varierbar fördröjningstid void waitx(int n); R4 R2 Onödigt! vi vet att vår wait inte använder R4, utan bara R8.

William Sandqvist 3.14 Assemblerdirektiv.include ”fil.ext” # infogar fil.ext.data # nu kommer datareservationer.text # programkod.global main # main blir synlig globalt (”public”).align 3 # nästa adress ska vara delbar med 2 3 B:.string ”hej 17” # lagra ASCII-sträng C:.ascii”tjoho” # lagra ASCII D:.asciz ”plusnul” # ASCII avslutad med NUL TAL:.byte 0x01 # reservera 1 byte med värde 0x01.equ ExcBase,0x20020# def. symbol namn TIME:.word 0x5957 # 32 bitar med värde KOLON:.byte ’:’#ascii för kolon lagras