Professional Documents
Culture Documents
AVR-Mikrokontrollerien Assembler-Ohjelmointi, Johdanto/kertaus (Short Summary of ATMEL AVR Topics, in Finnish)
AVR-Mikrokontrollerien Assembler-Ohjelmointi, Johdanto/kertaus (Short Summary of ATMEL AVR Topics, in Finnish)
Assembler-ohjelmointi,
kertaus
A. Karttunen,
Metropolia,
Mikroprosessoritekniikka,
2. joulukuuta 2011
AVR-kertaus (1)
AVR-mikrokontrollerit
• Atmelin AVR-sarjan mikrokontrollerit sisältävät 8-
bittisen, melko tyypillisen ”RISCimäisen”
keskussuorittimen (CPU:n), joissa pienehkö määrä
SRAM-muistia on integroitu itse piiriin mukaan, ja
I/O-nastoissa on monia erityisominaisuuksia, jotka
helpottavat erilaisten laitteiden ohjausta.
• Käskyjen suoritus on ”kevyesti liukuhihnoitettu”
(liukuhihnassa vain kaksi vaihetta, ”fetch” ja
”execute”), vailla sofistikoituneempia piirteitä kuten
branch-käskyjen ennakointia, superskalaarisuutta,
yms.
AVR-kertaus (2)
AVR:n CPU:n rakenne
Oheinen kaavio esittää AVR ATmega32-mikrokontrollerin
CPU-osaa. Siitä assembler-ohjelmoijalle näkyvät vain:
XL
XH
YL
YH
ZL
ZH
AVR-kertaus (4)
Konekielen käskyt
• Konekielinen ohjelma koostuu useista, toinen toisensa jälkeen erittäin nopeasti suoritettavista
käskyistä.
• Käskyt voivat operoida joko CPU:n rekistereillä ja/tai sen status-rekisterin lipuilla, siihen
dataväylän kautta kytketyn I/O-avaruuden I/O-rekistereillä tai saman väylän kautta kytketyn
staattisen RAM-muistin (SRAM) muistipaikoilla. Lisäksi hyppykäskyt vaihtavat tai saattavat
vaihtaa ohjelmalaskurin (PC) arvon joksikin muuksi kuin normaalisti seuraavaksi suoritettavan
välittömästi seuraavan käskyn osoitteen.
• Useimmat käskyt ovat erittäin yksinkertaisia, esimerkiksi: ”kopioi rekisterin sisältö toiseen”, ”laske
kaksi 8-bittistä lukua yhteen”, ”vähennä rekisterin sisältöä yhdellä”, ”vertaile kahden rekisterin
sisältöä”, ”hyppää toiseen kohtaa ohjelmassa mikäli edellisen vähennyslaskun tulos oli nolla, tai
vertailtavat rekisterit sisälsivät saman arvon”.
• AVR-mikrokontrollereissa käskyt ovat vakiolevyisiä, 16-bittiä (paitsi LDS, STS, CALL ja JMP-
käskyjen tapauksessa 32-bittiä, kun käskyn leveyteen lasketaan mukaan itse käskykoodia seuraava
16-bitin osoite).
• AVR, joka käyttää Harvard-arkkitehtuuria, lukee käskyt erillisen väylän kautta ohjelmamuistista,
yksi kuudentoista bitin sana kerrallaan.
AVR-kertaus (5)
ALU-käskyt, Aritmeettiset
Tärkeimmän ryhmän käskyjä muodostavat ne, joihin sisältyy jokin aritmeettinen
tai looginen laskutoimitus, ja jotka (useimmiten) asettavat statusrekisterin liput
tuloksen mukaan. Nämä voidaan jakaa seuraaviin ryhmiin:
http://users.metropolia.fi/~anttijka/AVR/AVR_liput_ja_branchit.pdf
AVR-kertaus (9)
Siirtokäskyt
• Käsky MOV Rd,Rs kopioi rekisterin Rs (lähderekisteri
eli ”source”) sisällön rekisteriin Rd (kohderekisteri eli
”destination”).
LDI R16,high(RAMEND)
OUT SPH,R16
LDI R16,low(RAMEND)
OUT SPL,R16
AVR-kertaus (17)
Pinon käyttö, Yleisimmät virheet
Pinoa käytettäessä yleisimmät ohjelmavirheet ovat:
• Pinon ylivuoto, ”Stack Overflow”. Syy: yleensä liikaa pusheja
suhteessa poppien määrään, tai esimerkiksi karannut rekursio.
• Pinon alivuoto, ”Stack Underflow”. Syy: yleensä liikaa poppeja
suhteessa pushien määrään.
• Pinon päällekirjoitushaavoittuvuus, eli ”Stack buffer overflow”,
mikä tarkoittaa sitä, että pinosta varattuun väliaikaiseen bufferiin (joka
on varattu esim. jotakin merkkijonoa varten) pystyy kirjoittamaan
enemmän dataa kuin sinne itse asiassa mahtuu, eikä ohjelma tarkista
mahtumista ajon aikana, joten ylimäärädatalla voidaan ylikirjoittaa
esimerkiksi pinossa oleva paluuosoite tai vastaava kriittinen tieto.
Yleinen huolimattomasti kirjoitetuissa C-kielisissä ohjelmissa.
• Aiheesta tarkemmin, katso kalvosarjasta
http://users.metropolia.fi/~anttijka/AVR/AVR_pino_ja_alirutiinit.pdf
kalvot 14-16.
AVR-kertaus (18)
Hyppykäskyt, ehdottomat
• Käskyt JMP OHJELMAOSOITE ja RJMP OHJELMAOSOITE
vaihtavat ohjelmalaskurin eli PC:n (”Program Counter”) sisällöksi
labelillä OHJELMAOSOITE: merkityn ohjelmamuistin kohdan.
Assembler-lähdekoodissa käskyjen syntaksi on sama, vaikka
käännetyssä koodissa edellinen muoto vie yhden 16-bittisen sanan
verran enemmän tilaa.