Adresovací módy paměti programu a dat

Podobné dokumenty
8. Laboratoř: Aritmetika a řídicí struktury programu

Ústav radioelektroniky

Strojový kód k d a asembler procesoru MIPS SPIM. MIPS - prostředí NMS NMS. 32 ks 32bitových registrů ( adresa registru = 5 bitů).

Jednočipové mikropočítače

.include "m32def.inc" // Konstanty.equ N = 5 // Počet prvků v poli.equ PRVNI = 3 // První číslo v poli

Ústav radioelektroniky

Jazyk symbolických adres

AVR Instrukční soubor

Struktura a architektura počítačů (BI-SAP) 9

IMTEE Přednáška č. 11

RISC a CISC architektura

Universita Pardubice Fakulta elektrotechniky a informatiky. Mikroprocesorová technika. Semestrální práce

Strojový kód. Instrukce počítače

Struktura a architektura počítačů (BI-SAP) 7

Kubatova Y36SAP 8. Strojový kód Jazyk symbolických instrukcí asembler JSA pro ADOP a AVR Kubátová Y36SAP-strojový kód 1

IMTEE Přednáška č. 8. interrupt vector table CPU při vzniku přerušení skáče na pevně dané místo v paměti (obvykle začátek CODE seg.

Testování jednotky ALU a aplikace metody FMEA

Činnost CPU. IMTEE Přednáška č. 2. Několik úrovní abstrakce od obvodů CPU: Hodinový cyklus fáze strojový cyklus instrukční cyklus

Assembler - 5.část. poslední změna této stránky: Zpět

Procesor z pohledu programátora

ISU Cvičení 7. Marta Čudová

Procesor. Základní prvky procesoru Instrukční sada Metody zvýšení výkonu procesoru

Systém adresace paměti

ISU Cvičení 3. Marta Čudová

PK Design. EVMS-mega128 v1.0. Výukové příklady. Výuková deska s mikrokontrolerem ATmega128. Verze dokumentu 1.0 ( )

Programování mikroprocesorů Atmel AVR Název a adresa školy: Střední průmyslová škola, Hronov, Hostovského 910, Hronov

Princip funkce počítače

Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague

Seznámení s mikropočítačem. Architektura mikropočítače. Instrukce. Paměť. Čítače. Porovnání s AT89C2051

Architektury VLIW M. Skrbek a I. Šimeček

Akademický rok: 2004/05 Datum: Příjmení: Křestní jméno: Osobní číslo: Obor:

Architektury počítačů a procesorů

PROGRAMOVÁNÍ MIKROPOČÍTAČŮ CVIČENÍ 10

Assembler - 2.část. poslední změna této stránky: Zpět

Adresní mody procesoru

Přednáška. Vstup/Výstup. Katedra počítačových systémů FIT, České vysoké učení technické v Praze Jan Trdlička, 2012

a operačních systémů

Předmluva 13 Použité konvence 14. KAPITOLA 1 Základní číselné soustavy a pojmy Číselné soustavy a převody 15 1.

Programování PICAXE18M2 v Assembleru

x86 assembler and inline assembler in GCC

Assembler RISC RISC MIPS. T.Mainzer, kiv.zcu.cz

MSP 430F1611. Jiří Kašpar. Charakteristika

Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague

Ústav radioelektroniky. Mikroprocesorová technika a embedded systémy. doc. Ing. Tomáš Frýza, Ph.D.

Registry 32 bitové pro všeobecné použití: EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP.

Principy komunikace s adaptéry periferních zařízení (PZ)

Operační systémy. Jednoduché stránkování. Virtuální paměť. Příklad: jednoduché stránkování. Virtuální paměť se stránkování. Memory Management Unit


Jako pomůcka jsou v pravém dolním rohu vypsány binární kódy čísel od 0 do 15 a binární kódy příkazů, které máme dispozici (obr.21). Obr.

ČESKÉ VYSOKÉ UČENÍ TECHNICKÉ V PRAZE

Paměťový podsystém počítače

Architektura počítačů. Instrukce a návrh instrukční sady. Lubomír Bulej KDSS MFF UK

Čísla, reprezentace, zjednodušené výpočty


Přednáška. Správa paměti II. Katedra počítačových systémů FIT, České vysoké učení technické v Praze Jan Trdlička, 2012

Klimatizace. Třída: 4.C. Střední Průmyslová Škola Elektrotechnická Havířov Protokol do MIT. Skupina: 3. Zpráva číslo: 3

Mikrořadiče řady 8051.

Řízení IO přenosů DMA řadičem

Program "Světla" pro mikropočítač PMI-80

Čísla, reprezentace, zjednodušené výpočty

Struktura a architektura počítačů (BI-SAP) 11

Programovací jazyk Pascal

Programování MCU ve vyšších programovacích jazycích

Paměti a jejich organizace

Popis instrukční sady procesoru ADOP

ČEMU ROZUMÍ MIKROPROCESOR?


Pohled do nitra mikroprocesoru Josef Horálek

Základní uspořádání pamětí MCU

Algoritmizace a programování

Registry 8*32bit ERn (=16*16bit En+Rn, 8*16bit+16*8bit En+RnH+RnL)

Podprogram DELAY.INC. - konstanty časových prodlev. RB3 equ 11b DEL1MS: DEL800: DEL400: DEL200 DEL100 DELAY: ret DEL1MS

Architektura počítačů Logické obvody

Střední průmyslová škola a Vyšší odborná škola, Hrabákova 271, Příbram. III / 2 = Inovace a zkvalitnění výuky prostřednictvím ICT

Architektura počítačů Logické obvody

Semestrální práce z předmětu ÚPA MIPS

Střední průmyslová škola a Vyšší odborná škola, Hrabákova 271, Příbram. III / 2 = Inovace a zkvalitnění výuky prostřednictvím ICT

Metody připojování periferií BI-MPP Přednáška 2

Komunikace modulu s procesorem SPI protokol

MPASM a IDE pro vývoj aplikací MCU (Microchip)

Opakování programování

Gymnázium a Střední odborná škola, Rokycany, Mládežníků 1115

Operační systémy. Přednáška 8: Správa paměti II

1. Programování PLC. Programovatelné automaty II - 1 -

Petr Krajča. 26. říjen, 2012

Přerušení POT POT. Přerušovací systém. Přerušovací systém. skok do obslužného programu. vykonávaný program. asynchronní událost. obslužný.

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

Registrový model HDD

Bitové operátory a bitová pole. Úvod do programování 2 Tomáš Kühr

Struktura a architektura počítačů (BI-SAP) 8

Přerušovací systém s prioritním řetězem

Sběrnicová architektura POT POT. Jednotlivé subsystémy počítače jsou propojeny sběrnicí, po které se přenáší data oběma směry.

Základy informatiky. 2. Přednáška HW. Lenka Carr Motyčková. February 22, 2011 Základy informatiky 2

PROGRAMOVÁNÍ MIKROPOČÍTAČŮ CVIČENÍ 2

Kubatova Y36SAP procesor - control unit obvodový a mikroprogramový řadič RISC Y36SAP-control unit 1

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

A51 MACRO ASSEMBLER POKUSNY PROGRAM DATE 10/3/007 PAGE 1

PROTOKOL O LABORATORNÍM CVIČENÍ

Mikrokontroléry. Doplňující text pro POS K. D. 2001

Úvod do programování. Lekce 1

Transkript:

Adresovací módy paměti programu a dat AVR architektura obsahuje několik adresovacích módů pro přístup k paměti programu (FLASH) a k datové paměti (SRAM, pracovní registry a I/O registry) Na následujících obrázcích, které popisují jednotlivé adresovací módy, znamená zkratka OP kód instrukce v instrukčním slově. Přímé adresování jednoho registru Operand je uložen v registru Rd Např. instrukce INC Rd nebo ROL Rd Přímé adresování dvou registrů Operand je uložen v registru Rr a Rd, výsledek je uložen do registru Rd Např. instrukce MOV Rd,Rr nebo ADD Rd,Rr

Přímé adresování I/O prostoru Jedním z operandů instrukce je adresa v I/O prostoru viz obrázek, znak P Druhým operandem je adresa zdrojového nebo cílového registru obrázek, znak n Např. instrukce IN Rd, P nebo OUT P, Rr Přímé adresování dat 16-ti bitová adresa je obsažena v dolních 16-ti bitech (LSB) dvouslovové instrukce. Rd/Rr je cílový nebo zdrojový registr Např. instrukce LDS Rd, k nebo STS k, Rr, kde k je v rozsahu 0 až 65535

Nepřímé adresování dat Adresa operandu je obsahem registru X, Y nebo Z. Např. instrukce LD Rd,X nebo ST X,Rr, stejně pro Y a Z Využití pro přístup k polím, tabulkám a ukazateli na zásobník. Nepřímé adresování dat s posunem Adresa operandu se získá přičtením obsahu registru Y nebo Z k adrese umístěné v dolních 6-ti bitech instrukčního slova. Druhým operandem je adresa zdrojového nebo cílového registru znak n. Např. instrukce LDD Rd,Y+a nebo STD Y+a,Rr, stejně pro Z Využití pro přístup k polím, tabulkám a ukazateli na zásobník.

Nepřímé adresování dat s pre-dekrementací Registr X, Y nebo Z je před provedením operace dekrementován. Adresa v operandu je dekrementovaný obsah registru X, Y nebo Z. Např. instrukce LD Rd,-X nebo ST X,Rr, stejně pro Y a Z Využití pro přístup k polím, tabulkám a ukazateli na zásobník. Nepřímé adresování dat s post-inkrementací Registr X, Y nebo Z je inkrementován po provedení operace. Adresa v operandu je obsah registru X, Y nebo Z před inkrementací. Např. instrukce LD Rd,X+ nebo ST X+,Rr, stejně pro Y a Z Využití pro přístup k polím, tabulkám a ukazateli na zásobník.

Přímé adresování konstanty v paměti programu Adresa konstanty je určená obsahem registru Z. 15 horních bitů adresuje slovo v paměti programu (určuje řádek), nultý bit vybírá horní (lsb = 1) nebo dolní (lsb = 0) bajt slova (určuje sloupec). Např. instrukce LPM Mimo AVR základní řady jsou možné další instrukce: LPM Rd,Z nebo LPM Rd,Z+ nebo SPM zápis jednoho slova do paměti programu - viz datasheet Využití pro vyčítání tabulek, řetězců apod. uložených v paměti programu. Nepřímé adresování paměti programu Provádění programu pokračuje na adrese obsažené v registru Z, tj. programový čítač PC je naplněn obsahem registru Z. instrukce IJMP a ICALL.

Relativní adresování v paměti programu Provádění programu pokračuje na adrese PC + k + 1. Relativní adresa k může být v rozsahu -2048 až +2047. instrukce RJMP k nebo RCALL k Souhrn registry X, Y, Z slouží pro nepřímé adresování paměti dat (slouží jako ukazatele) registr Z slouží také pro nepřímé adresování paměti programu lze využít pre-dekrementaci a post-inkrementaci ukazatele pro přístup k I/O registrům, paměti dat a pro přesun dat mezi pracovními registry se používají rozdílné instrukce odlišnost oproti 8051, kde jsme si vystačili s MOV Atmel AVR assembler integrován do AVR studia v následujících odstavcích budou uvedeny pouze nejzákladnější informace, podrobnější informace lze získat v literatuře nebo datasheetech firmy Atmel Direktivy assembleru direktivy se nepřekládají do strojového kódu, slouží k nastavení umístění v programové paměti, definují makra, inicializují paměť atd. Přehled direktiv je

uveden v následující tabulce. Direktiva.BYTE.CSEG.DB.DEF.DEVICE.DSEG.DW.ENDM nebo.endmacro.equ.eseg.exit.include.list.listmac.nolist.org.set Popis Rezervuje byte pro proměnnou Kódový segment Definuje konstantní byte Definuje symbolické jméno pro registr Definuje pro který uc se má provádět překlad Datový segment Definuje konstantní slovo Konec makra Přiřazuje symbol výrazu EEPROM segment Opuštění souboru Čtení zdrojového kódu z dalšího souboru Zapíná generování listingu Zapíná rozvinutí makra v listingu Vypíná generování listingu Nastavuje základní adresu programu Přiřazuje symbol výrazu Komentáře pomocí znaku středník např.: ldi temp,0xff ;nastavení portu A jako výstupního Začátek programu vložení definičního souboru pro daný typ AVR o tento hlavičkový soubor definuje pomocí direktivy.equ jména I/O registrů, jména jednotlivých bitů I/O registrů, definuje registry XH,XL,YH,YL,ZH,ZL pro nepřímé adresování, dále pojmenovává adresy vektorů přerušení a další konstanty (např. název použitého AVRka, velikost RAM, koncovou adresu RAM apod.) o hlavičkové soubory jsou pojmenovány xxxxdef.inc o např.:.include "m32def.inc" definice konstant, tabulek, nových jmen registrů apod. např.:.equ PI = 3.14 konst:.db 0, 1, 255, 34, 25, -5.DEF temp = R16 Registry 32 pracovních registrů R0 až R31

Pomocí direktivy.def jim lze přiřadit jména a ty používat v programu výhoda. např.:.def temp = R16 Naplnění registru konstantou Instrukce ldi (load immediate) Např.: ldi temp,10 ;naplní registr R16 číslem 10 Pracuje pouze s registry R16 až R31!! Přesun mezi dvěma registry Instrukce mov Např.: mov temp,r2 ;naplní registr R16 hodnotu z reg. R2 Registry X,Y,Z Slouží pro nepřímé adresování paměti dat (X,Y,Z) nebo paměti programu (Z) Horní byte příslušného registru je označen xh, dolní byte xl (např.: ZH a ZL) Naplnění registru X, Y nebo Z adresou se provede následovně:.equ Adresa = 0x100 ;adresa pocatku tabulky ;nejaky kod ldi XH,HIGH(Adresa) ;horni byte adresy ldi XL,LOW(Adresa) ;dolni bajt adresy Vlastní nepřímé adresování se provede pomocí instrukcí ld (Load) a st (Store) Ukazatel Popis funkce Příklad zápisu v asm X Zápis/čtení do/z adresy X st x,r1 ld r1,x X+ Zápis/čtení do/z adresy X s post-inkrementací st x+,r1 ukazatele -X Zápis/čtení do/z adresy X s pre-dekrementací ukazatele ld r1,x+ st -x,r1 ld r1,-x Registr Z lze použít pro nepřímé adresování paměti programu o Paměť programu je organizována po slovech (po 16-ti bitech) adresu nutno násobit dvěma - potom horních 15 bitů udává řádek a nultý bit vybírá horní či dolní bajt ve slově (určuje sloupec) viz kapitola adresovací módy ldi ZH,HIGH(2*Adresa) ;horni byte adresy ldi ZL,LOW(2*Adresa) ;dolni bajt adresy o Vlastní nepřímé adresování se provede pomocí instrukce lpm (Load program memory), která načte do registru R0 obsah na adrese uložené v reg. Z

o Využití pro načtení tabulek či řetězců z paměti programu. Abychom se mohli pohybovat po tabulce, nutno inkrementovat či dekrementovat ukazatel (obsah registru Z) použití instrukce adiw nebo sbiw, které přičítají nebo odečítají konstantu v rozsahu 0 až 63 k/od registrů X,Y,Z a pro registrovou dvojici R25:R24. To je provedeno jako 16-ti bitová operace! Instrukce adiw a sbiw přebírají jako svůj první parametr dolní bajt registrové dvojice! např.: adiw ZL,1 ;pricteni 1 k registru Z o AVR typu ATmega mají navíc dvě varianty instrukce lpm umožňující načtení hodnoty z adresy do jiného registru než R0 a post-inkrementaci Z. Dále mají i instrukci spm, která zapisuje do paměti programu slovo v R1:R0. Příklad kopírování tabulky z paměti programu do paměti dat.include "m32def.inc".equ RAM_ADR = 0x0060.DEF pocit = R16.CSEG.ORG 0x0100 ;tabulka ulozena v pameti prog. od adresy 0x0100 data:.db 25,34,255,124,29,58,13,5.ORG 0x0000 start: ldi pocit,8 ;8 prvku v tabulce ldi ZH,HIGH(2*data) ;horni byte adresy v CODE ldi ZL,LOW(2*data) ;dolni bajt adresy v CODE ldi XH,HIGH(RAM_ADR) ;horni byte adresy v DATA ldi XL,LOW(RAM_ADR) ;dolni bajt adresy v DATA copy: lpm ;vycteni prvku z tabulky adiw Z,1 ;inkrementace ukazatele st x+,r0 ;ulozeni do SRAM a inkr. ukazatele dec pocit ;dekrementace pocitadla brne copy konec: rjmp konec Seznam instrukcí pracujících pouze s registry R16 až R31 ldi Rd,k ;naplnění registru Rd konstantou k andi Rd,k ;bitový součin registru Rd a konstanty k

cbr Rd,K ;vymazání všech bitů v Rd, které jsou nastaveny ;na jedničku v konstantní masce hodnoty K cpi Rd,k ;porovnání Rd s konstantou k sbci Rd,k ;odečtení konstanty k a aktuální hodnoty příznaku ;přenosu (C) od registru Rd a uložení výsledku do Rd sbr Rd,K ;bitový součet registru Rd a masky K ser Rd ;nastavení všch bitů v Rd na jedničku subi Rd,k ;odečtení konstanty od obsahu registru Rd a uložení ;výsledku zpět do Rd Souhrn Jednotlivé registry lze pojmenovat pomocí direktivy.def Potřebujeme-li přístup do paměti pomocí ukazatelů, použijeme registry X,Y,Z. Šestnáctibitovou proměnnou je vhodné umístit do R25:R24 využijeme instrukcí adiw nebo sbiw Předpokládáme-li bitový přístup do registrů, vyhradíme si R16 až R23. Pro vyčítání tabulek z paměti programu použijeme registr Z a nepřímé adresování. I/O porty (I/O registry) 64 I/O portů, ne všechny jsou dostupné (záleží na typu AVR) Definice názvů I/O portů jsou uvedeny v hlavičkovém souboru xxxxdef.inc výhoda nemusíme si pamatovat adresy. Taktéž jednotlivé bity I/O portů mají přidělen název. Pojmenování je totožné s názvy v datasheetu daného typu AVR. Čtení a zápis z/do I/O portů (registrů) Přístup po bytech o Instrukce in a out in R16,SREG out SPL,R16 out SPH,R17 ;nacteni obsahu stavoveho reg. do R16 ;zapis do I/O registru (nastaveni ;Stack Pointeru) o Instrukce lds a sts využíváme přístupu do SRAM ;nutno pricist 0x20 nebot I/O registry jsou ;mapovany do SRAM od adresy 0x20 (32 desitkove) lds R16,(SREG+0x20) sts (SPL+0x020),R16 sts (SPH+0x020),R17

Přístup po bitech o Instrukce sbi (Set Bit) a cbi (Clear Bit) sbi PORTB,0 ;nastaví bit 0 v reg. PORTB na 1 sbi PORTB,PB5 ;nastaví bit 5 v reg. PORTB na 1 cbi PORTB,0 ;vynuluje bit 0 v reg. PORTB cbi PORTB,PB5 ;vynuluje bit 5 v reg. PORTB o Omezení - instrukce sbi a cbi pracují pouze s I/O registry, které leží v rozsahu adres 0x00 až 0x1F tzn. prvních 32 I/O registrů!!!! o Pro registry ležící od adresy 0x20 se musí použít přístup po bajtech. in R16,TCCR1A ;načtení I/O registru do R0 ;nastavení vybraných bitů do 1 pomocí maskování Maskování ori R16, (1<<FOC1A) (1<<COM1A1) (1<<COM1A0) out TCCR1A,R16 ;zápis zpět do I/O registru o Pro modifikaci jednotlivých bitů ve stavovém registru jsou zavedeny instrukce SEx a CLx, kde x je název bitu. sei ;nastaví bit I do 1 cli ;vynuluje bit I set ;nastaví bit T do 1 clt ;vynuluje bit T o Způsob nastavení vybraných bitů registru (obecně proměnné) na 1 nebo na 0 o Využití bitového součtu (nastavení bitu do 1), bitového součinu + negace (nastavení bitu do 0) a bitového posuvu Příklad nastavení bitů do 1: in R16,TCCR1A ;načtení I/O registru do R0 ;nastavení vybraných bitů do 1 pomocí maskování ori R16, (1<<FOC1A) (1<<COM1A1) (1<<COM1A0) out TCCR1A,R16 ;zápis zpět do I/O registru Příklad nastavení bitů do 0: in R16,TCCR1A ;načtení I/O registru do R0 ;nastavení vybraných bitů do 0 pomocí maskování andi R16, ~((1<<FOC1A) (1<<COM1A1) (1<<COM1A0)) out TCCR1A,R16 ;zápis zpět do I/O registru

Přístup do SRAM Přímé adresování o Pomocí instrukcí lds a sts.equ Adresa = 0x0070 lds R0,Adresa sts Adresa,R0 Nepřímé adresování ;čtení ze SRAM z dané adresy ;zápis na adresu ve SRAM o Pomocí instrukcí ld a st. Lze použít registry X, Y i Z. Ukazatel Popis funkce Příklad zápisu v asm X Zápis/čtení do/z adresy X st X,R1 ld R1,X X+ Zápis/čtení do/z adresy X s post-inkrementací st X+,R1 ukazatele ld R1,X+ -X Zápis/čtení do/z adresy X s pre-dekrementací st -X,R1 ukazatele ld R1,-X o Pomocí instrukcí ldd a std nepřímé adr. s posunem bázová hodnota ukazatele se nemění, pouze se k němu dočasně přičítá konstanta. Lze použít pouze registry Y a Z..EQU Adresa = 0x0070.DEF temp = R0 ldi YH,HIGH(Adresa) ;nastavení ukazatele ldi YL,LOW(Adresa) ;nastavení ukazatele ;nějaký kód std Y+2,temp ldd temp,y+2 ;uložení hodnoty do SRAM na ;adresu 0x0072 ;načtení hodnoty ze SRAM z ;adresy 0x0072 Zásobník a ukazatel zásobníku (Stack Pointer) Zásobník je typu LIFO. Ukládání návratových adres a lokálních proměnných. SP je obecně 16-ti bitový, rozdělen na dva registry SPH a SPL. Nalézá se v I/O prostoru.

Nutno ho na začátku programu nastavit např. na konec SRAM: ldi R16,HIGH(RAMEND) out SPH,R16 ldi R16,LOW(RAMEND) out SPL,R16 ;Konstanta RAMEND určuje poslední adresu ve SRAM, je ;definovaná v hlavičkovém souboru a je závislá na typu ;AVR. ;HIGH() a LOW() jsou funkce definované překladačem, které ;vrací druhý bajt výrazu (HIGH) nebo dolní bajt výrazu ;(LOW). Uložení hodnoty do zásobníku a vyjmutí hodnoty ze zásobníku push R0 ;uložení obsahu registru R0 do zásobníku pop R0 ;vyjmutí hodnoty a uložení do R0 Vždy je nutno dbát na pravidlo kolik jsem toho uložil, tolik toho i vyberu. Přičemž vyčítání hodnot ze zásobníku je v opačném pořadí než ukládání. push R0 ;uložení obsahu registru R0 do zásobníku push R1 ;uložení obsahu registru R1 do zásobníku pop R1 ;vyjmutí hodnoty a uložení do R1 pop R0 ;vyjmutí hodnoty a uložení do R0 Vhodné použití zásobníku je v následujích případech: o Hodnoty budeme opět potřebovat po několika řádcích kódu. o Všechny registry jsou již použité. o Nemámě možnost je uložit jinde.

Řízení chodu programu Po resetu je programový čítač PC (Program Counter) nastaven na adresu 0x0000. Po provedení resetu se nastaví všem registrům a portům defaultní hodnoty a program se začne provádět od adresy 0x0000. Pomocí direktivy.org můžeme sdělit překladači na jaké adrese začíná náš kód nebo obecně nastavit adresu v daném segmentu. Direktivou.CSEG,.DSEG nebo.eseg se přepínáme mezi kódovou, datovou a EEPROM sekcí. Ve spojení s direktivou.org lze např. uložit tabulku konstant do paměti programu na dané adrese nebo do paměti EEPROM..CSEG.ORG 0x0100 tab1:.db 1,15,23,58,125;tabulka v paměti programu od ;adresy 0x0100.ESEG.ORG 0x0000 tab2:.db 0,10,20,30,40 ;tabulka v EEPROM od adr. 0x0000.DSEG.ORG 0x0200 tab3:.byte 10 ;rezervuje 10B v datové paměti od ;adresy 0x0200 Při použití přerušení musí náš program začínat až za tabulkou vektorů přerušení, která se nachází na začátku paměti programu. První instrukce musí tedy být skok na začátek našeho programu, který se nalézá až za tabulkou vektorů přerušení..cseg.org 0x0000 rjmp start ;odskok na hlavní program rjmp Int0_ISR ;vektor přerušní od INT0 odskok na ;oblužnou rutinu rjmp Int1_ISR ;vektor přerušní od INT1 odskok na ;oblužnou rutinu start: ;začátek hlavního programu ;nějaký další kód

Podmíněné skoky Chceme aby se program větvil na základě nějakých podmínek. Použití instrukcí, které testují příznaky ve stavovém slově SREG nebo uřčitý bit v registru, a dle výsledku dojde ke skoku či nikoliv. To, který ze stavových příznaků se změní při provedení nejaké instrukce, je popsáno v seznamu instrukcí v datasheetu. Filozofie podmíněných skoků je taková, že se nejprve provede nějaká operace, která mění bity v SREG, a poté se zavolá instrukce, která tyto bity testuje a případně skáče. Existují dvě skupiny instrukcí skoku. Instrukce, které při splněné podmínce přeskakují následující instrukci o sbrc Rr,b (Skip If Bit In Register Cleared) o sbrs Rr,b (Skip If Bit In Register Set) o sbic P,b o sbis P,b (Skip If Bit In I/O Register Cleared) (Skip If Bit In I/O Register Set) o cpse Rd,Rd (Compare, Skip If Equal) o Příklad: ;nejaky kod sbic PINB,0 rjmp NejakeNavesti ;nejaky dalsi kod ;když PINB.0 == 0 tak přeskoč ;následující instrukci rjmp, jinak ;pokračuj normálně dojde k vykonání ;instrukce rjmp o Omezení bitový přístup (a tedy použití instrukcí sbis a sbic) je možný pouze k dolní polovině I/O registrů (prvních 32 do adresy 0x1F). Instrukce, které při splněné podmínce provedou skok na danou adresu (relativní) o Testují bit v SREG. o brxy k (Branch If x y), kde k je relativní adresa (PC = PC + k) o Např.: breq k (Branch If Equal) testuje zda je bit Z v SREG roven 1 a při splněné podmínce skáče brne k (Branch If Not Equal) testuje zda je bit Z v SREG roven 0 a při splněné podmínce skáče brcs k (Branch If Carry Set) testuje zda je bit Z v SREG roven 1

brcc k (Branch If Carry Cleared) testuje zda je bit C v SREG roven 0 brsh k (Branch If Same or Higher) testuje zda je bit C v SREG roven 0 brlo k (Branch If Lower) testuje zda je bit C v SREG roven 1 brmi k (Branch If Minus) testuje zda je bit N v SREG roven 1 brpl k (Branch If Plus) testuje zda je bit N v SREG roven 0... a další viz datasheet Příklad čekací smyčka.def delay = R18.DEF delay2 = R19 cekej: ldi delay,0xff ;naplneni registru konstantou hop: ldi delay2,0xff ;naplneni registru konstantou hop2: dec delay2 ;dekrementuj brne hop2 ;skakej pokud je delay2!= 0 dec delay brne hop ;skakej pokud je delay!= 0 Ten samý program napsaný pro 8051 cekej: mov R3,#FFH hop: mov R2,#FF hop2: djnz R2,hop2 ;dekrementuj a skoč není-li R2 == 0 djnz R3,hop ;dekrementuj a skoč není-li R3 == 0 Nepodmíněné skoky a volání podprogramů rcall k o relativní volání podprogramu, PC = PC + k + 1 o je zakódované jako relativní odskok relativní vzdálenost spočítá překladač o dovoluje volat podprogram v rozsahu paměti PC 2K + 1 a PC + 2K (slov) o vykonání instrukce trvá 3 takty, délka instrukce 1 slovo (2 bajty) o při volání podprogramu se uloží návratová adresa do zásobníku o podprogram musí být ukončen instrukcí ret ;nejaky kod rcall cekej ;nejaky kod ;Podprogram cekej cekej: ldi delay,0xff

hop2: ldi delay2,0xff dec delay2 brne hop2 dec delay brne hop ret call k icall o absolutní volání podprogramu, PC = k o dovoluje volat podprogram v celém rozsahu paměti programu (4M slov nebo-li 8MB) o vykonání instrukce trvá 4 takty, délka instrukce 2 slova (4 bajty) o jen u řady ATmega (mimo ATmega8) o nepřímé volání podprogramu pomocí registru Z, PC = Z o dovoluje volat podprogram v rozsahu paměti 64k slov (128kB) o vykonání instrukce trvá 3 nebo 4 takty, délka instrukce 1 slovo (2 bajty) rjmp k o relativní odskok na adresu k, PC = PC + k + 1 o absolutní adresu spočítá překladač o dovoluje skoky v rozsahu paměti PC 2K + 1 a PC + 2K (slov) o vykonání instrukce trvá 2 takty, délka instrukce 1 slovo (2 bajty) jmp k o absolutní skok na adresu k, PC = k o dovoluje skákat v celém rozsahu paměti programu (4M slov nebo-li 8MB) o vykonání instrukce trvá 3 takty, délka instrukce 2 slova (4 bajty) o jen u řady ATmega (mimo ATmega8) ijmp o nepřímé skok registru Z, PC = Z o dovoluje skok v dolních 64k slovech (128kB) programové paměti o vykonání instrukce trvá 2 takty, délka instrukce 1 slovo (2 bajty)