Newest Viewed Downloaded

William Sandqvist william@kth.se Datorteknik övning 3 stackhantering subrutin som anropar subrutin programutveckling

William Sandqvist william@kth.se Datorteknik övning 3 stackhantering subrutin som anropar subrutin programutveckling

William Sandqvist william@kth.se Digitala komponenter Assemblerprogram C In- och utmatning Avbrott och "trap" Cacheminnen Trådar, synkronisering DC F1 DC F2 CE F1 CE F3 CE F4 CE F5 CE F6 CE F7 CE F8 CE F9 CE F10 CE F2 DC Ö1 DC Ö2 CE Ö4 CE Ö1 CE Ö2 CE Ö3 CE Ö10 CE Ö7 CE Ö8 CE Ö9 CE Ö5 CE Ö6 lab dicom lab nios2time hemlab C lab nios2io lab nios2int hemlab cache hemlab trådar tentamen Datorteknik & komponenter

William Sandqvist william@kth.se Laborationerna

2.6 Hur anropas mul10() ? William Sandqvist william@kth.se tal = mul10(43); Anrop i C-program: movi r4, 43 # parameter i R4 call mul10 # call subrutin movia r8, tal # adressen till ”tal” i R8 stw r2,0(r8) # lagra resultat vid ”tal:” . . . mul10: slli r10,r4,3 # skifta tre steg (ggr 8) slli r11,r4,1 # skifta ett steg (ggr 2) add r2,r10,r11 # addera i returvärdesregistret R2 ret # returnera Assemblerprogram:

William Sandqvist william@kth.se 3.1 Stackoperationer a) Visa hur en stack fungerar. b) Ge exempel på hur man med befintliga instruktioner för Nios-II kan utföra stackoperationerna PUSH reg och POP reg. c) Skriv makron för operationerna PUSH reg och POP reg.

William Sandqvist william@kth.se Stack  En stack är en datastruktur  FIFO first in – first out (som att lägga tallrikar på en tallrikstrave). Hela stacken kan läsas, men bara det senast inlagda värdet kan tas bort. Stacken har den egenskapen att den vänder på ordningen på data.

William Sandqvist william@kth.se Stackpekare Ett register, stackpekaren, innehåller adressen till det senast inlagda värdet.

William Sandqvist william@kth.se push – inläggning på stack Stackpekaren minskas med 4 Byteadresser – så att den pekar på lediga platsen Skriv data på lediga platsen

William Sandqvist william@kth.se pop – borttagning från stack Läs värdet Öka stackpekaren med 4 Byteadresser. Värdet ligger kvar i minnet men kommer att ”skrivas över” vid nästa push på denna adress.

William Sandqvist william@kth.se Makron Med makron för push och pop är det mindre risk att man hanterar stackpekaren på ett inkonsekvent sätt. .macro PUSH reg subi sp,sp,4 stw \reg, 0(sp) .endm .macro POP reg ldw \reg, 0(sp) addi sp,sp,4 .endm

William Sandqvist william@kth.se Behövs PUSH/POP ? Nios II kan använda indexerad operandutpekning och offset-värden för att nå alla data på stacken relativt stackpekaren. Då behövs det bara hälften så många instruktioner för att hantera stacken jämfört med push/pop, eftersom offset beräknas vid kompileringen. sp sp Medan en kompilator kan ”hålla reda på” var på stacken den lagrat olika data, så är det vi som laboranter som behöver ett enkelare system, det vill säga push/pop. Vid laborationerna väger den prestandaförlusten lätt!

William Sandqvist william@kth.se 3.2 Subrutinanrop i flera nivåer Vilka speciella åtgärder måste vidtagas om man gör ett subrutinanrop i en subrutin? Kallas även för inkapslad subrutin eller nested procedure.

William Sandqvist william@kth.se Returaddress Returadressen lagras i register R31

William Sandqvist william@kth.se Subrutin i flera nivåer Hur går det nu med första returadressen?

William Sandqvist william@kth.se Returadress på stacken En subrutin som anropar en annan subrutin måste lägga sin egen returadress på stacken före anropet.

William Sandqvist william@kth.se push r31 Minska stackpekarens värde med 4 -så att den pekar ut nästa lediga plats Skriv data -innehållet i R31kopieras till nya platsen

William Sandqvist william@kth.se Subrutinstruktur

William Sandqvist william@kth.se 3.3 Subrutin med värdeanrop Skriv 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äkningarna skall finnas i register R2 efter returhopp från sumv(). Nedan visas hur motsvarande C programkod ser ut. Handkompilera denna kod till assemblerkod för Nios-II. int sumv(int x, int y) { return x+y; }

William Sandqvist william@kth.se värdeanrop .global sumv sumv: add r2,r4,r5 ret int sumv(int x, int y) { return x+y; } R2 R4 R5 Värdeanrop. Det anropande programmet skickar med (kopior) av variabelvärden som parametrar i R4 och R5. Call-by value

William Sandqvist william@kth.se 3.4 Huvudprogram med värdeanrop Skriv välkommenterad Nios-II assemblerkod för ett huvudprogram som använder subrutinen 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, int); int main(void) { a = 3; b = 4; ... res = sumv(a, b); ... return 0; }

Showing 1 - 20 of 47 items Details

Name: 
DaTekCE3-ws
Author: 
N/A
Company: 
N/A
Description: 
William Sandqvist william@kth.se Datorteknik övning 3 stackhantering subrutin som anropar subrutin programutveckling
Tags: 
william | kth | sandqvist | int | push | pop | subrutin | global
Created: 
11/4/2010 10:41:17 AM
Slides: 
47
Views: 
8
Downloads: 
0
Rating: 
0


> Comment



Share this presentation
|

Comments

Share this presentation:

|
Sitemap