Professional Documents
Culture Documents
AVR Osoitusmuodot (ATMEL AVR Adressing Modes, A Short Intro With Examples, 26 Slides)
AVR Osoitusmuodot (ATMEL AVR Adressing Modes, A Short Intro With Examples, 26 Slides)
osoitusmuodot
A. Karttunen,
Metropolia,
Mikroprosessoritekniikka,
6. marraskuuta 2011
AVR-mikrokontrollerien
Data-avaruus
Esimerkki:
MOV Rd,Rr
KOPIOI (ei ”siirrä”!) rekisterin Rr
sisältö rekisteriin Rd:
Rd ← Rr
Lähde: http://www.atmel.com/dyn/resources/prod_documents/doc0856.pdf
Huom! Käskyjen esitystapa yllä yksinkertaistettu, Rd ja Rr oikeasti ”sikinsokin”.
AVR:n osoitusmuodot (3),
rekistereiden esitys
konekielikäskyissä
15-12 11-8 7-3 3-0
Yksioperandisia ASR Rd 1001 010d dddd 0101
(esimerkkejä):
COM Rd 1001 010d dddd 0000
SWAP Rd 1001 010d dddd 0010
Huom! Tuo
on harhaanjohtavaa.
Oikea käskyn ja
osoitteen koodaustapa
on tässä: ↓ ↓ ↓
LDS, 32-bit
opcode:
STS, 32-bit
opcode:
• Kaikkien X:n, Y:n ja Z:n ala- ja ylätavuun voidaan lisäksi viitata tyyliin XL ja XH, joten
seuraavat yhtäläisyydet pätevät: XL=R26, XH=R27, YL=R28, YH=R29,
ZL=R30, ZH=R31. Alatavu kertoo 16-bittisen data-osoitteen alemmat kahdeksan
bittiä (bitit 0-7), ja ylätavu ylemmät kahdeksan bittiä (bitit 8-15). (AVR:ssä käytetään
ns. “little-endian” tavujärjestystä.)
AVR:n osoitusmuodot (9),
epäsuora viittaus dataan
Esimerkkejä:
LD R0,Y ;; Lataa indeksirekisterin Y kertomasta osoitteesta (= 256*R29 + R28)
yhden tavun, ja laittaa sen rekisteriin R0.
ST Z,R0 ;; Sijoittaa R0-rekisterin sisällön indeksirekisterin Z kertomaan osoitteeseen
(joka on 256*R31 + R30).
Ylläolevat käskyt vastaavat C-kielen (char *)-pointterin ”deferencing-operaatiota”, eli
”fetchausta”: r0 = *y; ja ”indirect assignmenttia”: *z = r0;
AVR:n osoitusmuodot (10),
epäsuora data, pre-decrement
Käskyyn on koodattu mukaan kuuden bitin ”siirre” (engl. ”displacement”), joka lisättynä
Y tai Z-rekisterin sisältöön, antaa sen tavun osoitteen mikä ladataan tai mihin tavu
talletetaan. Voidaan käyttää vain käskyissä LDD ja STD!
Esimerkiksi jos Z-rekisterissä on pointteri merkkijonon alkuun, niin käsky LDD R0,Z+3
vastaa C-kielen käskyä r0 = *(z+3); eli käskyä r0 = z[3]; missä z on määritelty
esim näin: register char *z;
Voidaan käyttää myös C-kielen struct-keywordilla luotuja tietueita käsiteltäessä,
ensimmäisen kentän jäljessä tulevien kenttien lukuun ja kirjoitukseen.
AVR:n osoitusmuodot (13),
ADIW ja SBIW-käskyt
epäsuorilla viittauksilla
• Edellistä osoitusmuotoa käytettäessä saattaa tulla tilanne, jossa indeksirekisteriä
pitäisi lisätä (tai vähentää) enemmän kuin yhden askeleen (tavun) verran.
Esimerkiksi mikäli data-muistissa on useampia tietueita peräkkäin, niin kyseisen
tietueen koon (C-kielellä ilmaistuna: sizeof(struct tietue)) verran
eteenpäin. Tähän sopivat seuraavat kaksi käskyä:
LPM Rd,Z ;; Lataa ohjelmamuistin Z:nnen tavun rekisteriin Rd. CPU osaa tehdä tämän
automaattisesti , vaikka ohjelmamuisti onkin organisoitu 16-bittisesti.
AVR:n osoitusmuodot (16),
vakiotavun haku z:n avulla
ohjelmamuistista, post-incr.
LPM Rd,Z+ ;; Lataa ohjelmamuistin Z:nnen tavun rekisteriin Rd, ja lisää sen jälkeen Z:aa
yhdellä. Kätevä haettaessa suurempia määriä dataa koodimuistista.
AVR:n osoitusmuodot (17),
Z-rekisterin alustus LPM-
käskyä käytettäessä
• LPM-käskyä varten ohjelmamuistin osoite pitää
muuntaa tavuosoitteeksi, kertomalla se kahdella.
• Assembler osaa tehdä muunnoksen käännösaikana
ekspressiolla << (eli C-kielestä tuttu ”shift left”).
Lisäksi Z-rekisteri pitää alustaa kahdessa palassa:
Siirre k on upotettu käskyn kahteentoista alimpaan bittiin (bitit 0-11, eli kolme
oikeanpuoleisinta ”nybbleä” tai heksadigittiä), ja vasemmanpuoleisin nybble
kertoo opcoden: RJMP = 1100 = C ja RCALL = 1101 = D.
Siirre k tulkitaan ”signed integerinä”, eli sen avulla voi maksimissaan viitata 2^11 sanaa
taaksepäin PC+1:stä (eli minimiosoite PC-2047) ja korkeintaan 2^11 – 1 sanaa eteenpäin
PC+1:stä (eli maks.osoite on PC+2048), missä PC tässä tarkoittaa RJMP tai RCALL-käskyn
osoitetta. Esimerkiksi itseensä hyppäävä relatiivinen hyppy koodautuu aina samaksi sanaksi:
I_LOOP: RJMP I_LOOP ; Assembloituu koodiksi 0xCFFF koska k = -1.
AVR:n osoitusmuodot (21),
Lyhyt relatiivinen hyppy
ehdollisille haaraumille
• Tämä helpottaa asioita esimerkiksi silloin, jos halutaan tuottaa koodia ns.
”jaetuksi kirjastoksi” (eli Unixeissa ”shared libraries”, lib*.so). Mikäli aihe
kiinnostaa enemmän, katso:
http://en.wikipedia.org/wiki/Position-independent_code