Ladda ner presentationen
Presentation laddar. Vänta.
Publicerades avPernilla Gustafsson
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
Liknande presentationer
© 2024 SlidePlayer.se Inc.
All rights reserved.