CE O2. Nios II. Subrutiner med mera. · 2015. 1. 13. · aktuell "sida". Här nedanför visas ett...

12
IS1500 Datorteknik – Exempelsamlingens lösningar till övning CE_O2, 2014 IS1500 Lösningsförslag till övning CE_O2 2014 CE_O2. Nios II. Subrutiner med mera. 2.1. Binära lagringsformat R-type: (Register-format) rA (5 bit) rB (5 bit) rC (5 bit) operationskod (17 bit) Detta format är lämpligt för de instruktioner som använder innehåll från tre register vid sin exekvering. Typexempel är ADD och liknande. Instruktionen add rC,rA,rB medför att innehållet i angivet register rB adderas till innehållet i angivet register rA. Resultatet skrivs därefter till angivet register rC. Motsvarande gäller för många instruktioner, bland annat sub, and, or, nor, xor, mul och div. Jämförelseinstruktionerna i Nios II kodas med R-formatet, likaså instruk- tionerna för skift och rotation (se en senare uppgift). I-type: (Immediate-format rA (5 bit) rB (5 bit) IMM16 (16 bit) op-kod (6 bit) Detta format används för instruktioner som använder en 16 bitars konstant, IMM16, samt två register. Typexempel är ADDI och liknande. Instruktionen addi rB,rA,IMM16 medför att en 16 bitar stor konstant IMM16 först utvidgas till 32 bitar med sign-extension;, och sedan adderas med innehållet i angivet register rA. Resultatet av additionen skrivs därefter till angivet register rB. Motsvarande gäller för ett flertal instruktioner, som subi, andi, andhi, ori, orhi, xori, xorhi och muli. De flesta jämförelseinstruktioner i Nios II finns i en immediate-variant som kodas med I-formatet. Formatet används även av LOAD och STORE-instruktioner med offset lagrad i IMM16-fältet. Även för Load och Store görs sign-extension innan IMM16-värdet används; det medför att offset kan vara både positiva och negativa. J-type: (Jump-format) IMMED26 (26 bit) op-kod (6 bit) Detta format används endast av instruktionen CALL. Hoppadressen tas fram som de 4 mest signifikanta bitarna från aktuellt värde i PC, följt av 26 bitar från IMMED26 och slutligen 2 nollor i de minst signifikanta bitarna. Effektiva adressen skrivs till PC och medför subrutinanrop varvid returadressen sparas som vanligt i register r31 = ra. Lösningsförslag till övning CE_O2, sida 1 (av 12) 2015-01-13

Transcript of CE O2. Nios II. Subrutiner med mera. · 2015. 1. 13. · aktuell "sida". Här nedanför visas ett...

  • IS1500 Datorteknik – Exempelsamlingens lösningar till övning CE_O2, 2014

    IS1500 Lösningsförslag till övning CE_O2 2014

    CE_O2. Nios II. Subrutiner med mera.

    2.1. Binära lagringsformatR-type: (Register-format)

    rA (5 bit) rB (5 bit) rC (5 bit) operationskod (17 bit)

    Detta format är lämpligt för de instruktioner som använder innehåll från tre registervid sin exekvering. Typexempel är ADD och liknande.

    Instruktionen add rC,rA,rB medför att innehållet i angivet register rB adderas tillinnehållet i angivet register rA. Resultatet skrivs därefter till angivet register rC.

    Motsvarande gäller för många instruktioner, bland annat sub, and, or, nor, xor, muloch div. Jämförelseinstruktionerna i Nios II kodas med R-formatet, likaså instruk-tionerna för skift och rotation (se en senare uppgift).

    I-type: (Immediate-format

    rA (5 bit) rB (5 bit) IMM16 (16 bit) opkod (6 bit)

    Detta format används för instruktioner som använder en 16 bitars konstant, IMM16,samt två register. Typexempel är ADDI och liknande.

    Instruktionen addi rB,rA,IMM16 medför att en 16 bitar stor konstant IMM16 förstutvidgas till 32 bitar med sign-extension;, och sedan adderas med innehållet i angivetregister rA. Resultatet av additionen skrivs därefter till angivet register rB.

    Motsvarande gäller för ett flertal instruktioner, som subi, andi, andhi, ori, orhi, xori,xorhi och muli. De flesta jämförelseinstruktioner i Nios II finns i en immediate-variantsom kodas med I-formatet.

    Formatet används även av LOAD och STORE-instruktioner med offset lagrad iIMM16-fältet. Även för Load och Store görs sign-extension innan IMM16-värdetanvänds; det medför att offset kan vara både positiva och negativa.

    J-type: (Jump-format)

    IMMED26 (26 bit) opkod (6 bit)

    Detta format används endast av instruktionen CALL. Hoppadressen tas fram som de4 mest signifikanta bitarna från aktuellt värde i PC, följt av 26 bitar från IMMED26och slutligen 2 nollor i de minst signifikanta bitarna. Effektiva adressen skrivs till PCoch medför subrutinanrop varvid returadressen sparas som vanligt i register r31 = ra.

    Lösningsförslag till övning CE_O2, sida 1 (av 12) 2015-01-13

  • IS1500 Datorteknik – Exempelsamlingens lösningar till övning CE_O2, 2014

    2.2. Subrutinanrop med CALL eller CALLRInstruktionen  callr  medför att hela innehållet i angivet register kopieras tillprogramräknaren (Program Counter, PC).

    Instruktionen call (som är en av de få instruktioner som använder J-formatet) harplats för en 26-bitars konstant.

    Effektiva adressen, det vill säga det värde som skrivs till programräknaren, bildas påföljande sätt. Ur aktuellt värde i PC tar hårdvaran de 4 mest signifikanta bitarna,sedan används de 26 bitarna från instruktionen. Till sist kompletterar hårdvaran med 2nollor i de 2 minst signifikanta positionerna.

    Konsekvensen blir att man kan anropa godtycklig adress på den "sida" om 256 Mbytesom anges av de 4 mest signifikanta bitarna i PC. Det värde som finns iCALL-instruktionens IMM26-fält multipliceras med 4 (skiftas 2 steg vänster) innandet används. Det värde som står i CALL-instruktionen anger alltså word-offset inomaktuell "sida".

    Här nedanför visas ett exempel med instruktionen call 0x471100

    För både call och callr gäller att returadressen, det vill säga adressen till instruktionennärmast efter call/callr, sparas i register r31. Register r31 kallas även  ra(return address register).

    Lösningsförslag till övning CE_O2, sida 2 (av 12) 2015-01-13

    zeroes... ...since instruction addresses must end with binary 00

    call instr

    0000 0001 0001 0001 0100 0111 0000 (= 0x0111470)0010

    0x11c440 (0x471100 / 4, 26-bit absolute address) 0 (opcode)

    PC

    00 0001 0001 1100 0100 0100 0000 (= 0x11c440)

    0010 0000 0100 0111 0001 0001 0000 0000 (= 0x20471100)

    00

  • IS1500 Datorteknik – Exempelsamlingens lösningar till övning CE_O2, 2014

    2.3. Retur från subrutinMan ska alltid använda instruktionen  ret  som helt enkelt kopierar innehållet iregister r31 till PC. Man kan tro att det skulle gå lika bra med instruktionen JMP r31,men det är inte tillåtet.

    Instruktionen ret har binärkoden11111 00000 00000 000101 00000 111010

    Instruktionen jmp r31 är EJ tillåten, men skulle ha binärkod11111 00000 00000 001101 00000 111010

    Påminnelse: ra är bara är ett annat namn för register r31.

    Instruktionerna ret och jmp r31 har alltså olika maskinkod. I Nios II ProcessorReference Handbook står dessutom följande:

    It is illegal to jump to the address contained in register r31. To return fromsubroutines called by call or callr, use ret instead of jmp.

    2.4. Multiplikation med upprepad additiona) Flödesschema för subrutinen muladd:

    Lösningsförslag till övning CE_O2, sida 3 (av 12) 2015-01-13

    total =total + tal2

    start

    i ≤ tal1

    return

    NO

    YES

    total = 0

    i = 1

    i = i + 1

    return value =total

  • IS1500 Datorteknik – Exempelsamlingens lösningar till övning CE_O2, 2014

    b) Funktionen muladd kan skrivas så här i C:int muladd( int a, int b ){ int i; int total = 0; for( i = 1; i a ) goto L2 /* a finns i r4 */ add r2,r2,r5 # total = total + b /* b finns i r5 */ addi r8,r8,1 # i = i + 1 br L1 # goto L1L2: ret # total finns i r2

    Lösningsförslag till övning CE_O2, sida 4 (av 12) 2015-01-13

  • IS1500 Datorteknik – Exempelsamlingens lösningar till övning CE_O2, 2014

    c) Körtiden för muladd beror på vilka värden som multipliceras, närmare bestämt pådet ena värdet som finns i register r4. Detta värde avgör hur många varv somslingan mellan L1 och L2 körs. I värsta fall är värdet i storleksordningen2 miljarder, och då körs slingan 2 miljarder varv. På den Nios II/s som används pålaborationerna tar detta omkring 8 miljarder klockcykler, eller närmare 3 minuter.

    För att komma fram till detta värde gjordes följande beräkningar. Instruktionerna islingan är bgt – add – addi – br. Instruktionen bgt hoppar framåt, och hoppet tasnormalt inte; detta fall ger en körtid på 1 klockcykel. Instruktionerna add och additar 1 klockcykel vardera. Instruktionen br hoppar bakåt; detta fall ger en körtid på2 klockcykler. Summan är alltså 5 klockcykler per varv.

    Programkoden före och efter själva slingan bidrar bara i försumbar utsträckning tillkörtiden, när r4 innehåller stora värden.

    Låt oss också beräkna körtiden för multiplikation med 10. Vi antar att talet 10 finns iregister r4. Slingan körs då 10 varv vilket tar 50 klockcykler. Det tillkommer 3 extracykler för bgt i sista varvet, då hoppet tas. Vidare tar de båda movi-instruktionerna1 klockcykel vardera, och ret tar 4 klockcykler. Totalt tar funktionen muladd alltså50 + 3 + 1 + 1 + 4 klockcykler = 59 klockcykler för multiplikation med 10.

    2.5. Skifta och rotera bitarna i ett ordMan skiljer mellan operationer/instruktioner för SHIFT och ROTATE.SHIFT skiftar innehållet i utpekad operand varvid oftast nollor fylls på och utskiftadebitar slängs bort.

    ROTATE ser till att varje utskiftad bit skiftas in i den utpekade operanden.

    Lösningsförslag till övning CE_O2, sida 5 (av 12) 2015-01-13

    0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 1 1 1

    0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 1 1 1

    Exempel: innehåll i R9 = 0x85011147

    slli r9, r9, 2 # skifta innehåll i r9 vänster 2 steg

    0 0

    Innehåll i R9 efteråt = 0x1404451c = 0x05011147 x 4

    0:or in till högerbitar bort

    Exempel: innehåll i R9 = 0x85011147

    roli r9, r9, 2 # rotera innehåll i r9 vänster 2 steg

    Innehåll i R9 efteråt = 0x1404451d

    samma bitar in till högerbitar

    ut

    0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 1 1 1

    0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 1 1 1 0 1

  • IS1500 Datorteknik – Exempelsamlingens lösningar till övning CE_O2, 2014

    SHIFT och ROTATE kan göras åt höger eller vänster. SHIFT och ROTATE kan göras med olika antal steg.Skift finns ofta i två olika versioner, logiskt och aritmetiskt.

    ARITMETISKT SKIFT HÖGER motsvarar division med 2. För att det ska fungeraska teckenbiten repeteras så att negativa tal fortsätter att vara negativa, och positivafortsätta att vara positiva.

    Här är ett exempel där vi dividerar ett negativt tal med 4.

    Logiskt högerskift ger fel resultat:

    Aritmetiskt högerskift ger rätt resultat:

    SKIFT VÄNSTER motsvarar multiplikation med 2. Det ger risk för att talområdetöverskrids; för tal med teckenbit sker det när teckenbiten växlar värde. Nios II haringen hårdvara som upptäcker detta, utan programmeraren får skriva programkodsom undersöker värdena före och efter operationen.

    Nios-II har följande instruktioner:

    Rotation: rol, ror och roli.

    Instruktionerna  rol  och  ror  är ROtate Left repektive ROtate Right.Instruktionerna använder R-format med tre register. Exempel:  rol   rC,rA,rBmedför att innehållet i rA roteras det antal steg som anges av innehåll i rB (endast5 bitar används, högst 31 stegs rotation) och resultatet placeras i register rC.

    Lösningsförslag till övning CE_O2, sida 6 (av 12) 2015-01-13

    Exempel: innehåll i R9 = 0xfffffff4 = –12

    srai r9, r9, 2 # aritmetiskt skift av innehåll i r9 höger 2 steg

    Innehåll i R9 efteråt = 0xfffffffd = –3 (rätt!)

    kopior av teckenbiten in till vänsterbitar bort

    1 1 11 1 1 1 1 11 1 1 1 1 11 1 1 1 1 11 1 1 1 1 1 1 0 1 0 0

    1 1 11 1 1 1 1 11 1 1 1 1 11 1 1 1 1 11 1 1 1 1 1 1 1 1 0 1

    Exempel: innehåll i R9 = 0xfffffff4 = –12

    srli r9, r9, 2 # skifta innehåll i r9 höger 2 steg

    Innehåll i R9 efteråt = 0x3ffffffd = +1073741821 (fel!)

    0:or in till vänster

    bitar bort

    1 1 11 1 1 1 1 11 1 1 1 1 11 1 1 1 1 11 1 1 1 1 1 1 0 1 0 0

    1 1 10 0 1 1 1 11 1 1 1 1 11 1 1 1 1 11 1 1 1 1 1 1 1 1 0 1

  • IS1500 Datorteknik – Exempelsamlingens lösningar till övning CE_O2, 2014

    Instruktionen roli är en "immediate-variant" av rol där man anger antal steg somen konstant med maxvärde 31. Det finns ingen immediate-variant av ror, men"rotate right IMM5" kan utföras med instruktionen roli (32 minus IMM5).

    Instruktionerna sll och srl samt slli och srli är logiska skiftinstruktioner.

    Instruktionerna sra och srai är aritmetiska skiftinstruktioner

    Intruktionerna utan "i" använder R-format enligt ovan och instruktionerna med "i"utnyttjar IMM5-fält precis som rotate-instruktionerna ovan.

    De aritmetiska skift-instruktionerna sra och srai duplicerar teckenbiten precis somdet önskades enligt ovan.

    Man kan fråga sig vad man ska ha dessa instruktioner till. Ett svar är att in- ochutmatning på låg nivå kan kräva detta slags operationer på bitnivå. Exempelvis kan ettprogram behöva undersöka varje bit i ett ord, och räkna hur många av bitarna som ärettställda.

    2.6. Multiplikation med konstant, med hjälp av skift och additionIdén är att bilda produkten 10A genom att addera 2A + 8A, där 2A och 8A beräknasmed skift-instruktioner.

    a) Vi får följande program om värdet A finns i r4. Koden fungerar för negativa tal i r4om de lagras med 2-komplementsrepresentation.

    mul10: slli r4,r4,1 # r4 får värdet 2A slli r8,r4,2 # r8 får värdet 8A add r2,r4,r8 # r4 får värdet 2A+8A dvs 10A ret # och så återhopp från subrutinenb) Denna subrutin ska ta 11 klockcykler på den Nios II/s som används på

    laborationerna. Instruktionen slli tar 3 klockcykler med den hårdvara som finnspå laborationerna, add tar 1 cykel och ret tar 4 cykler.

    c) Talområdet för heltal utan tecken (unsigned int) i Nios II är 0–4294967295. Omprodukten blir större än så så överskrids talområdet och resultatet blir fel.

    d) Subrutinen mul10 fungerar bra för negativa tal, så länge talområdet inte överskrids.Talområdet för heltal med tecken (signed int) i Nios II är (-2147483648)–(+2147483647). Är produkten större än 2147483647, eller mer negativt än(-2147483648), så överskrids talområdet och resultatet blir fel.

    Lösningsförslag till övning CE_O2, sida 7 (av 12) 2015-01-13

  • IS1500 Datorteknik – Exempelsamlingens lösningar till övning CE_O2, 2014

    2.7. STACKOPERATIONERa) Visa hur en stack fungerar.

    En stack är en speciell datastruktur. Detgår att reservera plats och lägga in nyadata, och det går att ta bort gamla data.

    Stackstrukturen har en begränsning:data måste tas bort i omvänd ordningmot hur de lades in. Det betyder att detsenast inlagda värdet måste tas bortförst, sedan kan det näst senast inlagdatas bort, och så vidare.

    I Nios II växer stacken alltid i riktningmot adress 0.

    Ett av processorns register används somstackpekare. Stackpekaren innehålleralltid adressen till det senast inlagdavärdet. Man brukar säga att stackpekarenpekar på det senast inlagda värdet.

    När ett 4 byte stort värde ska läggas in påstacken så minskas stackpekaren förstmed 4, så att stackpekaren pekar på ettlagom stort ledigt utrymme. Sedan skrivsvärdet till det lediga utrymmet. Dennaoperation kallas push, och man talaribland om att pusha ett värde på stacken.

    (fortsättning följer)

    Lösningsförslag till övning CE_O2, sida 8 (av 12) 2015-01-13

    nyast

    äldst

    adress 0

    adress 0xffffffff

    0x3fff0stack pointer

    adress 0x3fff0

    inte längre nyast

    äldst

    adress 0

    adress 0xffffffff

    0x3fff0

    adress 0x3fff0

    0x3ffec

    ännu nyare 2

    X1

  • IS1500 Datorteknik – Exempelsamlingens lösningar till övning CE_O2, 2014

    Operationen att ta bort ett tidigare pushatvärde brukar kallas pop. Man talar om attpoppa ett värde från stacken.

    Ska ett värde tas bort från stacken så görsde omvända operationerna, i omvändordning.

    Först läses det senast inlagda värdet. Detvärdet finns ju på den minnesadress somstackpekaren anger (pekar på). Viförutsätter att värdet är 4 byte stort.

    Sedan ökas stackpekarens värde med 4.I och med att stackpekaren ökats med 4så ligger det poppade värdet utanför stacken, och kommer att skrivas över vid nästapush-operation.

    b) Operationen PUSH rx (byt rx mot något av registren r2–r23)    subi sp,sp,4    stw  rx,0(sp)

    Operationen POP rx    ldw  rx,0(sp)    addi sp,sp,4

    c) Makron: register sp är samma som register r27 (se sid 3-2 i manualen kapitel 3: Programming Model)

    .macro PUSH reg subi sp,sp,4 stw \reg,0(sp).endm

    .macro POP reg ldw \reg,0(sp) addi sp,sp,4.endm

    Lösningsförslag till övning CE_O2, sida 9 (av 12) 2015-01-13

    Xblir snart nyast

    äldst

    adress 0

    adress 0xffffffff

    0x3ffec

    20x3fff0

    just nu nyast1

    adress 0x3ffec

  • IS1500 Datorteknik – Exempelsamlingens lösningar till övning CE_O2, 2014

    2.8. Subrutinanrop i flera nivåer (nästlade anrop)Vilka speciella åtgärder måste vidtagas om man gör ett subrutinanrop i en subrutin?Kallas även inkapslad subrutin eller nested procedure.

    SVAR: Man måste se till att returadressen alltid förblir oförstörd. Det innebär att detinnehåll som finns i r31 vid anrop av en subrutin måste finnas kvar i r31 eller kunnaplaceras i r31 innan man gör returhopp med instruktionen RET.Man kan skydda innehållet i r31 på olika sätt. Det enklaste torde vara att se till attman aldrig ändrar innehållet i r31. Men om man ska anropa en subrutin från ensubrutin måste man innan man gör subrutinanrop omplacera innehållet i r31. Det kanman göra på olika sätt och det vanligaste är att kopiera r31 till en stackarea med enPUSH-operation i början av subrutinen och att sedan återställa innehållet i r31 med enPOP-operation i slutet av subrutinen innan retur med RET.

    Assemblerprogrammeraren måste också ha fullständig kontroll över vilka register somanvänds i olika programdelar av anroparen/caller respektive den anropade/callee.Varje subrutin har rätt att förutsätta att register r8-r15 får användas helt fritt dvs attden som anropar en subrutin måste uppträda som om innehåll i register r8-r15 kanförstöras av den anropade subrutinen. Den som anropar en subrutin måste alltså vidbehov skydda innehåll i r8-r15 (t.ex. på stacken) under den tid subrutinen exekveras.En subrutin som vill använda register r16-r23 måste skydda och återställa dessaregister innan returhopp eftersom det ska förutsättas att en callee (anropare) kan haanvänt r16-r23. Vilka krav som gäller för parametervärden i r2-r7 bör/måste framgåav specifikationer för anroparen och den anropade.

    2.9. Subrutin med parameteröverföring av värden i registerSkriv välkommenterad Nios II assemblerkod för en subrutin, sumv, som adderar två32-bitars heltal vars värden lagrats i register r4 och r5 innan anropet av sumv.Resultatet av beräkningen ska finnas i register r2 efter returhopp från sumv. Nedan visas hur motsvarande c-liknande programkod ser ut

    Handkompilera denna kod till assemblerkod för Nios-II

    int sumv(int x, int y){ return (x+y);}SVAR:

    SUMV: ADD r2, r4, r5 # addera r2

  • IS1500 Datorteknik – Exempelsamlingens lösningar till övning CE_O2, 2014

    2.10. Huvudprogram med parameteröverföring av värden i registerSkriv välkommenterad Nios II assemblerkod för ett huvudprogram som användersubrutinen sumv, se föregående uppgift, för att addera två heltal. Nedan visas ett exempel på hur ett sådant c-program kan se ut

    Handkompilera denna kod till assemblerkod för Nios-II

    int a, b, res; extern int sumv(int par1, int par2) int main() { a = 3; b = 4; ... /* annat programarbete */ res = sumv (a, b); ... return (0); }

    SVAR:

    .data # placera i data-area

    .align 2 # på adress delbar med 4A: .word 0 # reservera plats för A B: .word 0 # reservera plats för BRES: .word 0 # reservera plats för RES.text # placera i program-area.align 2.global mainmain: MOVIA r16, A # adressen till A finns nu i r16

    MOVIA r17, 3 # MOVI r17, 3 fungerar ocksåSTW r17, 0(r16)# nu finns värde 3 i AMOVIA r18, B # r16 är ledig och skulle fungera MOVIA r19, 4 # r17 är ledig och skulle fungeraSTW r19, 0(r18)# nu finns värde 4 i B...MOVIA r20, A # adressen till A finns nu i r20LDW r4, 0(r20) # nu finns parameter 1 i r4, värdet från AMOVIA r21, B # adressen till B finns nu i r21LDW r5, 0(r21) # nu finns parameter 2 i r5, värdet från BCALL SUMV # returvärde levereras i r2

    MOVIA r22, RES # adressen til RES finns nu i r22STW r2, 0(r22) # skriv resultatet till minnets plats RES

    Lösningsförslag till övning CE_O2, sida 11 (av 12) 2015-01-13

  • IS1500 Datorteknik – Exempelsamlingens lösningar till övning CE_O2, 2014

    2.11. Subrutin med parameteröverföring av adresser i registerint suma(int * x, int * y) { return (*x + *y); }

    Handkompilering till assemblerkod för Nios-II:

    SUMA: LDW r2, 0(r4) # hämta värde till r2LDW r8, 0(r5) # hämta värde 2 till r8ADD r2, r2, r8 # adderaRET # retur med summan i r2

    2.12. Huvudprogram med parameteröverföring av värden i register int a, b, res; extern int sumv(int* par1, int * par2) int main() { a = 3; b = 4; ... /* annat programarbete */ res = sumv (&a, &b); ... return (0); }

    Handkompilering till assemblerkod för Nios-II:

    .data # placera i data-area

    .align 2 # på adress delbar med 4A: .word 0 # reservera plats för A B: .word 0 # reservera plats för BRES: .word 0 # reservera plats för RES.text # placera i program-area.align 2.global mainmain: MOVIA r16, A # adressen till A finns nu i r16

    MOVIA r17, 3 # MOVI r17, 3 fungerar ocksåSTW r17, 0(r16)# nu finns värde 3 i AMOVIA r18, B # r16 är ledig och skulle fungera MOVIA r19, 4 # r17 är ledig och skulle fungeraSTW r19, 0(r18)# nu finns värde 4 i B...MOVIA r4, A # nu finns parameter 1 i r4, adressen till AMOVIA r5, B # nu finns parameter 2 i r5, adressen till BMOVIA r16, SUMA # nu finns adressen till SMA i r16CALLR r16 # returvärde kommer i r2

    MOVIA r16, RES # återanvändning av r16STW r2, 0(r16) # skriv resultatet till RES i minnet

    Lösningsförslag till övning CE_O2, sida 12 (av 12) 2015-01-13