Presentation laddar. Vänta.

Presentation laddar. Vänta.

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

Liknande presentationer


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

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

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

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

4 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

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 - spaghettiprogram med GOTO … Strukturdiagram - strukturerad programmering med if else while … William Sandqvist

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

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

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

9 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

10 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

11 William Sandqvist william@kth.se
Instruktioner William Sandqvist

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

13 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

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

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

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

17 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

18 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

19 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

20 William Sandqvist william@kth.se
ADD och SUB  Register direct – operation mellan tre register R1=R2+R R1=R2-R3  Immediate operand – operation mellan två register och en konstant R1=R 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

21 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

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

23 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

24 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

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

26 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

27 William Sandqvist william@kth.se

28 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

29 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

30 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

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

32 William Sandqvist william@kth.se
hopp i programmet label1: movia r8, label jmp r 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

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

34 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

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

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

37 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

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

39 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, # variabel c = 17 i R11 br after # ovillkorligt hopp till after else_part: movi r11, # 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

40 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

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

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

43 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

44 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

45 Översätt till assemblerkod
William Sandqvist

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

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


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

Liknande presentationer


Google-annonser