1 / 47

Datorteknik övning 1

Datorteknik övning 1. Introduktion till assemblerprogrammering av Nios II. Vecka 1. Vecka 2 !. Förstår ni dramatiken?. Använd nu helgen! OBS! Öppet hus måndag 25/1 12-16 …. LAB 1 Nios2time. Din uppgift blir att programmera en digitalklocka i Nios II – assembler!. Blir över ….

sumi
Download Presentation

Datorteknik övning 1

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  2. 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

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

  4. Blir över … 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 ) William Sandqvist william@kth.se

  5. 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- spaghettiprogrammed GOTO … Strukturdiagram- strukturerad programmeringmed if elsewhile … William Sandqvist william@kth.se

  6. 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

  7. 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

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

  9. Använd som konstanten ”0”! 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! William Sandqvist william@kth.se

  10. Pekar ut stacken! Ett bra ställei minnet att spara register-innehåll på. Registeranvändning 16…31Callee-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 William Sandqvist william@kth.se

  11. Instruktioner William Sandqvist william@kth.se

  12. 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

  13. 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

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

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

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

  17. Positivt tal Negativt tal 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. William Sandqvist william@kth.se

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

  19. 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

  20. ADD och SUB  Register direct– operation mellan tre registerR1=R2+R3 R1=R2-R3  Immediate operand – operation mellan två register och en konstantR1=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

  21. 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

  22. 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

  23. 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

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

  25. 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. placering i text (code) - minnessegmentet .text.align 2;movia r8, aldw r9, 0(r8)movia r8, bldw r10, 0(r8) 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

  26. c = a + b; add r11, r9, r10 # addera a och b movia r8, c # hämta c’s adressstw 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

  27. William Sandqvist william@kth.se

  28. 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

  29. Komihågtips! > Compare cmpgt r8,r9,r10 # R8=1 om R9>R10, R8=0 om R9<=R10 ==cmpeq !=cmpne 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 >cmpgtu <cmpltu >=cmpgeu =<cmpleu >cmpgt <cmplt >=cmpge =<cmple William Sandqvist william@kth.se

  30. 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. Det finns compare-instruktioner för alla C-språkets vilkorsuttryck. ==cmpeqi !=cmpnei osv. cmpeqi r8, r9, 17 William Sandqvist william@kth.se

  31. 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

  32. hopp i programmet label1: movia r8, label3 jmp r8 ...label2: ... br label2label3: ... absolut hoppadressi register -12 självrelativoffsetadress 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

  33. 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

  34. Vilkorliga hopp beq r8, r9, label1 Det finns branch-instruktioner för alla C-språkets vilkorsuttryck. En del av hoppinstruktionerna är pseudoinstruktionerbge r8, r9, label översätts i verkligheten som ble r9, r8, labeloch 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

  35. 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

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

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

  38. 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 2movia r8, aldw r9, 0(r8)ldw r10, 4(r8)bne r9, r10, else_partthen_part: movi r11, 17br afterelse_part: movi r11, 4711after: 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

  39. Kommentera assemblerkoden .text.align 2movia r8, a # a:s globala adress i R8ldw r9, 0(r8) # variabel a i R9ldw r10, 4(r8) # variabel b i R10bne r9, r10, else_part # om a != b hoppa till else_partthen_part: movi r11, 17 # variabel c = 17 i R11br after # ovillkorligt hopp till afterelse_part: movi r11, 4711 # variabel c = 4711 i R11after: stw r11, 8(r8) # variabel c lagras globalt Eftersom ab 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

  40. b) Använd cmp-instruktion Utan compare: Med compare: cmpeq r12, r9, r10beq r12, r0, else_part bne r9, r10, 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 2movia r8, aldw r9, 0(r8)ldw r10, 4(r8)bne r9, r10, else_partthen_part: movi r11, 17br afterelse_part: movi r11, 4711after: stw r11, 8(r8) .text.align 2movia r8, aldw r9, 0(r8)ldw r10, 4(r8)cmpeq r12, r9, r10beq r12, r0, else_partthen_part: movi r11, 17br afterelse_part: movi r11, 4711after: stw r11, 8(r8) William Sandqvist william@kth.se

  41. 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

  42. Ö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

  43. Ö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

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

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

  46. Kommenterad kod William Sandqvist william@kth.se

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

More Related