asembler

`-:+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.


Wyszukiwarka

Podobne podstrony:
Asembler ARM przyklady II
Asembler dla procesorow Intel Vademecum profesjonalisty asinvp
asembler 8051 opis rozkazow
asembler podrecznik uzytkownika OOJHQHHGL4XKD5C7LJZPZGPQDNDQ6CI23AUGTVQ
Procedury arytmetyczne w języku Asembler ST7
Asembler Kurs Programowania Dla Srednio Zaawansowanych S Kruk www !OSIOLEK!com
Praktyczny kurs asemblera pkasem
Asembler Przykłady
Asembler wykład 09-10-2000
Asembler w Linuksie - optymalizowanie kodu, Asembler w Linuksie - optymalizowanie kodu
[PL tutorial] Asembler kurs - HTML, Asembler, Asembler
Programowanie w języku asemblera
Asembler wykład 16-10-2000, Zaczynamy (pracę) z programem Turbo Assembler, Rozdział 1
Asembler2
Asembler programy1
21 Pisanie i uruchamianie programów w asemblerze
Asembler ARM przyklady
Asembler Sztuka programowania Wydanie II asesz2
10 Asembler

więcej podobnych podstron