Institutionen för elektro- och informationsteknologi, LTH

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

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

Datorsystemteknik DVGA03 Föreläsning 5

Stack och subrutiner Programmeringskonventionen

Lösningar till tentamen i EIT070 Datorteknik

Programmering av inbyggda system. Kodningskonventioner. Viktor Kämpe

Lösningar till tentamen i EIT070 Datorteknik

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

Lösningar till tentamen i EIT070 Datorteknik

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

F5: Högnivåprogrammering

F5: Högnivåprogrammering

Digital- och datorteknik

Tentamen i EIT070 Datorteknik

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

Kontrollskrivning Mikrodatorteknik CDT S2-704

CE_O3. Nios II. Inför lab nios2time

Dataminne I/O Stack 0x005D 0x3D SP low byte 0x005E 0x3E SP high byte

Assemblerprogrammering - fördjupning

F4: Assemblerprogrammering

Programräknaren visar alltid på nästa instruktion som skall utföras. Så fort en instruktion har hämtats så visar programräknaren på nästa instruktion.

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

Assemblerprogrammering för ARM del 2

Tentamen. Datorteknik Y, TSEA28

TSEA28 Datorteknik Y (och U)

Föreläsning 10. Pekare (Pointers)

Assemblerprogrammering, ARM-Cortex M4 del 3

Datorsystemteknik DVGA03 Föreläsning 8

OBS!! Detta är DEL 2 av tentan. För att få ut denna måste du ha lämnat in del 1. Om du inte fått ut del 1 bör du meddela skrivningsvakten. OBS!!

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

Digital- och datorteknik

Laboration 2 i Datorteknik- Assemblerprogrammering II

rd, rs, rt Digitalteknik och Datorarkitektur 5hp ALU register) 32 bit register b 5 bit 32 Registers 32 bit MIPS is a Register-toregister

Datorsystemteknik Föreläsning 7DAVA14

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

TSEA28 Datorteknik Y (och U)

Programexempel för FLEX

Polling (cyklisk avfrågning) Avbrott

Exempelsamling Assemblerprogrammering

TSEA28 Datorteknik Y (och U)

Assemblerprogrammering del 3

Övningsuppgifter i Mikrodatorteknik 4p/5p

Digital- och datorteknik

LEU240 Mikrodatorsystem

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

Institutionen för elektro- och informationsteknologi, LTH

Datorteknik. Föreläsning 5. Realtidssystem och realtidsprogrammering. Institutionen för elektro- och informationsteknologi, LTH.

Dynamiskt minne. Vad är dynamiskt minne Motivering Hur gör man i C Övningar

Digital- och datorteknik

Övning2 Datorteknik, HH vt12 - Programmering

Digital- och datorteknik

Datorarkitektur I. Tentamen Lördag 10 April Ekonomikum, B:154, klockan 09:00 14:00. Följande gäller: Skrivningstid: Fråga

Digital- och datorteknik

Operativsystem ID2200 Tentamen TEN1 3.8 hp :00-18:00

Datorsystem Laboration 2: Minnesmappade bussar

Introduktion C-programmering

Tentamen i EIT070 Datorteknik

TENTAMEN. Datorteknik. D1/E1/Mek1/Ö Hjälpmedel: Häfte "ARM-instruktioner", A4-format, 17 sidor. Maxpoäng:

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

Repetition C-programmering

Tentamen. Datorteknik Y, TSEA28

Assemblerprogrammering del 1

Tentamen. Datorteknik Y, TSEA28

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

Lösningsförslag till tentamen i IS1500 Datorteknik

PC-teknik, 5 p LABORATION ASSEMBLERINTRODUKTION

Mål. Datorteknik. Introduktion. Innehåll. Verklig situation - pappaledighet. Introduktion (forts)

Institutionen för elektro- och informationsteknologi, LTH

Lösningsförslag till Tenta i Mikrodator

Besvara de elektroniska frågorna (se kurshemsidan). Läs kapitel i kursbok.

Tentamen. Datorteknik Y, TSEA28

F8: Undantagshantering

Tentamen. Datorteknik Y, TSEA28

Datorarkitekturer med operativsystem ERIK LARSSON

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

Datorsystemteknik DAVA14 Föreläsning 10

CE_O1. Nios II. Enkla assembler-instruktioner.

Tentamen. Datorteknik Y, TSEA28

Fö 5+6 TSEA81. Real-time kernel + Real-time OS

Extrauppgifter för CPU12

Operativsystem ID2206 Tentamen TEN1 4.5 hp :00-18:00

Digitalteknik och Datorarkitektur

Omtentamen i CDT204 - Datorarkitektur

CE_O2. Nios II. Subrutiner med mera.

Mål. Datorteknik. Repetition av avbrott. Innehåll. Mätning och styrning. Datorer för mätning och styrning. timer. Datorsystem A/D. Analog insignal D/A

Idag: Par och listor. Scheme. DA2001 (Föreläsning 6) Datalogi 1 Hösten / 29

Idag: Par och listor. Symboler. Symboler används för att uttrycka icke-numeriska data såsom namn, adress, bilregisternummer, boktitel, osv.

Tentamen. Datorteknik Y, TSEA28

Tentamen i Digitalteknik och Datorarkitektur DV1 5p

Datorteknik. Tomas Nordström. Föreläsning 6. För utveckling av verksamhet, produkter och livskvalitet.

Föreläsning 2 Programmeringsteknik och C DD1316. Mikael Djurfeldt

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

DatorsystemteknikDAVA14 Föreläsning 9

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

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

Datorsystemteknik DAV A14 Föreläsning 1

Övning från förra gången: readword

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

Transkript:

Datorteknik Föreläsning 3 Assembler, stack och subrutiner, programmeringskonventionen

Mål Att veta hur maskinkoden för ett program byggs upp Att börja programmera i assembler på riktigt Att kunna skriva och anropa subrutiner i assembler Att förstå hur stacken fungerar Att veta vad som förväntas av en subrutin som i sin tur anropar en annan

Innehåll Vilka komponenter består ett program av och hur överförs det till maskinkod? Hur måste subrutiner se ut för att kunna fungera? Vilka data måste en subrutin spara och varför? Var sparas dessa data och hur? Hur fungerar en stack? Vad är programmeringskonventioner och varför ska man följa dem?

Innehåll (forts) Hur använder jag assemblern? Vad är s.k. syntetiska instruktioner? Hur programmerar man för att rutiner i C och assembler ska fungera tillsammans? Exempel: Hur gör man en rekursiv subrutin i assembler som går att anropa från C?

Hur ser ett program ut? HUVUDPROGRAM C Subrutin 1 C Subrutin 2 assembler Subrutin 3 assembler Subrutin 21 assembler Subrutin 22 C Subrutin 31 Biblioteksrutin

Hur skapas maskinkoden? Huvudprog Subrutin Subrutin Bibliotek Kompilator Huvudprog Kompilator Assembler Huvudprog Objektkod Objektkod Objektkod Objektkod Länkare M a s k i n k o d

Enkelt program /* Programmet female */ main() { } int pnr, is_female; scanf( %d,&pnr); /* Pers.nr */ pnr=pnr/10; /* Heltalsdiv. */ /* check skriven i assembler */ is_female = check(pnr); if (is_female!= 0) printf( Kvinna\n ); else printf( Man\n ); Check ger värdet 1 i v0 om a0 är jämnt, annars 0. Följer anropskonventionerna..globl check.ent check check: andi t0, a0, 0x01 bne t0, zero, man nop addi v0, zero, 0x01 # 1 -> v0 beq zero, zero, endit nop man: xor v0, v0, v0 # Nollställ endit: jr ra.end check # En enkel subrutin!!!

Kan subrutiner se ut hur som helst? Vi kan ha mera komplexa situationer Subrutiner som anropar andra subrutiner kan ställa till problem. VARFÖR?? Vi tittar på ett exempel:

Subrutinen silly.globl silly.ent silly.globl sillier.ent sillier silly: addiu t0,zero,0 # Nollställ.. jal sillier # sparar #återhoppsadress i ra! nop sw v0,16(t0) jr ra.end silly sillier: addi t1, t1, 7 jr ra.end sillier OM EN RUTIN ANROPAR silly BLIR DET FEL - VARFÖR??? VAD BLIR ÅTERHOPPSADRESSEN NÄR VI HOPPAR TILLBAKA FRÅN silly?

Subrutinen silly - analys Subrutinen silly anropar en annan subrutin Genom jal-instruktionen i silly skrivs ra över Det är omöjligt att komma tillbaka till den rutin som anropade silly Register ra måste sparas undan någonstans i minnet. Men var?

Minnesorganisation Höga adresser Stack Stack. Växer nedåt Låga adresser Ledigt minne Dyn. data Statiska data Program Heap. Växer uppåt Variabler etc..data Programkod.text

Minnesorganisation (forts) Vi organiserar en del av minnet i form av en stack Stack är ett vedertaget begrepp Tekniken att använda en stack kan förklaras på många olika sätt

Stack (intro) Ex: Gruppuppgifter hamnar på assistentens bord Uppg 1 Uppg 3 Uppg 2 Uppg 2 Uppg 4 Så fort en ny uppgift dyker upp, hamnar den överst i högen. När den är färdigrättad plockas den bort och den översta rättas. Pilen visar den uppgift assistenten jobbar med vid varje tidpunkt!

Stacken (forts) På samma sätt kan en subrutin lägga upp data på stacken. När subrutinen (uppgiften) är klar tas data bort från stacken igen. För att krångla till det: Stacken i vår dator växer nedåt (varför?) Det som motsvarar pilen (håller reda på stackens topp) är ett register: stackpekaren (sp).

Stacken (forts) Vedertagna operationer för att hantera stacken: push: Lägger ett element på stackens topp och ändrar pekaren till detta element pop: Hämtar tillbaka ett element från stackens topp och sätter pekaren på elementet nämast under

Registeranvändning REG NAMN KOMMENTAR $0 zero alltid noll $1 at används av assemblern $2-$3 v0-v1 returvärden från funktioner $4-$7 a0-a3 argument till subrutiner $8-$15 t0-t7 temporära register $16-$23 s0-s7 får ej förändras av subrutiner $24-$25 t8-t9 temporära register $26-$27 k0-k1 används av operativsystem/avbrott $28 gp global datapekare $29 sp stackpekare $30 s8/fp ibland frame pointer $31 ra return address: återhoppsadress

Subrutiner och stacken Vilka element kan en subrutin vilja spara undan? ra: registret med återhoppsadressen (om rutinen anropar något annat) a0-a3: parametrarna till rutinen s0-s8: subrutinregistren ska sparas om de används lokala variabler plats för argument till anropad subrutin

Aktiveringsblock Register som ska sparas läggs på stacken Utrymme för lokala variabler och plats för argument allokeras på stacken Totala allokerade mängden data ska vara jämnt delbart med 8 (konvention) Det allokerade utrymmet kallas AKTIVERINGSBLOCK

Aktiveringsblock Sp Sp ra andra reg. lokala var argument

Subrutiner i C int stacktest(int x, int y) { int a,b; int level1(int x) { int a; } a=level1(x); b=level1(y); return a+b; /* Subrutinen stacktest anropar */ level1 som i sin tur anropar level2 a=level2(x+4); return a+4; } int level2(int x) { return x+1; }

Samma subrutiner i assembler BÖRJA MED level2: - Anropar inga subrutiner - Behöver inte spara register om bara t0-t9 används.globl level2.ent level2 level2: addi t0,a0,1 or v0,t0,zero jr ra.end level2 ENKELT... int level1(int x) { } int a; a=level2(x+4); return a+4; int level2(int x) { return x+1; }

Samma subrutiner i assembler FORTSÄTT MED level1: PROLOG - allokera aktiveringsblocket! - level1 anropar en subrutin - level2 - Vi måste spara undan register som kan förändras: ra, s0, s1, a0 - Allokera plats för en lokal variabel samt plats för argument till subrutin som vi kallar på. - Totalt 6*4=24 bytes. Jämnt delbart med 8 - OK.globl level1.ent level1 level1: subu sp,sp,24 # Plats på stacken sw ra,20(sp) # Återhoppsadressen sw s0,16(sp) # Reg s0 sw s1,12(sp) # Reg s1 sw a0,8(sp) # Argumentet # Lokal variabel på 4(sp) # Plats för argument a0 på 0(sp)

Samma subrutiner i assembler level1: SUBRUTINENS FUNKTION... addi a0,a0,4 # Räkna fram rätt argument jal level2 # Hoppa till subrutinen nop sw v0,4(sp) # Spara resultatet i lokal variabel lw s0,4(sp) # Hämta igen (lite dumt, men...) nop addi s1,s0,4 # Beräkna a+4 or v0,s1,zero # Flytta s1 till v0...

Samma subrutiner i assembler level1: EPILOG (ÅTERSTÄLL REGISTER OCH ÅTERLÄMNA AKTIVERINGSBLOCK)... # Och så är det dags att återställa.end lw a0,8(sp) lw s1,12(sp) lw s0,16(sp) lw ra,20(sp) addiu sp,sp,24 # Återställ stacken jr ra level1

Hur skriver man en subrutin? - Deklarera subrutinen - Allokera aktiveringsblocket - Spara register på stacken - Gör det som ska göras i rutinen - Återställ registren - Återlämna aktiveringsblock - Hoppa tillbaka

Assemblerdirektiv Vanligaste assemblerdirektiven:.globl : Gör symbolen känd globalt.ent : Start på subrutin.text : Text- (program) segment (instruktioner).data : Datasegment.end : Slut på subrutin

Assemblerdirektiv Assemblerdirektiv för data.word X : Deklarera ett 32 bits ord, värde X.byte Y : Samma fast byte.float Z : Deklarera flyttal.ascii sträng : Deklarera en sträng.space M : Allokera utrymme M bytes

Syntetiska instruktioner MIPS är en RISC-processor med begränsat antal instruktioner, tex add, andi osv. Vissa instruktioner är enkla att programmera med, men finns ej i instruktionsuppsättningen. Ex neg, not och b. Assemblern översätter dessa till kombinationer av existerande instruktioner

Syntetiska instruktioner (forts) Ex: neg rd, rs tar talet i rs och byter tecken, lägger i rd ersätts av sub rd, zero, rs b label (ovillkorligt hopp) ersätts av beq zero, zero, label not rd, rs inverterar bitarna i rs ersätts av nor rd, rs, zero

Rekursiv subrutin i assembler Antag att vi vill skriva en rekursiv subrutin i assembler. Ex: Rutin som summerar de första n udda talen (det 4:e udda talet är 7 = 2*4-1) Vi börjar med att skriva den i C

Rekursiv subrutin EN REKURSIV C-FUNKTION int myfun(int n) { int temp; if (n==0) { temp = 0; } else { temp = 2*n-1 + myfun(n-1); } return temp; } VI MÅSTE FÖLJA PROGRAMMERINGSKONVENTIONEN!

Rekursiv subrutin - Rutinen kommer att använda s0, s1 och måste spara ra, a0,s0,s1 - I aktiveringsblocket ska en lokal variabel (temp) och plats för argument till anropad funktion finnas.globl myfun.ent myfun # PROLOG myfun: subu sp,sp,24 # 6 hela ord reserveras sw ra,20(sp) # spara ra (returadress) på stacken sw s0, 16(sp) # spara s0 sw s1, 12(sp) # spara s1 sw a0, 8(sp) # argumentet # På 4(sp) finns temp och på 0(sp) # finns platsen för argument

Rekursiv subrutin... # Subrutinens egentliga funktion beq a0,zero,endit # Hoppa ut om argumentet är noll nop add s0, a0,a0 # 2*n i s0 addi s0,s0,-1 # 2*n-1 i s0 addi a0,a0,-1 # Minska argumentet med 1 jal myfun # Kallar på sig själv nop add s1,s0,v0 # 2*n-1 + returvärdet sw s1,4(sp) # Spara i lokal variabel beq zero,zero, ret # Hoppa ovillkorligt nop endit: sw zero,4(sp) # Lägg värdet noll i lokal variabel

Rekursiv subrutin # EPILOG - ÅTERSTÄLL REGISTER, ÅTERLÄMNA AKTIVERINGSBLOCK OCH HOPPA TILLBAKA ret: lw v0,4(sp) # Lägg lokala var i returregistret lw a0,8(sp) lw s1,12(sp) lw s0,16(sp) lw ra,20(sp) addu sp,sp,24 jr ra # Här börjar epilogen # Återlämna aktiveringsblock # Hoppa tillbaka.end myfun

Sammanfattning Vi har fått en försmak av hur det är att programmera subrutiner i assembler Assemblerprogrammering är svårt!!!! Det är lätt att göra fel. Programmeringskonventionen och stacken är viktiga begrepp!