Presentation laddar. Vänta.

Presentation laddar. Vänta.

William Sandqvist Datorteknik övning 1 Introduktion till assemblerprogrammering av Nios II.

Liknande presentationer


En presentation över ämnet: "William Sandqvist Datorteknik övning 1 Introduktion till assemblerprogrammering av Nios II."— Presentationens avskrift:

1 William Sandqvist Datorteknik övning 1 Introduktion till assemblerprogrammering av Nios II

2 William Sandqvist Vecka 1 Vecka 2 ! Förstår ni dramatiken? Använd nu helgen! OBS! Öppet hus måndag 25/ …

3 William Sandqvist LAB 1 Nios2time Din uppgift blir att programmera en digitalklocka i Nios II – assembler!

4 William Sandqvist Nios II är en ”MIPS”-liknande softprocessor 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 ) Blir över …

5 William Sandqvist 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 …

6 William Sandqvist 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

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

8 William Sandqvist Registeranvändning Funktionsparametrar Returvärde från funktion

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

10 William Sandqvist 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å.

11 William Sandqvist Instruktioner

12 William Sandqvist 1.2 Olika typer av assemblerinstruktioner Gruppering av instruktionerna a)Instruktioner för att kopiera information (utan att ändra den) från minne till register och omvänt. b)Instruktioner för att kopiera information (utan att ändra den) mellan register. c)Instruktioner för aritmetiska beräkningar med två värden. d)Instruktioner för logiska beräkningar med två värden. e)Instruktioner för att skifta eller rotera bitmönster i register. f)Instruktioner för jämförelse mellan två värden. g)Instruktioner för hopp, dvs ändring av programräknaren. h)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 JMP BR B_ _ _ CMP_ _ _

13 William Sandqvist 1.3 Load och Store i Nios II Studera de Load och Store-instruktioner som finns i Nios II. a)Vilka operandutpekningsmetoder används? b)Vilken eller vilka storlekar på operander kan användas? c)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? d)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? e)Om 1 byte kopieras från ett register till minnet, vad händer med övriga bytes i registret?

14 William Sandqvist Load och Store Indexerad operandutpekning

15 William Sandqvist Word: LDW STW

16 William Sandqvist Byte: LDB och STB

17 William Sandqvist Kommer Du ihåg sign-extension? 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. Negativt tal Positivt tal

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

19 William Sandqvist 1.4 Add och Sub i Nios II Studera de varianter av Add och Sub-instruktioner som finns i Nios II. a)Vilka operandutpekningsmetoder används? b)Vilken/vilka storlekar på operanderna kan användas? c)Vilken/vilka talrepresentationer kan användas?

20 William Sandqvist ADD och SUB Konstanten 17 ”bakas in” i instruktionskoden som ett 16-bitarstal. Sign-extension till 32 bitar görs automatiskt när operationen utförs.  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

21 William Sandqvist 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. addi r8, r0, 17 # talet 17+0 läggs i register r8 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 ) …

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

23 William Sandqvist 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 …

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

25 William Sandqvist 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 2 2 = 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

26 William Sandqvist 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 c = a + b; 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.

27 William Sandqvist

28 1.6 CMP i Nios II Studera de varianter av CMP-instruktioner som finns i Nios II. Hur fungerar de?

29 William Sandqvist Compare == cmpeq != cmpne >= cmpgeu =< cmpleu > cmpgtu < cmpltu >= cmpge =< cmple > cmpgt < cmplt 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. För ”större än” och ”mindre än” behövs det olika instruktioner för tal med tecken eller teckenlösa tal. u = unsigned > Komihågtips!

30 William Sandqvist 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 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

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

32 William Sandqvist hopp i programmet label1: movia r8, label3 jmp r8... label2:... br label2 label3:... absolut hoppadress i register självrelativ offsetadress inuti br in- struktionen. Kompilatorn beräknar denna  offset -12 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).

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

34 William Sandqvist 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.

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

36 William Sandqvist Flödesschema

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

38 William Sandqvist a) Utan att använda cmp-instruktion 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! if (a == b) /* then */ c = 17; else c = 4711; if(a != b) goto else_part; then_part: c = 17; goto after; else_part: c = 4711; after:.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) Modifierad C-kod: Assemblerkod:

39 William Sandqvist 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 !

40 William Sandqvist b) Använd cmp-instruktion.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) bne r9, r10, else_part cmpeq r12, r9, r10 beq r12, r0, else_part Utan compare:Med compare: 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!

41 William Sandqvist 1.10 Ett program med slinga (loop) int n; int sum; int i; for (i = 1; i <= n; i++ ) sum+=i;

42 William Sandqvist Ö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++; }

43 William Sandqvist Översätt till if-goto 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++; } Slingans ”fortsättningsvilkor” byts mot ett ”avbrottsvilkor”

44 William Sandqvist Deklarationerna int n; int sum; int i;.data.align 2 n:.word 0 sum:.word 0 i:.word 0 C-deklarationerna:Assemblerprogram:

45 William Sandqvist Översätt till assemblerkod

46 William Sandqvist Kommenterad kod

47 William Sandqvist 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.


Ladda ner ppt "William Sandqvist Datorteknik övning 1 Introduktion till assemblerprogrammering av Nios II."

Liknande presentationer


Google-annonser