Kurs Assemblera cz. 2

W tym odcinku zajmiemy się już wyświetlaniem całych wyrazów, a nawet zdań. Najpierw jednak postaraj się, by w komórce $2000 (czyli 8192) znalazła się wartość 1 . Jak – to już Twój problem. Sugerowałbym jednak małe POKE…

POKE 8192,1

I po co nam to było? To proste – dzięki temu mamy w komórce pamięci o adresie 8192 zapisaną wartość i dzięki czemu możemy ją pobrać w dowolnym momencie. Ale jak? – zapyta spostrzegawczy Czytelnik. Posłużymy się rozkazem LDA. Tym razem jednak wartość po rozkazie nie będzie oznaczać LICZBY, którą chcemy wpisać do akumulatora, lecz ADRES komórki, w której będziemy szukać LICZBY, wpisanej do akumulatora. Wpisz więc programik przedstawiony poniżej:


*=$2710
LDA $2000
STA $0400
RTS
strzałka w lewo, 3, s

No i proszę, efekt zgodny z tym, co przed chwilą napisałem. Jeżeli przed liczbą po rozkazie LDA nie wpiszemy znaczka #, to komputer będzie traktował tę liczbę jako adres komórki pamięci w której jest zapisana liczba przeznaczona do wczytania do akumulatora. Teraz zajmijmy się obiecanymi przedtem słowami. Jak zapewne zdążyłeś zauważyć, wpisywanie słów dłuższych, niż dwu-trzyliterowe metodą LDA- STA przestaje być rozrywką i staje się średnio przyjemnym wklepywaniem kolejnych liczb. Jeśli umiesz programować w jakimś innym języku, zapewne przypominasz sobie jakieś pętle: FOR…NEXT, REPEAT…UNTIL, DO…LOOP i inne. Jeśli zaś niczego sobie nie przypominasz, to wiedz, że pętla, to taki chytry chwyt, dzięki któremu możesz napisać jakiś ciąg instrukcji raz, a potem powtarzać go kilka razy. Odbywa się to nie za pomocą przepisywania tego samego fragmentu programu na nowo, lecz poprzez poinformowanie komputera, że ma wykonywać tę część programu tyle razy, ile sobie zażyczysz. W asemblerze jest kilka metod zrobienia pętli. Możemy na przykład wstawić do jednej z komórek liczbę powtórzeń i po każdym przebiegu pętli zmniejszać jej wartość o 1 . Po dojściu do 0 — kończymy powtarzanie pętli. Znacznie wygodniejszym rozwiązaniem jest jednak wykorzystanie jednego z DODATKOWYCH REJESTRÓW procesora. Bowiem procesor ma nie tylko akumulator. Ma także rejestry oznaczone jako X i Y. Za pomocą np. rejestru X możemy także utworzyć pętlę i to znacznie lepszą niż przy pomocy komórki pamięci. Sama zasada będzie oczywiście taka sama. A oto przykład takiej pętli – wydrukujemy kilka liter za pomocą jednego STA!


*=$2710
LDA #2
LDX #$10
U STA $0400,X
DEX
BNE U
RTS
Strzałka w lewo, 3, s

Wszystko się zgadza? Mamy aż szesnaście literek „B”, a rozkazów wydaliśmy, jak dla trzech! Pojawiły się jednak nieznane Ci rozkazy. Zaraz je wyjaśnię.

LDX #xx – weź liczbę xx i wpisz ją do rejestru X (LoaD X register)
DEX – zmniejsz zawartość rejestru X o 1 (DEcrement X register)
STA xxxx,X – zapisz zawartość akumulatora do komórki o adresie
xxxx, zwiększonym o zawartość rejestru X. (STore Accumulator)
BNE xxxx – jeżeli ostatnia wykonana operacja nie przyniosła wyniku zerowego, wykonaj skok do adresu xxxx. (Branch, if Not Equal to zero)

Posiadacze asemblera mają właśnie okazję, by dowiedzieć się, czym właściwie jest etykieta. Popatrz tylko, co wpisałeś po rozkazie BNE – tylko literkę U. A co powinieneś wpisać? Adres, do którego komputer ma wykonać skok. Wniosek – etykieta służy nam do określenia adresu bez potrzeby dokładnej jego znajomości. Takie samo U postawiliśmy przed rozkazem STA. Komputer porównuje jedną etykietę z drugą i, jeśli się zgadzają, wykonuje skok. Przejdźmy do obiecanych całych słów. Przedtem jednak gorąco apeluję, by wszyscy zaopatrzyli się w TurboAssembler 5.1 . Jak się zaraz przekonamy, ułatwi to wpisywanie programów znacznie bardziej, niż używanie jakiegokolwiek monitora. Inne makroasemblery mają inne, sobie tylko właściwe, możliwości i mogą z tego wyniknąć nieporozumienia. Teraz jednak posiadacze monitorów muszą się posłużyć językiem BASIC. Chodzi tu o to, aby tekst do wyświetlenia na ekranie wpis określonego obszaru pamięci skąd zostanie on pobrany i wyświetli na ekranie przez program napisany w języku maszynowym.

10 A$=”PRAWDZIWY MANIAK PETLI SIE NIE BOI”
20 FOR A=1 TO LEN(A$)
30 B=ASC(MID$(A$, A, 1))
40 IF B>64 THEN B=B-64
50 POKE 8191 +A, B
60 NEXT


A 2710 LDX #$2C
A 2712 LDA $2000, X
A 2715 STA $0400, X
A 2718 DEX
A 2718 BNE $2712
A 271 A RTS

*=$2710
LDX #$2C
WPAK LDA TEKST, X
STA $0400, X
DEX
BNE WPAK
RTS
TEKST .TEXT "PRAWDZIWY MANIAK PETLI SIE NIE BOI"
strzałka w lewo, 3, s

No i mamy obiecane całe wyrazy i zdania. I tylko jeden nowy rozkaz:

LDA xxxx, X- wstaw do akumulatora zawartość komórki o adresie xxxx, zwiększonym o zawartość rejestru X.

Użytkowników asemblera informuję że instrukcja .TEXT pozwala na wpisanie w cudzysłowie jakiegokolwiek tekstu. W chwilach wolnych proponuję zastanowić się nad innym zagadnieniem: jak wyświetlić ten tekst od końca?

 

 

DZIŚ POZNALIŚMY INSTRUKCJE:
LDA xxxx – wstaw zawartość komórki o adresie xxxx do akumulatora
LDA xxxx, X – wstaw zawartość komórki o adresie xxxx, zwiększonym o zawartość rejestru X do akumulatora
STA xxxx, X – zapisz akumulator do komórki o adresie xxxx, zwiększonym o zawartość rejestru X
LDX #xx – wstaw liczbę xx do rejestru xx
DEX – zmniejsz zawartość rejestru X o 1
BNE xxxx – skocz do komórki o adresie xxxx, jeżeli wynik ostatniej wykonanej operacji nie był równy 0

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *