Adresace dat v paměti programu
Adresace dat v paměti programu: Pozor, adresa paměti programu je 16bitová, a každé návěští v paměti programu značí adresu šestnáctibitového slova. Chceme-li načítat data – konstanty (např. znaky řetězce) z paměti programu, načítáme pouze bajty, takže musíme spočítat adresu bajtu (proto 2*retez v následující ukázce).
Pro přístup do paměti programu lze použít pouze nepřímou adresaci pomocí registru Z a instrukci lpm (viz následující ukázka).
Pro práci s pamětí dat se používají jiné instrukce – viz adresace dat v paměti dat.
Paměť programu lze naplnit pouze konstantami a za běhu programu do ní nelze zapisovat.
Adresy v rozsahu 0-0xFF jsou rezervované pro vektory přerušení - nepoužívejte je tedy k ukládání dat.
.cseg ; nasledujici umistit do pameti programu (implicitni)
; Zacatek programu - po resetu
.org 0
jmp start
.org 0x100 ; od adresy 0x100 (adresy 0 - 0xFF nepouzivejte pro ukladani dat)
retez: .db "NEBUDE-LI PRSET NEZMOKNEM",0 ; retezec zakonceny nulou (nikoli znakem "0") 1
konstanta: .db 6 ; definice dalsi read-only konstanty v pameti programu (jeden bajt s hodnotou 6),
; pokud by byla potreba 1
start:
ldi r30, low(2*retez) ; 2
ldi r31, high(2*retez)
lpm r16, Z+ ; 3
; ... nejaka uzitecna cinnost ...
lpm r16, Z+ ; nahraj dalsi bajt (znak) z retezce do r16, posun pozici v retezci
; ...
end: jmp end- .db je tzv. direktiva pro překladač. Je to pokyn, aby následující hodnoty vzal jako seznam bajtů a uložil do paměti programu. Je možno zadat jednotlivé hodnoty bajtů oddělené čárkou, nebo i celý řetězec v uvozovkách.
- retez (resp. konstanta) je návěští (ukazatel) prvního znaku řetězce (resp. proměnné) - tj. "N" (resp. 6). Je to tedy konstanta, ze které překladač může vzít spodní bajt (low(2*retez)) a pomocí ldi ho uložit do registru r30. Obdobně horní bajt (high(2*retez)) a registr r31.
- Registr Z je 16bitový registr sloužící pro adresaci paměti, který je namapován na registry r31 a r30. Pro jeho naplnění je potřeba použít dvě instrukce ldi, protože AVR pracuje s 8bitovými daty. Instrukce lpm r16, Z+ nahraje jeden bajt (znak), na který ukazuje Z, do registru a zároveň inkrementuje Z. AVR obsahuje i další instrukce, které lze použít přímo s dvojicí registrů (tj. i se Z) a to jak nahrávací/přesouvací, tak i aritmetické – viz přehled instrukcí.