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

Relevanta dokument
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.

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

Kontrollskrivning Mikrodatorteknik CDT S2-704

Minnen delas in i två huvudgrupper, permanenta och icke permanenta. Non-volatile and volatile.

A-del motsvarande KS1

Ansvarig lärare: Olof Andersson, Telefon (besöker skrivsalen)

Digital- och datorteknik

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

Institutionen för elektro- och informationsteknologi, LTH

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?

Läs igenom hela laboration 5 innan du börjar beskriva instruktionsavkodaren i VHDL!

Det finns en handledning till kortet på hemsidan. AVR STK500.

Stack och subrutiner Programmeringskonventionen

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

PC-teknik, 5 p LABORATION ASSEMBLERINTRODUKTION

AVRStudio på tre minuter. Micke Josefsson, 2005

TSEA28 Datorteknik Y (och U)

Det finns en hemsida. Adressen är

Datorsystem Laboration 2: Minnesmappade bussar

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

F8: Undantagshantering

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

Laboration 2 i Datorteknik- Assemblerprogrammering II

Digital- och datorteknik

Läsminne Read Only Memory ROM

CE_O3. Nios II. Inför lab nios2time

Ett program som frågar regelbundet om något skall utföras. Exempelvis om spänningen på ett batteri sjunkit under en viss nivå.

Tentamen. Datorteknik Y, TSEA28

TSEA28 Datorteknik Y (och U)

F4: Assemblerprogrammering

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

TSEA28 Datorteknik Y (och U)

LABORATION DATORTEKNIK D. Pipelining. Namn och personnummer. Version: (OS,OVA,AN)

LEU240 Mikrodatorsystem

CE_O2. Nios II. Subrutiner med mera.

Datorarkitekturer med operativsystem ERIK LARSSON

Tentamen. Datorteknik Y, TSEA28

Föreläsning 10. Pekare (Pointers)

Datorteknik Hyfsa kod

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

Tentamen. Datorteknik Y, TSEA28

Lista på registeruppsättningen i PIC16F877A Datablad TTL-kretsar 74-serien

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

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

System S. Datorarkitektur - en inledning. Organisation av datorsystem: olika abstraktionsnivåer. den mest abstrakta synen på systemet

Lösningar till tentamen i EIT070 Datorteknik

Tentamen den 12 januari 2017 Datorarkitektur med operativsystem, EDT621

Datormodell. Datorns uppgifter -Utföra program (instruktioner) Göra beräkningar på data Flytta data Interagera med omvärlden

Svar till tentamen den 16 december 2013 Datorarkitekturer med operativsystem, EDT621, 7,5 poäng

Digital- och datorteknik

Programmering av inbyggda system. Kodningskonventioner. Viktor Kämpe

F5: Högnivåprogrammering

F5: Högnivåprogrammering

CPU. Carry/Borrow IX. Programräknare

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

Övning2 Datorteknik, HH vt12 - Programmering

Till assemblersystemet Zuper 80 Assembler krävs en SPECTRAVIDEO 328/318+minst 16K ram extra.

Tentamen. Datorteknik Y, TSEA28

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

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

Datorsystemteknik DVGA03 Föreläsning 8

Datorteknik ERIK LARSSON

Program Datorteknik. Kontrollenhet. Exekvering av en instruktion. Abstraktionsnivå: Högnivåspråk. Assemblyspråk. Maskinspråk.

Datorsystemteknik Föreläsning 7DAVA14

Digital- och datorteknik

Exempel 4. Användning av en timer

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

Föreläsningsanteckningar 2. Mikroprogrammering I

Programallokering. Programtyper. Att placera program i flashrespektive. Program i FLASH-minne. Program i RAM-minne

Digital- och datorteknik

En Von Neumann-arkitektur ( Von Neumann-principen i föreläsning 1) innebär:

Digital- och datorteknik

Tentamen PC-teknik 5 p

Assemblerprogrammering för ARM del 2

Modbus Seriell Kommunikation

Polling (cyklisk avfrågning) Avbrott

Lösningsförslag till Tenta i Mikrodator

Digitalteknik EIT020. Lecture 15: Design av digitala kretsar

Lösningsförslag till Tenta i Mikrodator

Grundläggande datavetenskap, 4p

Assemblerprogrammering, ARM-Cortex M4 del 3

Föreläsningsanteckningar till Konstruktionsmetoder

Minnet. Minne. Minns Man Minnet? Aktivera Kursens mål: LV3 Fo7. RAM-minnen: ROM PROM FLASH RWM. Primärminnen Sekundärminne Blockminne. Ext 15.

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

TSEA28 Datorteknik Y (och U)

Maskinorienterad programmering

Ext-13 (Ver ) Exempel på RTN-beskrivning av FLEX-instruktioner

Tentamen. Datorteknik Y, TSEA28

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

Datorteknik ERIK LARSSON

Övning 6. Parallellport, timer

Tentamen (Exempel) Datorteknik Y, TSEA28

Tentamen Datorteknik Y, TSEA28 Datum

Svar till Övning3 Datorteknik, HH vt12 Avbrott och timers

Föreläsningsanteckningar 4. Pipelining

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

CE_O5. Cacheminne. Hemlaboration 2.

Programexempel för FLEX

Transkript:

CT3760 Mikrodatorteknik Föreläsning 4 Tisdag 2005-09-06 Stacken I datasammmanhang är en stack ett minnesområde. Det är processorn som använder stacken. För att skapa en stack anger man en adress i stackpekarregistret. Detta register finns i dataminnet på adress 0x005D och 0x005E. Registret kan nås i I/O-delen med hjälp av adressserna 0x3D och 0x3E. Dataminne I/O Stack 0x005D 0x3D SP low byte 0x005E 0x3E SP high byte Stacken bör om möjligt placeras i det interna SRAM-minnet. Detta för att så snabb tillgång till stacken. Att undersöka: Var hamnar stacken då man i assemblerprogrammering använder.include m16def.inc? I programmen hittills har vi skrivit: START: LDI R16, low(ramend) OUT SPL, R16 LDI R16, high(ramend) OUT SPH, R16 Filen m16def.inc innehåller en hel del informtion och förkortningar. Filen kan sökas under katalogen C:\Program Files\Atmel\ Den kan läsas i Notepad, men ännu bäättre i Programmers Notepad. Där hittar man följande:.equ RAMEND = $45F Detta är en minnesadress. Adressen till den sista tillgängliga minnesbyten i RAM. Adresser är 16 bitar. Data är 8 bitar. Stackpekaren pekar på en adress, alltså måste den vara på 16 bitar. Pekaren är uppdelad i två delar. SPL och SPH. Dessa två tillsammans utgör stackpekaren. Man hämtar först den låga delen av RAMEND, mellanlagrar i R16 och skriver sedan till SPL. Hämtar sedan den höga delen. Nu har vi en pekare som pekar på den högsta tillgängliga platsen i minnet. Stacken växer man man lägger något till stacken. Stacken växer mot lägre adresser, därför är det lämpligt att stacken ligger längst upp dataminnet. 2005-09-08 H:\CT3760\Period1_2005\F4.doc 1/6

Stackpekaren pekar alltid på nästa lediga plats. Så här ser det ut innan stacken används. Dataminne Sackpekare SRAM SPH SPL Högsta adressen Antag att innehållet i register R16 skall skickas till stacken. Instruktionen som används är R16 Innehållet i R16 kopieras till den plats som anges i stackpekarregistret, när kopieringen är klar minskas innehållet i stackpekaren med ett. Stackpekaren pekar på nästa lediga plats. Så här ser instruktionen ut: Push Register on Stack Description: This instruction stores the contents of register Rr on the STACK. The Stack Pointer is postdecremented by 1 after the. This instruction is not available in all devices. Refer to the device specific instruction set summary. Operation: STACK Rr Syntax: Operands: Program Counter: Stack: Rr 0 r 31 PC PC + 1 SP SP - 1 16-bit Opcode: 1001 001d dddd 1111 Stausregistret påverkas ej av operationen. Exempel: Vi har ett program där stackpekaren är definierad. Någonstans i programmet finns följande rader: R0 R1 R2 R3 2005-09-08 H:\CT3760\Period1_2005\F4.doc 2/6

Då dessa fyra rader har utförsts ser stacken ut så här: Stackpekare efter R3 Stackpekare innan R0 ledigt R3 R2 R1 R0 Motsatsen till är POP POP Pop Register from Stack Description: This instruction loads register Rd with a byte from the STACK. The Stack Pointer is preincremented by 1 before the POP. This instruction is not available in all devices. Refer to the device specific instruction set summary. Operation: Rd STACK Syntax: Operands: Program Counter: Stack: POP Rd 0 d 31 PC PC + 1 SP SP + 1 16-bit Opcode: 1001 000d dddd 1111 Fortsätt programmet ovan med ett par rader till: R0 R1 R2 R3 POP R3 POP R2 Stackpekare efter POP R2 Stackpekare innan R0 ledigt R3 betraktas som ledigt R2 betraktas som ledigt R1 R0 Efter instruktionen POP R2 så pekar stackpekaren på den plats som vi har lagrat R2. Även R3 finns kvar. Dessa platser kommer att skrivas över vid nästa användning av stacken. Observera att och POP endast fungerar gentemot register. Lita aldrig på att något nedanför stackpekaren finns kvar oförändrat. 2005-09-08 H:\CT3760\Period1_2005\F4.doc 3/6

I C-kursen hade vi en uppgift som gick ut på att byta värden. int main(int argc, char *argv[]) { int a= 1; int b=5; int slask; printf("a = %d och b = %d \n",a,b); slask =a; a = b; b=slask; printf("\na = %d och b = %d \n",a,b); Efter programkörningen så innehåller a värdet 5 och b innehåller värdet 1. Hur gör man i asssembler? De del av programmet som gör motsvarande är R1 R5 POP R1 POP R5 Klart. Flytta ett I/O-register till stacken. Det som är aktuellt är att flytta SREG till stacken. Det kan vara bra att ha en kopia av detta register då stacken används av en subrutin. Man kan inte kopiera registret till stacken direkt, utan det måste göras via ett register. - - IN R4, SREG R4 - För att ta tillbaka från stacken. POP OUT - R4 SREG, R4 IN och OUT fungerar på I/O och register. 2005-09-08 H:\CT3760\Period1_2005\F4.doc 4/6

Subrutiner Mnemonic CALL ICALL RCALL long call Indirekt, adress i Z-reg relativt Ett litet exempel där jag tillfogat vad programräknaren har för värde..include "m16def.inc".def temp = R16.cseg.org 0 PC 0 rjmp RESET 1 RESET: ldi temp,low(ramend) 2 out SPL, temp 3 ldi temp,high(ramend) 4 out SPH, temp 5 clr r16 5 clr r17 7 clr r18 8 ldi r16,0x12 9 ldi r17,0x13 A rcall rutin B nop C nop D stop: rjmp stop E rutin: mov r18,r16 F add r18,r17 10 ret När instruktionen out SPH, temp utförts är stackpekaren definierad. Den har den hexadecimala adresssen 0x045F. När instruktionen rcall rutin har hämtats, så pekar programräknaren PC på nästa instruktion. Den finns på adress 0x00000B Instruktionen innebär ett hopp. Programräknarens innehåll sparas på stacken. Nästa lediga plats 0x45F 0x45E 0x45D 0x0B 0x00 2005-09-08 H:\CT3760\Period1_2005\F4.doc 5/6

Nytt värde på programräknaren blir 0x00000E vilket är 0x0b +4. Nu startar programmet från den nya adressen. När instruktionen RET hämtats så ställs programräknaren om. Den nya addressen hämtas från stacken. Programmet körs sedan fram till stop. Stackpekarens värde ökar med två efter det att återhoppsadressen hämtats. Nästa gång något skrivs till stacken kommer 0x0B att skrivas över. Genomgång av programmet tabell. Programet lagrar 16 byte i SRAM. Observera kodsegment.cseg och datasegment.dseg.cseg finns i flash-minnet och.seg finns i SRAM. Genomgång av programmet tabell2. Här finns koden och ett antal konstanter i flash-minnet. Ny instruktion LPM Ladda programminne. Z-registret används som pekarregister. LDI zh,high(2*konst) LDI zl,low(2*konst) Labeln konst har värdet 0000x30. Denna multipliceras med två. Värdet blir 0x60. Instruktionen LPM använder z-registret som pekare, men bara de 15 mest signifikanta bitarna. Pekaren får då åter ett effektivt värde som är 0x30. Sista biten är en nolla. LPM använder denna som instruktion att läsa in den minst signinfikanta byte. Man adderar sedan 1 till z registret. LPM kommer att uppfatta samma adress, men nu läses den mest signifikanta byten in. Genomgång över hur en 7-segmentdisplay är kopplad. Se bilaga. 2005-09-08 H:\CT3760\Period1_2005\F4.doc 6/6