Kurs Assemblera cz. 10

 

KIEDY DWA PLUS DWA RÓWNA SIĘ DWA…

Nielogiczny tytuł? Wręcz przeciwnie! Tym razem będziemy mówić właśnie o logice i operacjach logicznych. Najpierw jednak napiszemy program, który przedstawi nam zawartość jednego bajtu, niech będzie to bajt zawarty w akumulatorze, w postaci zer i jedynek (mogę to być literki a i b, gwiazdki i kropki, kółka białe i kółka czarne – co tylko chcecie). Zera te i jedynki niech wyświetli gdziekolwiek na ekranie. Na ten przykład w lewym górnym rogu. Albo na środku. Jak zrobimy taki program? Musimy po kolei sprawdzić wszystkie bity bajtu i zależnie od tego wydrukować na ekranie odpowiednie znaki. Można to zrobić np. za pomocą instrukcji ROL lub ROR, przerolowując cacy bajt w jedną stronę. Dzięki temu za każdym razem w C otrzymamy wiadomość, jaka była zawartość kolejnego bitu. Jeśli nie pamiętacie szczegółów, odsyłam do numeru listopadowego, AD 1992. O przesuwaniu bajtów powiedziałem tam wystarczająco dużo.

 

BIT PO BICIE

Tym razem jednak wykorzystamy inny rozkaz, tak rzadko wydawany, że zrobiło mi się go żal i postanowiłem wykorzystać go we właściwym dla niego celu. Ów nieszczęśnik nazywa się BIT i zazwyczaj służy do cyklowania rastrów. Głównie dlatego, że nic konkretnego nie robi, a zajmuje dwa lub trzy cykle (a trzeba Wam wiedzieć, że takie instrukcje to nie lada gratka podczas intensywnego cyklowania). Oczywiście jednak umieszczanie w tak ascetycznym procesorze dwóch instrukcji, które nic nie robią (ta i NOP) byłoby rozrzutnością. Coś więc jednak BIT robi. Wykonuje mianowicie operację nazywaną iloczynem logicznym a służy do sprawdzania poszczególnych bitów (ang. Bit Testing). BIT można wykonywać jedynie na komórkach pamięci i to bez żadnego indeksowania (nie ma tu ani ,X ani ,Y). Sam wynik testowania nie jest nigdzie zapisany, a do dyspozycji mamy jedynie wskaźnik Zero (który – jak wiadomo – ustawia się na 1, kiedy wynikiem ostatniej operacji było właśnie zero), nieśmiertelne Negative (liczby ujemne) i oVerflow (przepełnienie). Do N kopiowany jest siódmy (najstarszy) bit sprawdzanej komórki pamięci, a do V – bit szósty. Rozkaz ten sprawdza wynik iloczynu logicznego zawartości akumulatora i komórki pamięci.

 

ILOCZYN LOGICZNY

Nie wiecie, co to jest iloczyn logiczny, tak? To bardzo proste, a najłatwiej wyjaśnić to na liczbach dwójkowych. Iloczyn logiczny 1 i 1 wynosi 1. Dla 1 i 0 wynikiem jest 0, dla 0 i 0 – też zero. Zasadniczo więc przy jednej liczbie, równej jeden lub zero, wynik iloczynu logicznego jest taki sam, jak zwykłego iloczynu:

Jasne? Przy sprawdzaniu iloczynu dwóch liczb dłuższych niż jednobitowe, operacji tej ulegają wszystkie bity po kolei. Na wyjściu zaś jedynki mamy tylko tam, gdzie w dwóch poprzednich liczbach mieliśmy bity zapalone. Na przykładzie:

W najniższym bajcie mamy wynik iloczynu logicznego dwóch poprzednich liczb. Jedynki, czyli zapalone bity, są tylko na tych pozycjach, na których w OBU poprzednich mieliśmy po jedynce. Jasne? Jasne? (Jak mawiał jeden z Vonnegutowskich bohaterów). W sumie jednak cały ten wynik nie jest nigdzie przechowywany. Komputer interesuje się tylko, czy na wyjściu była chociaż jedna jedynka. Jeśli tak, Z pozostanie ciemne.

Teraz więc napisz program, który po kolei przetestuje wszystkie bity wchodzące w skład bajtu przechowywanego w akumulatorze. Wynik niech będzie przedstawiony w jakikolwiek, byle czytelny, sposób. Wynik działania swojego programu proponuję porównać z moim, przykładowym. Program ten przyda się nam na później, żeby w praktyce przyjrzeć się działaniu pozostałych działań logicznych. Jeszcze jedna uwaga techniczna: przyjmijmy, że program zacznie się od $2800.

 

BO W TYM CAŁY JEST AMBARAS…

Mając teraz przygotowany dobrze grunt, możemy zaczynać na dobre (no, i na złe też!) zabawy z operacjami logicznymi. Pierwszą z nich niech będzie AND, czyli „i”, czyli iloczyn logiczny. Jak TO działa, z grubsza już wiemy. Najważniejszą różnicą między AND a BIT jest to, że wynik AND nie ulatnia się w przestrzeń kosmiczną (jak to się dzieje w przypadku drugiego rozkazu), lecz jest uczciwie zapisywany w akumulatorze, byśmy mogli zrobić z nim wszystko, co tylko przyjdzie nam do głów. Odpowiednio do wyniku operacji zmienia się wskaźnik Z, zaś siódmy bit wyniku ląduje w N. Zobaczmy więc, co NAPRAWDĘ stanie się, gdy wykonamy operację %00111111 AND %11111000.

Jeśli masz w pamięci BIT – TESTER, uruchom ten króciutki programik przez SYS 10000 / G 2710. No i co widzimy? (Widzimy oczywiście wynik 00111000, chyba, że klniemy przed czarnym monitorem, bo elektrowni akurat zachciało się wyłączyć prąd). Mamy oto ładny fakt na poparcie moich wywodów o BIT i AND. Ale iloczyn to nie jedyna znana matematykom i 6502 operacja logiczna.

 

JEST JESZCZE SUMA

…czyli ta operacja, która już niedługo pokaże nam, że tytuł z tego miesiąca ma jakie takie resztki sensu. Suma logiczna to operacja OR, czyli LUB. W 6502 odpowiada jej rozkaz ORA (OR Accumulator). LUB, podobnie jak I, potrzebuje na wejściu dwóch liczb, z których na wyjściu robi jedną. I tak:

Czyli jeśli jedna LUB druga liczba jest jedynką, to wyjście też się nią stanie. A jak będzie z całymi bajtami? Spróbujmy wyświetlić sobie sumę 2 i 2 (logiczną sumę, of course (jak mawiają Anglicy)):

I co dostaliśmy jako wynik? %00000010, czyli – po przeniesieniu na system dziesiętny – 2. I bardzo dobrze.

 

W RÓŻNOŚCI SIŁA

Trzecim rozkazem, jaki dziś poznamy będzie EOR, co tłumaczy się jak Exclusive OR, zaś po naszemu mówią na to suma modulo 2. Ma ona to do siebie, że wstawia jedynki tam na wyjściu, gdzie na wejściu była dokładnie jedna jedynka. Jeśli oba wejścia byty takie same (dwa zera albo dwie jedynki) to na wyjściu pojawi się zero.

Wygląda to tak:
1 eor 0 = 1
O eor 1 = 1
O eor O = 0
1 eor 1 = 0

Zgodnie z moimi doświadczeniami Wam też powinno wyjść %10010001.

 

NOT, CZYLI NEGACJA

Asembler 6502 nie ma bezpośrednio rozkazu NOT, który normalnie służy do zmiany bitów na ich przeciwieństwa:
not 1 = 0
not 0 = 1.

Można jednak zasymulować NOT za pomocą EOR, zwyczajnie wstawiając $ff jako maskę, ot tak:

Teraz znajome SYS 10000 lub G 2710 i wynikiem jest… %11000001. Czyli to, czego spodziewaliśmy się po negacji: zgaszone zostało to, co było zapalone, a ogień przeniósł się na to, co było zimne. I to już wszystkie operacje logiczne i jednocześnie wszystko, co przygotowałem dla Was w tym miesiącu. Trzymajta się!

AND z ORem w klapie

 

W tym miesiącu poznaliśmy rozkazy:

AND – wykonanie iloczynu logicznego na zawartości akumulatora oraz liczbie lub zawartości dowolnej komórki. Wynik zapamiętany w akumulatorze

BIT – wykonanie iloczynu logicznego na zawartości akumulatora oraz zawartości dowolnej komórki. Wynik nigdzie nie zapamiętywany.

EOR – wykonanie sumy modulo 2 na zawartości akumulatora oraz liczbie lub zawartości dowolnej komórki. Wynik zapamiętywany w akumulatorze.

ORA – wykonanie sumy logicznej na zawartości akumulatora oraz liczbie lub zawartości dowolnej komórki. Wynik zapamiętywany w akumulatorze.

Dodaj komentarz

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