©Hana Kubátová, Martin Novotný
8. Laboratoř: Aritmetika a programu Programy v JSA – aritmetika, posuvy, využití p
Navrhněte a simulujte v AVR studiu prográmky pro 24 bitovou (32 bitovou) aritmetiku: sčítání, odčítání, aritmetický posuv vpravo, vlevo, násobení malou konstantou (2 až 5). Využijte instrukce ADD, ADC, SUB, SBB, podmín
Archi tektura mikropoAVR Studio
Prezentace: sap-avr2.pdf
Kompletní instrukční sadu (anglicky) najdete v
Bodované úlohy:
Úkol 1: Spočítejte následující výraz
R20 = (4 * R16 + 3 * R17 - R18) / 8
LDI R16, 5 LDI R17, 10 LDI R18, 58 ... dopl ňte instrukce ...
• Operandy jsou 8-bitové, výsledek 8bitové.
• Výraz by měl být spočítán bitových registrů), program by m
Úkol 2: Napište program, který zobrazí na displeji zadané soustavě
• Použijte knihovny pro práci s displejem z minulého cvi• Použijte instrukce pro posuv a masko• Použijte porovnání a sč
‘0’ je 48)
Úkol 3: Napište program, který seinformaci o správnosti výsl
• čísla považujte jednak za doplňkovém kódu
©Hana Kubátová, Martin Novotný FIT, ČVUT v Praze
ř: Aritmetika a řídicí struktury
aritmetika, posuvy, využití příznaků
te a simulujte v AVR studiu prográmky pro 24 bitovou (32 bitovou) aritmetiku: ítání, aritmetický posuv vpravo, vlevo, násobení malou konstantou (2 až 5).
Využijte instrukce ADD, ADC, SUB, SBB, podmíněné skoky. Pracujte s registry.
tektura mikropo čítače AVR, vývojové prost
(anglicky) najdete v odkazech. Viz též přehled instrukcí
ítejte následující výraz
R18) / 8
te instrukce ...
bitové, výsledek 8-bitový, veškeré mezivýsledky udržujte také 8
l být spočítán správně. Pokud nelze výraz správně spoč), program by měl toto indikovat (např. nastavením
Úkol 2: Napište program, který zobrazí na displeji zadané číslo v šestnáctkové
Použijte knihovny pro práci s displejem z minulého cvičení. Použijte instrukce pro posuv a maskování, abyste dostali jednu šestnáctkovou Použijte porovnání a sčítání, abyste z číslice vytvořili ASCII znak (kód ‘A’ je 65, kód
Úkol 3: Napište program, který sečte dvě 32 bitová čísla a zobrazí na displeji informaci o správnosti výsledku
ísla považujte jednak za čísla nezáporná (bez znaménka) a jednak za
ídicí struktury
te a simulujte v AVR studiu prográmky pro 24 bitovou (32 bitovou) aritmetiku: ítání, aritmetický posuv vpravo, vlevo, násobení malou konstantou (2 až 5).
né skoky. Pracujte s registry.
e AVR, vývojové prostředí
ehled instrukcí (česky)
bitový, veškeré mezivýsledky udržujte také 8-
ě spočítat (s použitím 8-. nastavením V flagu).
číslo v šestnáctkové
vání, abyste dostali jednu šestnáctkovou číslici ili ASCII znak (kód ‘A’ je 65, kód
ísla a zobrazí na displeji
ísla nezáporná (bez znaménka) a jednak za čísla v
©Hana Kubátová, Martin Novotný
• na displeji zobrazte buďdoplňkovém kódu nebo carry (CARRY) v pnejvyšší bit (signalizace, že v pnevešel do registrů) nebo nulu (0) v p
Trocha teorie
Jazyk symbolických instrukcí
Instrukce - mnemonika, operandy
Příklady:
Jméno instrukce (mnemonika)
Operandy
add r2, r3
sts 0x123, r5
ldi r16, 0x23
Pseudoinstrukce - direktivy
Pseudoinstrukce se nepřekládají (a tedy ani nevykonávají). Pseudoinstrukceto příkazy pro překladač.
Příklady:
Pseudoinstrukce (direktiva) .cseg
.dseg
.org a
.byte n
.db <seznam>
.db 0x12, 223, 'A', ″baf“
.db 18, 0xDF, ″Ab“, 0x61, 0x66
Komentáře
Od středníku do konce řádku
add r1, r2 ;TOTO
Návěští
Identifikátor zakončený dvojtečidentifikátoru je nahrazeno číslem odpovídajícím adrese.
©Hana Kubátová, Martin Novotný FIT, ČVUT v Praze
na displeji zobrazte buď hlášku overflow (OVER), pokud došlo k přkovém kódu nebo carry (CARRY) v případě, že k přetečení nedošlo, ale vypadl
ejvyšší bit (signalizace, že v případě interpretace čísel jako nezáporných se výsledek ů) nebo nulu (0) v případě, že se nenastavil ani příznak C, ani V.
Jazyk symbolických instrukcí - asembler
operandy
direktivy
ekládají (a tedy ani nevykonávají). Pseudoinstrukce
) Význam umístit do paměti programu (code segment
umístit do paměti dat (data segment)
pokračovat na adrese a
rezervovat n bytů (pro proměnnou)
Ab“, 0x61, 0x66
definovat hodnotu bytů v paměti jako <seznam>, napvlevo uvedené příklady definují stejné hodnoty
;TOTO JE KOMENTÁŘ
ený dvojtečkou, označuje adresu. Každé další použití tohoto číslem odpovídajícím adrese.
hlášku overflow (OVER), pokud došlo k přetečení v
ení nedošlo, ale vypadl ísel jako nezáporných se výsledek
, že se nenastavil ani příznak C, ani V.
ekládají (a tedy ani nevykonávají). Pseudoinstrukce řídí překlad - jsou
code segment)
ti jako <seznam>, např. íklady definují stejné hodnoty
uje adresu. Každé další použití tohoto
©Hana Kubátová, Martin Novotný
navesti: ...
Překlad assembler -> strojový kód
• Jméno instrukce (mnemonika) • Kódování parametrů instrukce • Výpočet adres z návěští
Adresace paměti dat
• Přímá adresace - adresa je souNapř.
sts 0x123, r5 lds r18, 0x100
S návěštím
sts promenna, r20 lds r19, promenna
• Nepřímá adresace - přes indexregistryo Indexregistry:
X = (r27, r26) Y = (r29, r28) Z = (r31, r30)
o Možnost pre-dekrementace (Např.
ldi r28, 0x12 ldi r29, 0x01 ld r1, Y st Y+, r5
Příklad
.dseg
.org 0x100 procesor) prom1: .byte 1 prom2: .byte 2 .cseg .org 0 jmp start .org 0x100 start: ; do promenne muzeme ulozit cislo pres registr: ldi r16, 0x12 sts prom1, r16 ; ... lds prom1, r2 ; ...
©Hana Kubátová, Martin Novotný FIT, ČVUT v Praze
> strojový kód
Jméno instrukce (mnemonika) → operační znak ů instrukce ěští
ěti dat
adresa je součástí instrukce
0x123, r5 r18, 0x100
promenna, r20 r19, promenna
přes indexregistry X, Y, Z, instrukce ld, st
dekrementace (-X, …) a post-inkrementace (X+, …)
r28, 0x12 r29, 0x01 ; Y = 0x0112
; load ; store (post-increment)
; pamet dat ; od adresy 0x100 (implicitni pro nas
; v pameti dat muzeme deklarovat promenne; jednobajtova promenna ; dvoubajtova promenna
; nasledujici umistit do pameti programu ; zaciname od adresy 0 (implicitni)
; do promenne muzeme ulozit cislo pres registr: r16, 0x12 prom1, r16
prom1, r2
inkrementace (X+, …)
; od adresy 0x100 (implicitni pro nas
; v pameti dat muzeme deklarovat promenne
do pameti programu ; zaciname od adresy 0 (implicitni)
©Hana Kubátová, Martin Novotný
ldi r28, low(prom2) ldi r29, high(prom2) ld r1, Y st Y+, r5 end: jmp end
Adresace paměti programu
Adresace programu v paměti programu
• Přímá absolutní: jmp , • Přímá relativní: rjmp , • Nepřímá: ijmp , icall (podle Z)
Adresace dat v paměti programu (konstanty): Pozor, pamnávěští v paměti programu značkonstanty (např. řetězce) z paměadresace, lpm.
.cseg ; nasledujici umistit do pameti programu (implicitn i)
.org 0 ; zaciname od adresy 0 (implicitni) jmp start .org 0x100 retez: .db "Toto je muj retezec",0 ;... start: ldi r30, low(2*retez) ldi r31, high(2*retez) lpm r16, Z+ r16, posun pozici v retezci ; ... nejaka uzitecna cinnost ... lpm r16, Z+ do r16, posun pozici v retezci ; ... end: jmp end
Podprogramy - instrukce "call", "ret"
Volání podprogramu: call adresa
• Uloží na zásobník obsah registru PC (který momentáln„call“)
o Nejdřív nižší bajt, pak vyšší bajt • Skočí na adresu podprogramu, tj. do PC nahraje adresu, která je parametrem instrukce
„call“
Návrat z podprogramu: ret
©Hana Kubátová, Martin Novotný FIT, ČVUT v Praze
r28, low(prom2) ; neprime adresovani r29, high(prom2)
; load ; store (post-increment)
ěti programu
ěti programu - skoky, volání podprogramů.
, call , rcall , podmíněné skoky breq, brne, … (podle Z)
ti programu (konstanty): Pozor, paměť programu je 16bitová, a každé ti programu značí adresu šestnáctibitového slova. Chceme-li na
zce) z paměti programu, musíme spočítat adresu bajtu
; nasledujici umistit do pameti programu (implicitn i); zaciname od adresy 0 (implicitni)
"Toto je muj retezec",0 ; retezec zakonceny nulou
r30, low(2*retez) ; dolni bajt bajtove adresy retezcer31, high(2*retez) ; horni bajt bajtove adresy retezce
; nahraj bajt (znak) z retezce do r16, posun pozici v retezci
; ... nejaka uzitecna cinnost ... ; nahraj dalsi bajt (znak) z retezce
do r16, posun pozici v retezci
instrukce "call", "ret"
Volání podprogramu: call adresa
Uloží na zásobník obsah registru PC (který momentálně ukazuje na první instrukci za
ív nižší bajt, pak vyšší bajt í na adresu podprogramu, tj. do PC nahraje adresu, která je parametrem instrukce
Návrat z podprogramu: ret
programu je 16bitová, a každé li načítat data -
adresu bajtu. Jen nepřímá
; nasledujici umistit do pameti programu (implicitn i)
; retezec zakonceny nulou
; dolni bajt bajtove adresy retezce ; horni bajt bajtove adresy retezce
; nahraj bajt (znak) z retezce do
; nahraj dalsi bajt (znak) z retezce
ukazuje na první instrukci za
í na adresu podprogramu, tj. do PC nahraje adresu, která je parametrem instrukce
©Hana Kubátová, Martin Novotný
• Vybere ze zásobníku adresu a uloží ji do PC pokračuje na adrese za volající instrukcí „call“.
Předávání parametrů:
• Přes registry - rychlé, omezený po• Na zásobníku - flexibilní, pomalejší • V paměti v globální prom• V paměti s předáním ukazatele
Příklad
; podprogram s predavanim parametru a navratove; vypocita prumer r16 a r17, vraci v r16prumer: add r16, r17 asr r16 ret ... ldi r16, 13 ldi r17, 16 call prumer ; vrati se s r16=14 ldi r16, 8 ldi r17, 12 call prumer ; vrati se s r16 ...
Čekací smyčky
V Javě/C++:
for (i=0; i<120; i++) {}
V asembleru AVR:
ldi r20, 120 cek: dec r20 brne cek
Jiný způsob:
clr r16 ldi r17, 100 cycle: inc r16 cpse r16, r17 ; compare and skip if equal jmp cycle
Dvě vnořené čekací smyčky nap
ldi r21, 33 cek2: ldi r20, 120
©Hana Kubátová, Martin Novotný FIT, ČVUT v Praze
Vybere ze zásobníku adresu a uloží ji do PC - tím je proveden návrat, bna adrese za volající instrukcí „call“.
rychlé, omezený počet flexibilní, pomalejší
ti v globální proměnné edáním ukazatele
; podprogram s predavanim parametru a navratove hodnoty pres registry; vypocita prumer r16 a r17, vraci v r16
; aritmeticky posuv doprava
; vrati se s r16=14
cpse r16, r17 ; compare and skip if equal
ky např.:
tím je proveden návrat, běh programu
hodnoty pres registry
©Hana Kubátová, Martin Novotný
cek: dec r20 brne cek dec r21 brne cek2
©Hana Kubátová, Martin Novotný FIT, ČVUT v Praze