`-:+shddddddyo:`
.yNMmdyomMh:/+sdNMy`
:NMs. +Mm .hMm.
-NM+ :MN hMh
hMh :- `NMo
`MM- /MM.
-MM: mMo
-MMNy:` .dMN.
-MMydNNdys++///////osdNNMM
`MM.`.:+oyyhhhhhhhhhyo::MM
MM. `MM.
MM- `MM.
mM: :MM.
mM: .MM-
NM: +MM-
MM- hMy
MM. mM+
.MM. `MM-
/MN -MM
`.:+ossss+-` oMh +Mm `.......`
`:ymmmdysosydNd- hMs yMy .+hdmddddmmdhs/.
-hMd+-` `oMN:NM/ `NM:`omNh/-.....-/shNmo`
-NMs` oMNMM. -MM/mMh- -dMh`
hMy yMMM` +MMNN+` `dMy
mM/ `NMN sMMd. .NM+
mM: hMd hMN. +Mm
mM: :y+ mMo .MM:
dMo :/` dMo
+Mm` sMh
`dMy yMy
.mMy` /NM/
`hMy -yMN/
-` ://--.:+hMNs`
ydmNNNNdy+`
Ćwiczenie 5:
zad 1:
Zapoznać się z działaniem asemblera wykonując prosty program przepisania zadeklarowanej przez siebie liczby bajtów z obszaru pamięci począwszy od adresu 6000H do obszaru od adresu 7000H
Program wraz z komentarzami
LD DE,7000 wczytuje do rejestru DE wartosc 7000 w zapisie 16. jest to nasz adres docelowy
LD HL,6000 wczytuje do rejestru HL wartosc 6000, adres zrodlowy
LD B,09 ustawia wartosc rejestru B na 9. jest to ilosc bajtow do skopiowania (tu wpisz dowolna wartosc, np. 03, 04, FF itp)
JP Z,0013 skok warunkowy do adresu 0013 w przypadku gdy flaga Z jest aktywna. w tym programie jezeli wartosc B jest rowna zero skacze do 00013, jezeli nie, olewa. jest to warunek pętli
LD A,(HL) wczytuje do akumulatora dane z adresu znajdujÄ…cego siÄ™ w rejestrze HL
LD (DE),A zapisuje do adresu w rejestrze DE dane z akumulatora
INC HL zwieksza rejestr HL o 1, czyli nasz adres zrodlowy
INC DE zwieksza rejestr DE o 1, czyli adres docelowy
DEC B zmniejsza B o 1, czyli ilosc bajtow pozostala do skopiowania
JP 0008 skok bezwarunkowy do adresu 0008, pętla.
HALT koniec programu
Co i jak:
Wstukaj do głownego okienka kod programu (podswietlasz kazdą linijkę, wciskasz enter, wpisujesz komende, zatwierdzasz enterem); wyzeruj rejestry (przejdź do okienka z rejestrami (wciskaj tab az ci sie zaznaczy to po prawej), podswietl kolejno kazdy rejestr i wpisz mu wartosc 0); przejdz do okienka z danymi, wcisnij ctrl+g, podaj adres 6000, wpisz dowolne dane, np. 0a, 12, ff, ac itp.., ctrl+g i przejdz do adresu 7000. przejdz do glownego okienka, podswietl pierwsza linijke, naciskaj F8. program bedzie wykonywac sie linijka po linijce az skopiuje okreslona liczbe bajtow. na dole w okienku bedzie widac jak bajty przeskakuja. jezeli chcesz odpalic program jeszcze raz, to wyzeruj rejestry i zawartosc adresu 7000.
Pytania kontrolne:
Sposób adresowania pamięci (od 0000 do FFFF w zapisie 16, zazwyczaj instrukcja zajmuje jeden bajt, ale niektore maja po 2-3 bajty)
Co oznacza dana komenda (patrz komentarze)
Ogólna zasada działania programu (najpierw ustawia wymagane zmienne: adres zrodlowy, docelowy, ilosc bajtow. w petli pojedynczo kopiuje bajty, zwieksza adresy i zmniejsza liczbe bajtow, az liczba pozostlaych bajtow jest rowna zero
Ile bajtów ma skopiowac program? (w tym przypadku 9 - patrz LD B,09. liczy od 9 do zera)
Czym sa poszczegolne rejestry? A - akumulator - tylko na nim mozna wykonywac obliczenia. B,C,D,E - zwykle rejestry, uzywamy pary DE do adresowania. HL rejestry adresowe. PC - program counter - ustala, w ktorej linijce programu aktualnie jestesmy. SP - stack pointer - wskazuje pozycje na stosie (nie interesuej nas). F - rejestr flagowy, oznacza poszczegolne flagi (np. czy bajt jest parzysty, dodatni, czy operacja porownania zwrocila wynik prawdziwy)
zad 2:
Opracować program w asemblerze Z80:
- wprowadzający do kolejnych komórek dane: 0E, 0C, 0A, 08, 06, 04, 02
- obliczajÄ…cy sumÄ™ jakÄ… reprezentujÄ… wprowadzone dane
- wynik umieścić w pamięci
Program:
LD HL,7000 wcztuje do rejestru HL wartosc 7000 - adres zrodlowy
LD A,00 zeruje akumulator
LD B,(HL) wczytuje do rejestru B wartosc z adresu w rejestrze HL
CP B sprawdza, czy B=A ( czy b jest rowne 0 ) - akurat to mozna wyjebac
JP Z,0014 jezeli flaga Z jest ustawiona, to przeskakuje na koniec programu do zapisywania wyniku (tez mozna wyjebac)
ADD A,B dodaje A+B
INC HL zwieksza HL o 1 - przesuwa adres zrodlowy
LD C,A zapisuje do rejestru C wartosc akumulatora
LD A,00 zeruje akumulator
CP B sprawdza czy A=B
LD A,C wczytuje do akumulatora wartosc rejestru C
JP NZ,0005 jezeli B (dodawany bajt) nie jest rowne 0 wraca do poczatku programu i wczytuje kolejny bajt. jest to warunek petli
LD (7010),A zapisuje wartosc akumulatora pod adresem 7010 - zapisuje wynik obliczen
HALT koniec programu
Co i jak:
To zadanie troche zjebalem, bo zapomnialem dodac wpisywanie tych bajtow 0E, 0C... i wpisalem je recznie. do tego dwie instrukcje sa zbedne. jak chcecie zaszalec, to poprawcie.
Ogolnie powinno byc tak, ze na poczatku programu trzeba dopisac
LD (7000),0E zapisuje do adresu 7000 wartosc 0E
LD (7001),0C zapisuje do adresu 7001 wartosc 0C
LD (7002),0A zapisuje do adresu 7002 wartosc 0A
LD (7003),08 zapisuje do adresu 7003 wartosc 08
LD (7004),06 zapisuje do adresu 7004 wartosc 06
LD (7005),04 zapisuje do adresu 7005 wartosc 04
LD (7006),02 zapisuje do adresu 7006 wartosc 02
ale ja za to nie recze, bo nie mam przy sobie symulatora 8080 i nie wiem, czy taka operacja jest dopuszczona.
jezeli nie bedzie dzialac, to trzeba zrobic:
LD A,0E wczytuje do akumulatora wartosc 0E
LD (7000),A zapisuje wartosc akumulatora do adresu 7000
LD A,0C
LD (7001),A
LD A,0A
LD (7002),A
LD A,08
LD (7003),A
LD A,06
LD (7004),A
LD A,04
LD (7005),A
LD A,02
LD (7006),A
i to juz powinno dzialac na 100%
jezeli dodasz do programu te linijki, to wiedz, ze zmienia sie adresy w programie i musisz recznie poprawic skoki:
JP Z,0014 ustaw tak, aby wskazywal na adres instrukcji: LD (7010),A. np. JP Z,001A
JP NZ,0005 ustaw tak, aby wskazywal na LD B,(HL) np. JP NZ,000B
Ogólna zasada działania programu
Zapisuje poczawszy od adresu 7000 kolejno bajty: 0E, 0C, 0A, 08, 06, 04, 02
wczytuje do rejestru HL adres zrodlowy
wczytuje do rejestru B bajt, ktory ma byc dodany
wchodzi w petle, dodaje do akumulatora wartosc wczytanego bajtu
zapisuje wartosc akumulatora do tymczasowej zmiennej C
sprawdza, czy czy wczytany bajt jest rowny 0
(w asm 8080 operacje porownania mozna wykonywac tylko na akumulatorze i jednym rejestrze, dlatego musialem zwolnic akumulator)
przywraca poprzednia wartosc akumulatora
jezeli bajt nie jest rowny zero, to powraca do poczatku i wczytuje nastepnty bajt - program wykonuje petle
jezeli bajt jest rowny zero, to zapisuje wynik pod adresem 7010
Pytania kontrolne:
to samo co w pierwszym zadaniu +
jaka powinna byc suma? (56 w zapisie dziesietnym, 38 w zapisie szesnastkowym. trzeba umiec przy niej przeliczac liczby z tych dwoch systemow)
dlaczego zapisuje wartosc A do C, zeruje A i z powrotem wczytuje do A C (porownania mozna robic tylko wobec rejestru i akumulatora, dlatego jezeli sprawdzam Czy B jest rowne zero, to musze wyzerowac A i sprawdzic czy A=B)
ile bajtow ma dodac program? program dodaje bajty tak dlugo, az wczytany bajt bedzie rowny 0. dlatego gdy wprowadzilismy dane 0E, 0C... 02, to wprowadzilismy mu 7 bajtow, czyli doda 7 bajtow.
polecam pogrzebac w obu programach (zwlaszcza w tym drugim) i zaznajomic sie z zasada dzialania assemblera, bo babka doskonale wie, kiedy umiemy sie obsluzyc danym programem a kiedy nie. no i oczywiscie wie, ze wszyscy bedziecie mieli programy skopiowane ode mnie ;)
żóraw.