CE_O1. Nios II. Enkla assembler-instruktioner.



Relevanta dokument
CE_O2. Nios II. Subrutiner med mera.

IS1200 Datorteknik. Övning CE_O4 Maskinnära programmering med C Förberedelser till hemlaboration 1

Övning1 Datorteknik, HH vt12 - Talsystem, logik, minne, instruktioner, assembler

Att använda pekare i. C-kod

Grunderna i stegkodsprogrammering

Elektroteknik MF1016 föreläsning 9 MF1017 föreläsning 7 Mikrodatorteknik

Lösningar till tentamen i EIT070 Datorteknik

Assemblerprogrammering för ARM del 2

Stack och subrutiner Programmeringskonventionen

Tentamen. Datorteknik Y, TSEA28

CE_O3. Nios II. Inför lab nios2time

c a OP b Digitalteknik och Datorarkitektur 5hp ALU Design Principle 1 - Simplicity favors regularity add $15, $8, $11

Extra lab. Nu på fredag kl 8-12 Frivillig Enbart hjälp med projektuppgiften Ingen examination

Institutionen för datavetenskap 2014/15

I denna laboration undersöker vi hur aritmetiska beräkningar utförs. Vi tittar på olika variabeltyper: 8-bitars, 16-bitars, 32-bitars och flyttal.

F4: Assemblerprogrammering

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

Tentamen. Datorteknik Y, TSEA28

Tentamen. Datorteknik Y, TSEA28

Datorsystem Laboration 2: Minnesmappade bussar

7) Beskriv tre sätt att överföra parametrar mellan huvudprogram och subrutin.

Digital- och datorteknik

4. Maskinnära programmering i C. Förberedelser till hemlaboration 1.

Digital- och datorteknik

Tentamen. Datorteknik Y, TSEA28

Tentamen. Datorteknik Y, TSEA28

Övningsuppgifterna i kapitel F avser FLIS-processorn, vars instruktioner och motsvarande koder definieras i INSTRUKTIONSLISTA FÖR FLISP.

Programmerbar logik. Kapitel 4

Lösningar till tentamen i EIT070 Datorteknik

Digitala System: Datorteknik ERIK LARSSON

DatorsystemteknikDAVA14 Föreläsning 9

Styrenheten styrsignalsekvenser programflödeskontroll

Per Holm Lågnivåprogrammering 2014/15 24 / 177. int och double = = 2, 147, 483, 647

Föreläsning 6: Introduktion av listor

CPU. Carry/Borrow IX. Programräknare

Institutionen för elektro- och informationsteknologi, LTH

Datorteknik. Föreläsning 2. Programmering i C och assembler MIPS instruktionsarkitektur. Institutionen för elektro- och informationsteknologi, LTH

Tentamen. Datorteknik Y, TSEA28

A-del motsvarande KS1

Programexempel för FLEX

Datorsystemteknik D. Lösningar till tentamen i kursen EDA330 14/1 2000

Programmeringsteknik med C och Matlab

Digital- och datorteknik

Styrteknik: MELSEC FX och numeriska värden

CE_O3. Nios II. Stackhantering och förberedelse för lab nios2time

Tentamen Datorteknik Y, TSEA28 Datum

Lågnivåprogrammering. Föreläsning 2 Lågnivåprogrammering. Binära tal. En enkel modell av datorns inre

Mål. Datorteknik. Innehåll. Vad händer med en add-instruktion? Vad händer med en add-instruktion. Instruktioner som bitmönster i minnet

Datorsystemteknik DVGA03 Föreläsning 8

Digital- och datorteknik

Mål. Datorteknik. Innehåll. Innehåll (forts) Hur ser ett program ut? Hur skapas maskinkoden?

Grundläggande datavetenskap, 4p

Tentamen (Exempel) Datorteknik Y, TSEA28

SVAR TILL TENTAMEN I DATORSYSTEM, VT2013

CE_O5. Cacheminne. Hemlaboration 2.

Tentamen. Datorteknik Y, TSEA28

Inledande programmering med C# (1DV402) 27+15=42 1 (22)

Tentamen. Datorteknik Y, TSEA28

Tentamen (Exempel) Datorteknik Y, TSEA28

IS1500 Lösningar övning CE_O CE_O7. Programmerad in/utmatning. Serieport. Förberedelser till nios2io.

Föreläsning 1 & 2 INTRODUKTION

Institutionen för elektro- och informationsteknologi, LTH

Datorteknik. Föreläsning 3. Assembler, stack och subrutiner, programmeringskonventionen. Institutionen för elektro- och informationsteknologi, LTH

Digital Aritmetik Unsigned Integers Signed Integers"

Övning 7. Timer, serieport

Klassdeklaration. Metoddeklaration. Parameteröverföring

Vad bör göras? Steg 1. RISC => pipelining. Parallellism. Pipelining. Nya LDA 13. RISC(reduced instruction set computer) Öka klockfrekvensen

Lösningar till tentamen i EIT070 Datorteknik

Programmering A. Johan Eliasson

Lösningar till övning CE_O CE_O6. Parallell in/utmatning (I/O). Förberedelser till laboration nios2io.

Objektorienterad programmering D2

1 Texthantering. 1.1 Typen char. Exempel, skriv ut alfabetet

Digital- och datorteknik

F2: Motorola Arkitektur. Assembler vs. Maskinkod Exekvering av instruktioner i Instruktionsformat MOVE instruktionen

Tentamen. Datorteknik Y, TSEA28

Övning 6. Parallellport, timer

General Purpose registers ALU I T H S V N Z C SREG. Antag att vi behöver skriva in talet 25 till register R18

PC-teknik, 5 p LABORATION ASSEMBLERINTRODUKTION

Datorteknik. Föreläsning 6. Processorns uppbyggnad, pipelining. Institutionen för elektro- och informationsteknologi, LTH. Mål

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

SMD 134 Objektorienterad programmering

Assemblerprogrammering för ARM del 1

Datorsystem. Tentamen

a), c), e) och g) är olikheter. Av dem har c) och g) sanningsvärdet 1.

Uppgift (poäng) 1 (2) 2 (3) 3 (4) 4 (4) 5 (3) 6 (4) 7 (6) 8 (6) 9 (8) Summa

16 Programmering TI -86 F1 F2 F3 F4 F5 M1 M2 M3 M4 M5

Tenta i Digitalteknik

Tentamen i EIT070 Datorteknik

Tentamen i Digitala system - EITA15 15hp varav denna tentamen 4,5hp

Tentamen Datorteknik Y, TSEA28 Datum TER2, TER4, TERE Tid 14-18

Föreläsning 4: Poster

Föreläsningsanteckningar 3. Mikroprogrammering II

Tentamen OOP

Tentamen (Exempel) Datorteknik Y, TSEA28

0.1. INTRODUKTION Instruktionens opcode decodas till en språknivå som är förstålig för ALUn.

Kontrollskrivning Mikrodatorteknik CDT S2-704

Omtentamen i CDT204 - Datorarkitektur

LEU240 Mikrodatorsystem

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

Transkript:

IS1500 ösningsförslag till övning CE_O1 2014 CE_O1. Nios II. Enkla assembler-instruktioner. 1.1. Datorarkitektur för Nios II a) Tabell 3 1 i Nios II Processor Reference Handbook visar processorns register: Register r0 innehåller alltid noll. Register r1 får inte användas kompilatorn använder det vid en del optimeringar. Register r2 r7 och r31 används vid funktionsanrop (även kallade metodanrop eller subrutinanrop) som behandlas på en senare övning. Register r8 r15 får ändras fritt av program. Register r16 r23 får ändras, om det tidigare innehållet först sparas (och sedan återställs). Detta behandlas på övningen om funktionsanrop. Register r24 och r29 får inte användas, utom vid avbrott (interrupts) som behandlas på en senare övning. Register r25 och r30 får inte användas, de används av debuggern. Register r26 och r28 får inte ändras, de används av kompilatorn för läsning och skrivning av globala och lokala variabler. Register r27 är stackpekare och behandlas på en senare övning. b) I Nios II är en instruktion alltid 32 bit (4 byte). ösningsförslag till övning CE_O1, sida 1 (av 10) 2014-08-29

c) Programräknaren innehåller adressen till nästa instruktion som ska hämtas och utföras. d) När en instruktion har hämtats så ökas innehållet i programräknaren med 4, så att dess värde anger adressen till nästa instruktion som ännu inte har hämtats. Viktigt: det räcker inte att öka programräknarvärdet med 1, eftersom varje instruktion är 4 byte lång. 1.2. Olika grundtyper av assemblerinstruktioner a) Instruktioner för att kopiera information utan att ändra den, från minne till register eller omvänt: load (ld) och store (st) i olika varianter. b) Instruktioner för att kopiera information utan att ändra den, från ett register till ett annat: det finns bara en, mov. c) Instruktioner för att göra en aritmetisk eller logisk beräkning på två värden: artimetiska instruktioner är add, sub, mul och div, i olika varianter, d) Instruktioner för logiska beräkningar är and, or, xor och nor i olika varianter. e) Instruktioner för att skifta eller rotera bitmönstret i ett register: sll, sra, srl, rol och ror i olika varianter. f) Instruktioner för jämförelse av två värden: cmp i olika varianter. g) Instruktioner för hopp, det vill säga ändringar av programräknaren: jmp och br. Viktigt: instruktionen jmpi finns inte i den version av Nios II som används på laborationerna. h) Villkorliga hoppinstruktioner, som bara ändrar programräknaren om värdena i ett eller två register uppfyller ett visst villkor: dessa instruktioner heter b följt av två eller tre bokstäver som anger villkoret. 1.3. oad och Store i processorn Nios II a) Operandutpekningsmetoden för oad och Store i Nios II är alltid följande. Innehållet i ett register och ett konstant värde som finns i en del av instruktionen adderas. Det konstanta värdet kan vara både positivt och negativt. Resultatet av additionen används som minnesadress. Denna operandutpekningsmetod kallas vanligtvis indexerad eller basrelativ. b) Operandstorlek: vanligast är 4 byte (ett "word" i Nios II) ldw och stw. Andra möjligheter är 2 byte (ett "halfword") ldh och sth samt 1 byte, ldb och stb. ösningsförslag till övning CE_O1, sida 2 (av 10) 2014-08-29

c) Om 4 byte finns minnet och kopieras till ett register så sker kopieringen enligt figuren här till höger. I Nios II kopieras alltså den byte som finns närmast adress 0 i minnet till den minst signifikanta delen av registret. Vid kopiering åt andra hållet placeras den byte som finns i den minst signifikanta delen av registret närmast adress 0 i minnet, så att Store-operationen är symmetrisk med oad-operationen. Se figuren här nedanför. register r0 (zero) r1 ett ord r31 ctl0 (status)... ctl5 (cpuid) program counter stw r8,0(r9) cell 0 cell 1 cell 2 cell 3 cell 4 minne ett ord d) Om 1 byte finns i minnet och kopieras till ett register, så placeras denna byte i den minst signifikanta delen av registret. Alla de övriga bitarna i registret ändras också. När instruktionen ldbu används sätts alla de övriga bitarna i registret till noll. Används i stället instruktionen ldb så sätts de övriga bitarna till samma värde som den mest signifikanta biten i den byte som hämtats. Detta kallas sign extension. Se figuren till höger. register r0 (zero) e) Om 1 byte kopieras från ett register till minnet med instruktionen stb, så ignoreras övriga bytes i registret. Bara den minst signifikanta byten i registret kopieras till minnet. Endast 1 byte skrivs till minnet. r1 ett ord r31 ctl0 (status)... ctl5 (cpuid) program counter register r0 (zero) r1 sign extension r31 ctl0 (status)... ctl5 (cpuid) en byte program counter ldw r8,0(r9) ldb r8,0(r9) cell 0 cell 1 cell 2 cell 3 cell 4 cell 0 cell 1 cell 2 cell 3 cell 4 minne ett ord minne en byte ösningsförslag till övning CE_O1, sida 3 (av 10) 2014-08-29

1.4. Add och Sub i Nios II a) Operandutpekningsmetoder: add, sub, mul, div och divu har alla operander i register. För addi, subi och muli är den ena källoperanden konstant och finns i en del av instruktionen. b) Endast en storlek på operanderna är möjlig 4 byte (32 bit). c) Möjliga talrepresentationer är heltal med och utan teckenbit. Utan teckenbit är talområdet från 0 till 2 32 1; med teckenbit är talområdet från (2 31 ) till +(2 31 1). Instruktionerna är definierade så att skillnaden mellan signed och unsigned bara påverkar division, som finns i två varianter (div och divu). 1.5. Ett första assemblerprogram rak kod med oad och Store Deklarationerna int a; int b; int c; översätts till.data # anger att variabeldeklarationer kommer efter.data.align 2 # behövs för att ett word ska hamna på en giltig adress a:.word 0 # reserverar plats för ett word (4 byte) med innehållet 0 b:.word 0 c:.word 0 Programraden c = a + b; översätts sedan till.text # anger att programkod kommer efter.text.align 2 # behövs för att en instruktion ska hamna på en giltig adress movia r8,a # lägg adressen till variabeln a i r8 ldw r9,0(r8) # läs innehållet i variabeln a från minnet, lägg värdet i r9 movia r8,b # lägg adressen till variabeln b i r8 ldw r10,0(r8) # läs innehållet i variabeln b från minnet, lägg värdet i r10 add r11,r10,r9 # addera innehållen i variablerna a och b movia r8,c # lägg adressen till variabeln c i r8 stw r11,0(r8) # skriv summan till variabeln c i minnet I Nios-II-assembler innebär tecknet # att det som står på resten av raden är kommentar. ösningsförslag till övning CE_O1, sida 4 (av 10) 2014-08-29

1.6. CMP i Nios II Följande CMP-instruktioner finns (CMP står för CoMPare): cmpeq cmpne cmpge cmpgeu cmpgt cmpgtu cmple cmpleu cmplt cmpltu cmpeqi cmpnei cmpgei cmpgeui cmpgti cmpgtui cmplei cmpleui cmplti cmpltui CMP sätter destinationsregistret till 1 om villkoret är uppfyllt, och till 0 om villkoret inte är uppfyllt. Villkoret anges i assemblerspråket av bokstavskombinationen efter "cmp" (i binärkoden har olika CMP-instruktioner olika operationskoder). Resultatet av jämförelsen lagras alltså som Sant (1) eller Falskt (0) i destinationsregistret. Innehållet i det registret kan användas som villkor i en efterföljande villkorlig hoppinstruktion, eller som källoperand till andra CMP-instruktioner. Det senare kan behövas för att beräkna komplicerade villkor. En minnesregel för att koppla rätt CMP-instruktion till rätt villkor i assemblerspråket för Nios II är att sätta bokstavskombinationen för villkoret mellan de två källoperanderna och sedan läsa ut resultatet. Exempel: tänk på CMPGE r1,r2,r3 som CMP r1, r2 GE r3; läs sedan ut villkoret: "r2 Greater or Equal to r3". Så här läses villkoren: EQ EQual to, NE Not Equal to, GE Greater than or Equal to, GT Greater Than, E ess than or Equal, T ess Than. Vissa villkor finns med och utan "U". "U" står här för "Unsigned", som innebär att mest signifikanta biten tolkas som en "vanlig" bitposition och inte som teckenbit. Ett exempel: CMPGTU tolkar 1111 1111 1111 1111 1111 1111 1111 1111 som +4 miljarder, vilket är större än 0000 0000 0000 0000 0000 0000 0000 0001 (som förstås är talet +1). Instruktionen CMPGT utan "U" tolkar 1111 1111 1111 1111 1111 1111 1111 1111 som 1 (talet "minus 1") vilket är mindre än +1 (som förstås fortfarande skrivs som 0000 0000 0000 0000 0000 0000 0000 0001). Tips! Tänk efter (vid behov) och svara på: varför finns inte villkoren EQ och NE i Unsigned-versioner? Varje CMP-instruktioner finns också i varianter med och utan "I". "I" står som vanligt för "Immediate" och anger att den högra källoperanden är en konstant som finns i instruktionens binärkod. Konstanten i Immediate-fältet anges med 16 bitar. Vid jämförelse unsigned utvidgas dessa 16 bitar med 16 inledande nollor. Vid jämförelse utan U görs sign extension från 16 till 32 bitar. Effekten av dessa åtgärder är att den uppkomna 32 bitars koden alltid motsvarar samma värde som de 16 bitarna i Immediate-fältet. I MIPS finns samma/liknande instruktioner men de benämns Set on Condition. Funktionen är ju att ett register SÄTTS till TRUE eller FASE beroende på om ett villkor (Condition) är uppfyllt vid jämförelse mellan två värden. ösningsförslag till övning CE_O1, sida 5 (av 10) 2014-08-29

1.7. Ovillkorliga hopp i Nios II Instruktionerna BR och JMP beräknar en adress, som sedan skrivs till programräknaren. Det gör att nästa instruktion hämtas från den plats i minnet som den beräknade adressen anger. Instruktionen JMP har en källoperand som ska finnas i ett register. Innehållet i källregistret kopieras oförändrat till programräknaren. Instruktionen BR adderar ett konstant tal till programräknarens aktuella värde. Det konstanta talet finns i själva BR-instruktionen och kan vara både positivt och negativt. Positiva tal ger hopp framåt, och negativa tal ger hopp bakåt i programmet. Talet anges med 16 bitar. Eftersom programräknaren uppdateras i varje hämtfas för att peka på nästa instruktion adderas det konstanta talet med adressen till instruktionen omedelbart efter BR-instruktionen. 1.8. Villkorliga hopp i Nios II Följande villkorliga hoppinstruktioner finns: beq bne bge bgeu bgt bgtu ble bleu blt bltu De villkorliga hoppinstruktionerna kan beräkna samma slags villkor som CMP-instruktionerna. Om villkoret är uppfyllt så tas hoppet (programräknaren ändras), annars fortsätter programkörningen med den instruktion som ligger närmast efter den villkorliga hoppinstruktionen i minnet. Det finns bara en operandutpekningsmetod: båda de operander som jämförs måste finnas i register. Det går alltså inte att använda en villkorlig hoppinstruktion för att jämföra ett registerinnehåll med ett konstant värde, som till exempel instruktionen cmpeqi gör. Sådana jämförelser kräver alltså en CMP-instruktion följt av en villkorlig hoppinstruktion. Undantag: det vanligaste konstanta värdet i jämförelser är noll. Eftersom register r0 alltid innehåller noll så kan en villkorlig hoppinstruktion jämföra med noll, så just det värdet kräver ingen CMP-instruktion. Exempel på villkorlig hoppinstruktion: bgt r8,r9,abe # hoppa till ABE om r8 > r9 äget ABE skrivs i programmet som ABE: i början på en rad. Översättningsprogrammet som översätter assemblerprogrammet till binär maskinkod räknar ut avståndet från adressen närmast efter den villkorliga hoppinstruktionen till läget ABE, och får på så sätt fram det tal som ska finnas som konstant värde i hoppinstruktionen. Kom ihåg att avståndet räknas som negativt om ABE finns innan beq r8,r9,abe i programmet (och som positivt om ABE finns efter beq r8,r9,abe). ösningsförslag till övning CE_O1, sida 6 (av 10) 2014-08-29

1.9. Ett program med villkorligt hopp a) Flödesschema: start a == b? NO c = 17 YES c = 4711 end Deklarationerna ska översättas på samma sätt som tidigare, till.data # anger att variabeldeklarationer kommer efter.data.align 2 # behövs för att ett word ska hamna på en giltig adress a:.word 0 # reserverar plats för ett word (4 byte) med innehållet 0 b:.word 0 c:.word 0 Programraden if( a == b ) /* then */ c = 17; else c = 4711; översätts sedan på olika sätt i de olika deluppgifterna. b) Så här översätts programmet när endast villkorlig hoppinstruktion ska användas..text # anger att programkod kommer efter.text.align 2 # behövs för att ett word ska hamna på en giltig adress movia r8,a # lägg adressen till variabeln a i r8 ldw r9,0(r8) # läs innehållet i variabeln a från minnet, lägg värdet i r9 movia r8,b # lägg adressen till variabeln b i r8 ldw r10,0(r8) # läs innehållet i variabeln b från minnet, lägg värdet i r10 bne r10,r9,elsepart # om innehållen är olika, hoppa till elsepart movi r12,17 # then-delen kommer här, förbered för att lägga 17 i c bra afterall # hoppa förbi else-delen elsepart: # else-delen kommer här movi r12,4711 # förbered för att lägga 4711 i c afterall: # följande del av programkoden utförs alltid movia r8,c # lägg adressen till variabeln c i r8 stw r12,0(r8) # skriv slutresultatet till variabeln c i minnet Påminnelse: i Nios-II-assembler innebär tecknet # att det som står på resten av raden är kommentar. ösningsförslag till övning CE_O1, sida 7 (av 10) 2014-08-29

c) Så här översätts programmet när CMP-instruktion ska användas..text # anger att programkod kommer efter.text.align 2 # behövs för att ett word ska hamna på en giltig adress movia r8,a # lägg adressen till variabeln a i r8 ldw r9,0(r8) # läs innehållet i variabeln a från minnet, lägg värdet i r9 movia r8,b # lägg adressen till variabeln b i r8 ldw r10,0(r8) # läs innehållet i variabeln b från minnet, lägg värdet i r10 cmpeq r11,r10,r9 # jämför om innehållen i variablerna a och b är lika beq r11,r0,elsepart # om (false) innehållen var olika, hoppa till elsepart movi r12,17 # then-delen kommer här, förbered för att lägga 17 i c br afterall # hoppa förbi else-delen elsepart: # else-delen kommer här movi r12,4711 # förbered för att lägga 4711 i c afterall: # följande del av programkoden utförs alltid movia r8,c # lägg adressen till variabeln c i r8 stw r12,0(r8) # skriv slutresultatet till variabeln c i minnet Påminnelse: i Nios-II-assembler innebär tecknet # att det som står på resten av raden är kommentar. 1.10. Ett program med slinga (loop) Originalprogrammet ser alltså ut så här: int n; int sum; int i; /* Här emellan finns det mera programkod som vi inte tittar på just nu */ sum = 0; for( i = 1; i <= n; i = i + 1 ) sum = sum + i; Se flödesschemat till höger. a) Med while-slinga deklarationerna i början behålls, resten byts ut mot följande. sum = 0; i = 1; while( i <= n ) { sum = sum + i; i = i + 1; } NO start sum := 0 i := 1 i < = n? YES sum := sum + i i := i + 1 end ösningsförslag till övning CE_O1, sida 8 (av 10) 2014-08-29

b) Med if(... ) goto... Deklarationerna behålls, resten byts ut mot följande. sum = 0; i = 1; loop: if( i > n ) goto endofloop; /* Obs! Villkoret har inverterats. */ sum = sum + i; i = i + 1; goto loop; endofloop: /* Här fortsätter programmet. */ c) Motsvarande program i assembler för Nios II..data # Detta är ett direktiv till assemblern. Det som kommer efter.data läggs i en del av minnet som är reserverad för data. Data måste ligga i läs- och skrivbart minne (RAM). sum:.word 0 # Reservera plats för variabeln sum. i:.word 0 # Reservera plats för variabeln i. n:.word 17 # Reservera plats för variabeln n. 1:.text # Detta är också ett assemblerdirektiv. Det som kommer efter.text läggs i en del av minnet som är reserverad för programkod. Programkod kan ligga i skrivskyddat minne. movia r8,sum # Peka ut första variabeln. stw r0,0(r8) # Nollställ summan, r0 innehåller ju noll. movi r9,1 # förbered för att sätta i till 1. stw r9,4(r8) # i sätts till 1. ldw r10,4(r8) # äs i. ldw r11,8(r8) # äs n. bgt r10,r11,2 # Om i > n, hoppa till 2. 2: ldw r11,0(r8) # äs sum. add r11,r11,r10 # Addera i till sum. stw r11,0(r8) # Spara summans nya värde. ldw r10,4(r8) # äs i. addi r10,r10,1 # Öka i:s värde med 1. stw r10,4(r8) # Spara i:s nya värde. br 1 # Gå till slingans början. Assemblerprogrammet är skrivet i en speciell stil. I denna programmeringsstil översätts varje C-sats var för sig, till en eller flera assemblerinstruktioner. Variablerna finns i minnet. Varje variabel läses från minnet före varje uppdatering, och det nya värdet skrivs tillbaka till minnet direkt efter varje uppdatering. För att hitta rätt variabel utnyttjar den här programmeringsstilen att variablerna är deklarerade i tur och ordning efter varandra. Programmeraren har utnyttjat detta ösningsförslag till övning CE_O1, sida 9 (av 10) 2014-08-29

genom att placera adressen till den första variabeln i ett register, r8, som sedan inte ändras. Då kan varje variabel läsas och skrivas med oad- och Store-instruktioner som använder register r8 och ett offset 0(r8), 4(r8) eller 8(r8) beroende på vilken variabel som refereras. Programmeringsstilen är tänkt att likna den assemblerkod som en C-kompilator producerar, när man inte begär någon optimering alls. Stilen har fördelar framför allt vid felsökning. Eftersom varje C-programrad översätts separat är det lätt att koppla en assemblerprogramrad till motsvarande C-programrad. Det går förstås att korta ner det här assemblerprogrammet, det vill säga optimera det. En möjlighet, som kan verka självklar, är att lägga variablerna i och sum i varsitt register och inte skriva deras värden till minnet förrän efter hela slingan är klar, efter läget 2. C-kompilatorn kan göra detta, men bara om användaren aktiverar optimering. ösningsförslag till övning CE_O1, sida 10 (av 10) 2014-08-29