William Sandqvist william@kth.se Datorteknik övning 1 Introduktion till assemblerprogrammering av Nios II William Sandqvist william@kth.se.

Slides:



Advertisements
Liknande presentationer
INTRODUKTION TILL PROGRAMMERING
Advertisements

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
Introduktion till C för enchipsdatorer
Funktioner och programorganisation
2D1311 Programmeringsteknik med PBL
Programmeringsteknik Föreläsning 13 Skolan för Datavetenskap och kommunikation.
Programmeringsteknik I: F1 1 Föreläsning 1: Intro till kursen och programmering Kursens hemsida Studentportalen.
P-uppgiften: regler, planering och specifikation
William Sandqvist Datorteknik övning 2 Subrutinanrop William Sandqvist
Komplexa tal inför Laborationerna
PICKit2 programmer-to-go
PC-teknik Repetition enligt önskemål som inkommit via mail. (täcker alltså inte alla moment i kursen)
23 August 2014 IS1200 Datorteknik vt09, föreläsning 10, (E och I mfl)1 IS1200 Datorteknik Föreläsning Processorkonstruktion 2. DMA, Direct Memory.
C-programmering ID120V William Sandqvist Länkad lista
Inkapsling.
Programmeringsteknik K och Media
Grundläggande programmering
Silberschatz, Galvin and Gagne ©2009 Operating System Concepts – 8 th Edition, Kapitel 13: I/O-system.
Programmering B PHP Lektion 2
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; }
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.
Tabeller.
Styrteknik: Programmering med MELSEC IL PLC2A:1
William Sandqvist C:s minnesmodell.
Grundläggande programmering
William Sandqvist Kodlåsmall lockmall.vhd William Sandqvist
1 Föreläsning 6 Programmeringsteknik och Matlab 2D1312/2D1305 Metoder & parametrar Array API och klassen ArrayList.
Styrteknik: MELSEC FX och numeriska värden PLC2C:1
William Sandqvist PIC PIC (Peripheral Interface Computer) är en datorkrets med ”allt i ett”. Prog Mem. Programminnet är 2048 instruktioner.
William Sandqvist Melodispelaren Denna demonstrationslaboration visar, steg för steg, hur man skriver ett kort program i programspråket.
INTRODUKTION TILL PROGRAMMERING
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 2 ( ) INNEHÅLL: -Variabler och datatyper -Tilldelning av variabler -Aritmetiska.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 3 ( ) INNEHÅLL: -Tabeller -Villkorssatser -Repetitionssatser.
31 March 2015IS1200 Datorteknik, förel 101 IS1200 Datorteknik Föreläsning Processorkonstruktion 2. DMA, Direct Memory Access 3. Byte-code i JAVA.
William Sandqvist C-programmering ID120V Stack och Kö William Sandqvist
31 March 2015 IS1200 Datorteknik ht2009 föreläsning 2, (D2)1 IS1200 Datorteknik Föreläsning 2 Vi bygger en processor Kursboken, valda delar av kapitel.
IS1200 Datorteknik Föreläsning CE F2 Vi bygger en processor Kursboken, delar av kapitel 7 31 March IS1200 Datorteknik föreläsning CE – F2.
Pipelining Föreläsning 4. T exe — CPU-exekveringstid I — Antalet exekverade instruktioner CPI — Genomsnittligt antal klockcykler per instruktion T c —
F. Drewes, Inst. f. datavetenskap1 Föreläsning 2: Variabler och datatyper Variabler Bindning Typkontroll Några viktiga datatyper.
Din rapport ? Beskriv din applikation.
William Sandqvist Melodispelaren Denna demonstrationslaboration visar, steg för steg, hur man skriver ett kort program i programspråket.
William Sandqvist ReadModifyWrite-problemet PORTB = 0; PORTB.0 = 1; PORTB = PORTB; Vilket värde har portpinnen RB1 nu ? Förmodligen ”1”,
2 April 2015 IS1200 Datorteknik o k, föreläsning CE - F31 IS1200 Datorteknik Föreläsning CE F3 Metoder / subrutiner Kursboken, delar av kapitel 4.
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.
Lennart Edblom & Frank Drewes, Inst. f. datavetenskap 1 Föreläsning 2: Variabler och datatyper Variabler Bindning Typkontroll Några viktiga datatyper.
22 April 2015IS1200 Datorteknik, föreläsning 11 IS1200 Datorteknik Föreläsning 1 Introduktion.
Kronljusströmställaren 0, 1, 2, 3
Anders Sjögren Data (i primärminnet) som en länkad lista datatypen för varje element i listan är en struktur, post ( struct )
6/3/2015© Mats Brorsson1 Hur mycket snabbare blir det med PC133 SDRAM jämfört med PC100 SDRAM?... blir det med en 1,4 GHz Athlon- processor jämfört.
Föreläsning 1 Introduktion till kursen. Algoritmer
William Sandqvist Övning 10 Processorkonstruktion med pipe-line.
1 Föreläsning 4 Metoder & parametrar Array API och klassen ArrayList.
1 2G1502 Datorteknik allmän kurs Föreläsning 3 Programmering med hopp Programmering av Nios.
14 July 2015 IS1200/2G1518 Datorteknik, föreläsning 2, ht2007 (D2)1 IS1200 Datorteknik Föreläsning 2 Vi bygger en processor Kursboken, valda delar av kapitel.
1 IS1200 Datorteknik, övning 4 Maskinnära programmering med C Förberedelser till hemlaboration 1.
30 July 2015 IS1200 Datorteknik föreläsning CE - F11 IS1200 Datorteknik Föreläsning CE F1 Computer Engineering Introduktion.
William Sandqvist Datorteknik övning 3 stackhantering subrutin som anropar subrutin programutveckling.
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.
15 August 2015 IS1200 Datorteknik föreläsning CE - F11 IS1200 Datorteknik Föreläsning CE F1 Computer Engineering Introduktion.
Enkel dator teknik Tips och tricks. Välja storlek och radavstånd Här väljer du storlek på texten vi vill att ni använder 14 p till rubriker och 12 p till.
Anders Sjögren Funktioner något in och något annat ut.
Python.
Närvaro
Grundläggande datavetenskap, 4p
Presentationens avskrift:

William Sandqvist william@kth.se Datorteknik övning 1 Introduktion till assemblerprogrammering av Nios II William Sandqvist william@kth.se

William Sandqvist william@kth.se Vecka 1 Vecka 2 ! Förstår ni dramatiken? Använd nu helgen! OBS! Öppet hus måndag 25/1 12-16 … William Sandqvist william@kth.se

William Sandqvist william@kth.se LAB 1 Nios2time Din uppgift blir att programmera en digitalklocka i Nios II – assembler! William Sandqvist william@kth.se

Nios II är en ”MIPS”-liknande softprocessor Blir över … Arkitekturen är gjord för att effektivt kunna utnyttja programerbar logik. Den största delen av det programmerbara logikchippet blir därför ”över”, och är ledig att användas till annat … Processorn och logiken kan ”skräddarsys” för tillämpningen genom specialiserad IO, hårdvaruacceleration mm. ( om detta lär man sig på skolans SoC-program ) William Sandqvist william@kth.se

Högnivåspråk (C) eller Assembler Assembler • Fixt antal register med fix storlek • En enkel operation per kodrad • Hoppinstruktioner för vilkor och repetition C eller annat högnivåspråk • Valfritt antal variabler med valfria storlekar • Uttryck med många operationer per rad • Blockstrukturer för vilkor och repetition Flödesdiagram - spaghettiprogram med GOTO … Strukturdiagram - strukturerad programmering med if else while … William Sandqvist william@kth.se

Programmerarens Datormodell Register 32 stycken register, 32 bitars Snabbt (CPU:n kan läsa två register på en klockcykel) Används för tillfälliga variabler Minne - Byte-organiserat, flera megabyte stort - Långsamt (access tar flera klockcykler) - Används till långlivade variabler William Sandqvist william@kth.se

1.1 Datorarkitektur för Nios II Studera assemblerprogrammerarens datormodell av Nios II. Vilka register finns i processorn och hur bör de disponeras? Hur stor är varje instruktion? Vad har programräknaren (program counter, PC) för funktion? Med vilket värde uppdateras programräknaren vid varje instruktionshämtning? William Sandqvist william@kth.se

William Sandqvist william@kth.se Registeranvändning Returvärde från funktion Funktionsparametrar William Sandqvist william@kth.se

Registeranvändning 0…15 ”Caller-saved” Använd som konstanten ”0”! Om Du anropar en funktion så har den rätt att använda dessa register – spara/skydda innan Du anropar! William Sandqvist william@kth.se

Registeranvändning 16…31 Callee-saved En anropad funktion kan bara använda dessa register om den först sparar/skyddar det tidigare register-innehållet och lägger tillbaks det vid retur Pekar ut stacken! Ett bra ställe i minnet att spara register-innehåll på. William Sandqvist william@kth.se

William Sandqvist william@kth.se Instruktioner William Sandqvist william@kth.se

1.2 Olika typer av assemblerinstruktioner Gruppering av instruktionerna Instruktioner för att kopiera information (utan att ändra den) från minne till register och omvänt. Instruktioner för att kopiera information (utan att ändra den) mellan register. Instruktioner för aritmetiska beräkningar med två värden. Instruktioner för logiska beräkningar med två värden. Instruktioner för att skifta eller rotera bitmönster i register. Instruktioner för jämförelse mellan två värden. Instruktioner för hopp, dvs ändring av programräknaren. Vilkorliga hoppinstruktioner, som bara ändrar programräknaren om värdena i ett eller två register uppfyller ett visst vilkor. LD ST MOV ADD SUB (MUL DIV) AND OR XOR SLL SRA SRL ROL ROR CMP_ _ _ JMP BR B_ _ _ William Sandqvist william@kth.se

William Sandqvist william@kth.se 1.3 Load och Store i Nios II Studera de Load och Store-instruktioner som finns i Nios II. Vilka operandutpekningsmetoder används? Vilken eller vilka storlekar på operander kan användas? Om 4 byte finns i minnet och kopieras till ett register, i vilken ordning placeras dessa 4 byte i registret? Vilken ordning används i motsatt riktning? Om 1 byte finns i minnet och kopieras till ett register, var i registret placeras denna byte? Vad händer med övriga bytes i registret? Om 1 byte kopieras från ett register till minnet, vad händer med övriga bytes i registret? William Sandqvist william@kth.se

William Sandqvist william@kth.se Load och Store Indexerad operandutpekning William Sandqvist william@kth.se

William Sandqvist william@kth.se Word: LDW STW William Sandqvist william@kth.se

William Sandqvist william@kth.se Byte: LDB och STB William Sandqvist william@kth.se

Kommer Du ihåg sign-extension? Negativt tal Positivt tal Om ett tal ”med tecken” ska kopieras från ett kort register (tex. 4 bitar) till ett längre register (tex. 8 bitar) gör man teckenutvidgning, signextension. Är talet positivt fyller man på med inledande 0:or är det negativt med inledande 1:or. William Sandqvist william@kth.se

William Sandqvist william@kth.se MOV MOV används när det gäller kopiering av värden mellan register. mov r8,r9 William Sandqvist william@kth.se

William Sandqvist william@kth.se 1.4 Add och Sub i Nios II Studera de varianter av Add och Sub-instruktioner som finns i Nios II. Vilka operandutpekningsmetoder används? Vilken/vilka storlekar på operanderna kan användas? Vilken/vilka talrepresentationer kan användas? William Sandqvist william@kth.se

William Sandqvist william@kth.se ADD och SUB  Register direct – operation mellan tre register R1=R2+R3 R1=R2-R3  Immediate operand – operation mellan två register och en konstant R1=R2+17 R1=R2-17 Konstanten 17 ”bakas in” i instruktionskoden som ett 16-bitarstal. Sign-extension till 32 bitar görs automatiskt när operationen utförs. William Sandqvist william@kth.se

William Sandqvist william@kth.se movi movi r8, 17 # talet 17 läggs i register r8 Konstanten 17 lagras inuti op-koden, där finns plats för ett maximalt 16-bitarstal. Konstanten teckenutvidgas till 32 bitar när den läggs i registret. Skall vi vara ärliga så finns det egentligen ingen movi-instruktion ( det är därför vi tar upp den här tillsammans med add ) … addi r8, r0, 17 # talet 17+0 läggs i register r8 William Sandqvist william@kth.se

1.6 Ett första assemblerprogram - rak kod med Load och Store C-kod: int a; int b; int c; c = a + b; William Sandqvist william@kth.se

William Sandqvist william@kth.se Minnesmodell Minnet är uppdelat i olika minnessegment. .text segmentet innehåller instruktionerna. .data segmentet innehåller (globala) variabler stack och heap, två ”högar” som Du stöter på senare i kursen … William Sandqvist william@kth.se

Deklarationer av variabler C-deklarationerna: Assemblerprogram: int a; int b; int c; .data .align 2 a: .word 0 b: .word 0 c: .word 0 i minnets datasegment avstånd 22 = 4 byte, align word tre ”label” (etiketter) symboliska namn på minnesadresser innehållet 0-ställs William Sandqvist william@kth.se

Pseudoinstruktionen movia En minnesadress är 32 bitar. Med movi kan man införa en 16-bitskonstant till sitt program, men hur gör man med en ”adress” som ju kan vara 32 unika bitar lång? Skriver man movia så delar assemblatorn upp 32-bitarskonstanten till två 16-bitars konstanter och placerar dessa inuti två (fiffiga) instruktioner efter varandra. .text .align 2; movia r8, a ldw r9, 0(r8) movia r8, b ldw r10, 0(r8) placering i text (code) - minnessegmentet avstånd 22 = 4 byte, align instructions lägg adressen till a i r8. (blir till två instr.) lägg variabeln a i register r9 samma för variabeln b och register r10 William Sandqvist william@kth.se

William Sandqvist william@kth.se c = a + b; add r11, r9, r10 # addera a och b movia r8, c # hämta c’s adress stw r11, 0(r8) # lagra svaret i c # ”#” betyder kommentar Nios II är en ”registerrik” processor. Man kan ofta använda ett nytt register för varje ny variabel, och behöver inte omedelbart ”återanvända” de register som inte längre används. William Sandqvist william@kth.se

William Sandqvist william@kth.se

William Sandqvist william@kth.se 1.6 CMP i Nios II Studera de varianter av CMP-instruktioner som finns i Nios II. Hur fungerar de? William Sandqvist william@kth.se

William Sandqvist william@kth.se Compare > Komihågtips! cmpgt r8,r9,r10 # R8=1 om R9>R10, R8=0 om R9<=R10 Likhet och olikhet, samma instruktioner för tal med eller utan tecken. == cmpeq != cmpne För ”större än” och ”mindre än” behövs det olika instruktioner för tal med tecken eller teckenlösa tal. u = unsigned > cmpgtu < cmpltu >= cmpgeu =< cmpleu > cmpgt < cmplt >= cmpge =< cmple William Sandqvist william@kth.se

William Sandqvist william@kth.se Compare-instruktionen finns med för att man skall kunna utvärdera komplexa vilkorsuttryck utan att behöva göra programhopp. (Man vill undvika programhopp med dagens datorarkitekturer som ofta har lång pipeline). ex. på ett komplext vilkorsuttryck if(x==y&&(z<1||w>7)) Compare-instruktionerna finns också som immediate-operand. == cmpeqi != cmpnei Det finns compare-instruktioner för alla C-språkets vilkorsuttryck. osv. cmpeqi r8, r9, 17 William Sandqvist william@kth.se

1.7 Ovillkorliga hopp i Nios II Studera instruktionerna BR och JMP. Hur fungerar de? Vilka operandutpekningsmetoder kan användas? William Sandqvist william@kth.se

William Sandqvist william@kth.se hopp i programmet label1: movia r8, label3 jmp r8 ... label2: ... br label2 label3: ... absolut hoppadress i register -12 självrelativ offsetadress inuti br in-struktionen. Kompilatorn beräknar denna  offset Här backar vi tre instruktioner, 12 byteadresser från PC. (PC ökades automatiskt med 4 byteadresser i samband med att instruktionen lästes, så avståndet till label2 är två instruktioner, 8 byteadresser). William Sandqvist william@kth.se

1.8 Villkorliga hopp i Nios II Studera de villkorliga hoppinstruktioner som finns i Nios II. Hur fungerar de? Vilken operandutpekningsmetod används? William Sandqvist william@kth.se

William Sandqvist william@kth.se Vilkorliga hopp beq r8, r9, label1 Det finns branch-instruktioner för alla C-språkets vilkorsuttryck. En del av hoppinstruktionerna är pseudoinstruktioner bge r8, r9, label översätts i verkligheten som ble r9, r8, label och det blir ju samma sak! Det kan inte finnas några immediate branch-instruktioner eftersom det är hopp-offset som bakas in i instruktionen, det finns då ingen plats för någon annan konstant. William Sandqvist william@kth.se

1.9 Ett program med vilkorligt hopp C-kod: int a; int b; int c; if (a == b) /* then */ c = 17; else c = 4711; William Sandqvist william@kth.se

William Sandqvist william@kth.se Flödesschema William Sandqvist william@kth.se

William Sandqvist william@kth.se Deklarationer Som vanligt … C-deklarationer: Assemblerprogram: int a; int b; int c; .data .align 2 a: .word 0 b: .word 0 c: .word 0 William Sandqvist william@kth.se

a) Utan att använda cmp-instruktion if (a == b) /* then */ c = 17; else c = 4711; Metod: skriv C-kod som direkt kan översättas till assembler. if(!) goto else_part; then_part; eftersom hoppet sker till else_part måste vi ”vända på” vilkoret! Modifierad C-kod: Assemblerkod: .text .align 2 movia r8, a ldw r9, 0(r8) ldw r10, 4(r8) bne r9, r10, else_part then_part: movi r11, 17 br after else_part: movi r11, 4711 after: stw r11, 8(r8) if(a != b) goto else_part; then_part: c = 17; goto after; else_part: c = 4711; after: William Sandqvist william@kth.se

Kommentera assemblerkoden .text .align 2 movia r8, a # a:s globala adress i R8 ldw r9, 0(r8) # variabel a i R9 ldw r10, 4(r8) # variabel b i R10 bne r9, r10, else_part # om a != b hoppa till else_part then_part: movi r11, 17 # variabel c = 17 i R11 br after # ovillkorligt hopp till after else_part: movi r11, 4711 # variabel c = 4711 i R11 after: stw r11, 8(r8) # variabel c lagras globalt Eftersom a b och c ligger i en följd i dataminnet kan vi kan vi referera b och c med offset 4 och 8 från a när vi gör ldw och stw! William Sandqvist william@kth.se

b) Använd cmp-instruktion Utan compare: Med compare: bne r9, r10, else_part cmpeq r12, r9, r10 beq r12, r0, else_part Med en extra compare-instruktion slipper man ”vända” på vilkoret. Hoppet utförs sedan med beq som jämför med 0 i R0! .text .align 2 movia r8, a ldw r9, 0(r8) ldw r10, 4(r8) bne r9, r10, else_part then_part: movi r11, 17 br after else_part: movi r11, 4711 after: stw r11, 8(r8) .text .align 2 movia r8, a ldw r9, 0(r8) ldw r10, 4(r8) cmpeq r12, r9, r10 beq r12, r0, else_part then_part: movi r11, 17 br after else_part: movi r11, 4711 after: stw r11, 8(r8) William Sandqvist william@kth.se

1.10 Ett program med slinga (loop) int n; int sum; int i; for (i = 1; i <= n; i++ ) sum+=i; William Sandqvist william@kth.se

Översätt till den enklare while-slingan sum = 0; for (i = 1; i <= n; i++ ) sum+=i; sum = 0; i = 1; while (i <= n) { sum+=i; i++; } William Sandqvist william@kth.se

William Sandqvist william@kth.se Översätt till if-goto Slingans ”fortsättningsvilkor” byts mot ett ”avbrottsvilkor” sum = 0; i = 1; start_loop: if(i > n) goto end_loop; sum+=i; i++; goto start_loop; end_loop: sum = 0; i = 1; while (i <= n) { sum+=i; i++; } William Sandqvist william@kth.se

William Sandqvist william@kth.se Deklarationerna C-deklarationerna: Assemblerprogram: int n; int sum; int i; .data .align 2 n: .word 0 sum: .word 0 i: .word 0 William Sandqvist william@kth.se

Översätt till assemblerkod William Sandqvist william@kth.se

William Sandqvist william@kth.se Kommenterad kod William Sandqvist william@kth.se

Snabbare program ”register” Om man inte tänker göra något ”break” ut ur loopen så behöver man inte lagra mellanvariablerna i minnet varje varv. Minnesacess tar många klockcykler! C-program kan kompileras med olika optimeringsinställningar: -O, -O0, -O1, -O2, -O3, -Os Placering av variabler i register är en vanlig optimeringsåtgärd. William Sandqvist william@kth.se