Programování v Assembleru

Stránky se budou věnovat programování v Assembleru



Vzhled a struktura programu

Při psaní jakéhokoliv programu je důležité, aby výsledný program byl pokud možno přehledný a pochopitelný. Tomu můžeme napomoci vzhledem a strukturou zdrojového textu.
Proto je vhodné vytvořit hlavičku, ve které popíšeme, k čemu má program sloužit, uvedeme autora a datum vzniku.
Hlavičku vytvoříme pomocí textu zapsaného za středník (;). Například:


;***program pro ukazku, miloslav siroky, 25.10.2005***


Veškerý text za středníkem je vlastně komentář, lze tedy používat i české znaky, ale vzhledem k potřebě používání speciálních znaků z anglické klávesnice pro psaní zdrojového textu, doporučuji nepoužívat české znaky ani v hlavičce, ani v komentářích.

Vlastní zdrojový text programu je vhodné strukturovat do čtyř sloupců, vzájemně oddělených jedním nebo více tabulátory. Strukturování do řádků je nutné, neboť každá instrukce musí být na zvláštním řádku. K odělení různých funkčních bloků je vhodné použít prázdný řádek.
Do prvního sloupce potom píšeme návěští, do druhého instrukce, do třetího operandy a do čtvrtého komentáře. Psaní komentářů sice není zcela nutné, ale slouží pro lepší přehled. Také platí, že program bez komentářů může být po nějakém čase nepochopitelný i pro jeho autora.

Mezi hlavičku a první instrukci programu píšeme direktivy. Musí zde být nastaven počátek direktivou ORG na adresu 00h, neboť na této adrese musí být první instrukce programu.

Příklad:

;***toto je priklad vzhledu a struktury programu******
;***autor: miloslav siroky, vytvoreno 25.10.2005******



start:




org

mov
mov
clr

end
00h

a,#123
r0,a
a


;nastaveni pocatku programu

;zapsani prime ciselne hodnoty 123 do akumulatoru
;presunuti obsahu akumulatoru do registru r0
;vynulovani obsahu akumulatoru
;prazdny radek pro oddeleni
;konec programu

Několik příkladů programů

Program pro převrácení čísla, vstupní registr r0, cílový r1
Program má za úkol přesunout hodnoty bitů z registru r0 do registru r1 v obráceném pořadí, čili hodnota z nejnižšího bitu r0 se přesune na nejvyšší bit r1, z druhého nejnižšího na druhý nejvyšší, až do přesunutí všech 8.bitů.

;***program pro prevraceni bitu, vstupni registr r0, cilovy r1***
;*********autor: miloslav siroky, vytvoreno 25.10.2005***********







start:










org

mov
mov

mov
rrc
mov
mov
rlc
mov
djnz


end

00h

r0,#123
r2,#8

a,r0
a
r0,a
a,r1
a
r1,a
r2,start




;nastaveni pocatku programu
;prazdny radek pro oddeleni bloku
;vlozeni prime ciselne hodnoty do registru r0
;do registru r2 vlozime cislo
;pro pocet opakovani cyklu
;presunuti obsahu registru r0 do akumulatoru
;rotace akumulatoru vpravo pres bit C v registru PSW
;presunuti rotovaneho cisla zpet do registru r0
;presunuti obsahu registru r1 do akumulatoru
;rotace akumulatoru vlevo pres bit C v registru PSW
;presun rotovaneho cisla zpet do registru r1
;opakovani cyklu dle obsahu registru r2
;instrukce djnz odecte od obsahu registru 1
;a skoci, neni-li roven 0
;konec programu


Vytvoření zpožďovací smyčky
Pro vytvoření zpožďovací smyčky si musíme nejdříve uvědomit několik věcí:
Musíme znát pracovní frekvenci, pro příklad budeme uvažovat, že f=12MHz
Jeden strojový cyklus trvá 12 hodinových cyklů
Každá instrukce trvá jeden a více strojových cyklů

Protože zpožďovací smyčku využíváme během provádění programu opakovaně, je vhodné, vytvořit ji jako podprogram, který v potřebných místech programu zavoláme instrukcí CALL
Nesmíme zapomenout, že podprogram musí být ukončen instrukcí pro návrat z podprogramu RET.

Nyní vytvoříme podprogram zpožďovací smyčky v trvání cca 1ms.
Výsledný čas nebude zcela přesný, protože budeme počítat jen dobu trvání některých instrukcí.
Rozdíl několika mikrosekund ale není pro běh většiny programů podstatný.

Použijeme registry r7 a r6 a instrukci pro podmíněný skok DJNZ.Tato instrukce decrementuje obsah registru a skočí, není-li roven nule.
Instrukce DJNZ trvá dva strojové cykly, tedy pro f=12MHz je doba jejího provádění 2 mikrosekundy.

;***zpozdovaci smycka 1ms, autor: miloslav siroky, vytvoreno 25.10.2005******

delay1ms:
sm1ms:








mov
mov
djnz

djnz




ret
r7,#2
r6,#250
r6,$

r7,sm1ms





;vlozeni prime ciselne hodnoty do registru r7
;vlozeni prime ciselne hodnoty do registru r6
;obsah r6 se decrementuje, dokud
;neni roven 0, cca 0,5ms
;obsah r7 se decrementuje a skoci
;na znovunaplneni registru r6,
;ve vysledku tedy nasobime dobu
;provadeni djnz s registrem r6
;cislem v registru r7
;navrat z podprogramu


Jelikož zpožďovací smyčku používáme v různých programech, je výhodné, vytvořit ji jako soubor s příponou .inc a do programu ji vkládat pomocí direktivy include. Také je vhodné v podprogramu zpoždění použít jinou banku registrů. Pozor na nutnost přepnout banku registrů zpět před návratem z podprogramu!

Vložení souboru pomocí direktivy include:

include(del.inc)

;****podprogram zpozdeni cca 0.5 s, ulozen jako del.inc pro vlozeni direktivou include****


del:



sma:
smb:






setb
clr

mov
mov
mov
djnz
djnz
djnz
clr
clr
ret
rs0
rs1

r7,#4
r6,#250
r5,#250
r5,$
r6,smb
r7,sma
rs0
rs1

;nastaveni banky registru pomoci bitu
;rs1 a rs0 v registru PSW
;na banku 1






;nastaveni banky registru
;zpet na banku 0
;navrat z podprogramu

Soubory pro vkládání můžeme vytvořit v jakémkoli textovém editoru, pouze pak přepíšeme název. Přípona .inc je nutná!