Bardzo często zadając pytanie typu „Jakiego języka programowania chciałbyś się nauczyć?” słyszę w odpowiedzi „Języka maszynowego”. Dlaczego właśnie tak duże jest zainteresowanie tym językiem w porównaniu z językami wyższego rzędu typu BASIC, PASCAL, FORTRAN. Otóż jak mi się wydaje są tego trzy przyczyny. Po pierwsze ze względu na szybkość. Programy napisane w języku maszynowym są najszybszymi programami, jakie możemy uruchomić na danym mikrokomputerze. Po drugie ze względu na ich uniwersalność. Każdy język wyższego rzędu nakłada pewne ograniczenia (większe lub mniejsze) natomiast język maszynowy daje pełną swobodę programiście. W tym właśnie celu niektóre języki wyższego rzędu dają możliwość uruchamiania procedur pisanych w języku maszynowym np. instrukcja INLINE w Turbo Pascalu.
Po trzecie ze względu na to, że komputer faktycznie pracuje tylko i wyłącznie w języku maszynowym i kluczem do zrozumienia zasad ]ego działania jest właśnie ten język.
Czy język maszynowy jest trudny? Raczej nie. Poszczególne instrukcje wykonują bardzo proste działania typu: pobierz liczbę, zapamiętaj liczbę, pomnóż daną liczbę przez dwa itp. Dlatego potrzeba wielu takich instrukcji, by zrealizować zadanie, które często w języku wyższego rzędu realizowane jest przez jedną instrukcję. Ponieważ te instrukcje są właśnie tak proste, są one jednocześnie łatwe do zrozumienia i przyswojenia. Niektórzy programiści, którzy zaczynali od programowania w języku maszynowym, uważają np. BASIC za język nie do opanowania. Dla nich instrukcje w języku maszynowym są precyzyjne i jasne w odróżnieniu od BASICa, w którym to instrukcje i polecenia są niezrozumiałe, skomplikowane.
Do czego niniejszy kurs Cię doprowadzi? Zakończysz go mając pojęcie, na czym polega programowanie w języku maszynowym oraz poznasz podstawy tego programowania. Na pewno nie będziesz ekspertem, ale przestaniesz się obawiać tego tajemniczo brzmiącego języka i będziesz w stanie dać sobie radę sam w przyszłości. Czy nabyta wiedza będzie ukierunkowana tylko i wyłącznie na komputery firmy COMMODORE? Kurs bazować będzie na tych komputerach, ale ponieważ wszystkie komputery działają podobnie nie będziesz miał Czytelniku większych problemów przy zgłębianiu języka maszynowego procesorów Zilog, Motorola, Intel. Będzie to już dla Ciebie tak proste i naturalne jak kolejna zmiana magnetofonu czy samochodu Podstawy są wszędzie takie same.
Na koniec tego wstępu chciałem rozwiać wątpliwości tych, którzy nie znają jeszcze żadnego języka programowania, Przystępując do nabywania wiedzy podczas tego kursu nie musisz być wybitnym znawcą BASICa. Takie pojęcia jak podprogram, pętla, instrukcja warunkowa czy rozgałęzienie programu na pewno Ci się przydadzą choć ich znaczenie będzie podczas kursu powtórzone i wyjaśnione. A więc do pracy!
Podstawowe pojęcia
Wszystkie komputery zawierają olbrzymie liczby obwodów elektrycznych. W każdym komputerze binarnym obwody te mogą znajdować się w dwóch stanach — włączony i wyłączony. Elektronik powiedziałby, że napięcie zostało podane (włączone) lub też nie zostało podane (wyłączone) choć w tym drugim wypadku matematyk twierdziłby, że zostało podane napięcie zerowe. W każdym razie operujemy dwoma stanami: włączony i wyłączony, TAK i NIE, PRAWDA i FAŁSZ, 1 i 0. Szczególnie ten ostatni przypadek jest elegancki, wygodny i ma postać numeryczną. Jeżelibyśmy mieli osiem obwodów, z których niektóre byłyby włączone a inne nie, to stan całości moglibyśmy opisać jako np. 11000111. Oznaczałoby to, że pierwsze dwa są pod napięciem, trzy kolejne nie i ostatnie trzy ponownie pod napięciem. Wartość 11000111 przypomina liczbę. Faktycznie jest to liczba binarna, zapisana przy podstawie 2, w której jedynymi cyframi dozwolonymi są 1 i 0. Liczba ta nie ma nic wspólnego z dziesiętną liczbą o wartości trochę większej od 11 milionów i dlatego dla odróżnienia przed liczbą binarną stawiamy znak procenta %11000111. Każdą z cyfr słowa binarnego nazywamy bitem (od Binary digit), natomiast układ ośmiu bitów to bajt (byte). Pozycje bitów w bajcie numerowane są od prawej do lewej poczynając od bitu 0 do bitu 7 czyli od bitów najmniej znaczących do bitów bardziej znaczących. Taka metoda opisu znajdzie swoje uzasadnienie później.
Jest rzeczą popularną by grupować obwody elektryczne. „Druty” łączą kolejne układy scalone. Tam gdzie grupa przewodów używana jest razem do połączenia kilku różnych punktów mówimy o szynie lub magistrali. W komputerach COMMODORE stosowane są następujące mikroprocesory firmy MOSTEK: VIC-20 = 6502, C-64 = 6510, PLUS/4-7501, C-128 = 8502. Wszystkie one są do siebie bardzo podobne i dlatego będziemy odnosić się do nich jako do rodziny 65xx (wszelkie odstępstwa będą sygnalizowane). Rozważmy przykład szyny używanej w każdym układzie 65xx. Układ ten nie ma prawie wogóle własnej pamięci. Aby wykonać obliczenie czy też kolejny krok programu procesor musi zażądać adczytu informacji z pamięci. W tym celu wysyła on układ napięć po szynie adresowej (16 ścieżek) dających nam adres komórki w pamięci, z którą mikroprocesor chce się porozumieć. Wszystkie układy pamięci podłączone są do tej szyny, ale tylko jedna komórka na dany adres odpowie „To ja” i prześle kopię zawartych w niej informacji poprzez szynę danych. Jak już powiedziałem szyna adresowa jest 16-bitowa natomiast szyna danych, po której przesyłane są dane do i z pamięci jest 8-bitowa.
Zakres liczbowy
Szyna adresowa posiada 16 bitów, z których każdy może przyjmować wartość 0 lub 1. Największa liczba jaką można więc zmieścić w 16 bitach wynosi 216=65536 tzn., że liczby przesyłane po tej szynie są z zakresu 0-65535. Te wielkości tłumaczą dlaczego procesor 8bitowy jest w stanie jednorazowo zaadresować 65536/1024 = 64K pamięci. Szyna danych składa się z 8 bitów co oznacza, że największa liczba jaką można po niej przesłać wynosi 28 = 256 (wartość 0-255).
Inne układy liczenia
Zamiana liczb między systemem dziesiętnym a binarnym jest rzadko stosowana. Programiści częściej i chętnie) posługują się systemem szesnastkowym czyli heksadecymalnym (przy podstawie 16). Dlaczego akurat ten system? Komputer posługuje się systemem czysto binarnym, ale gdyby programiści między sobą mówili np. „adres %1001101011100111” to prowadziłoby to do wielu błędów i nieporozumień szczególnie w dobie komputerów 32bitowych. Dlatego właśnie system szesnastkowy, wywodzący się w prostej linii od binarnego (24=16) okazał się prostszy dla ludzi, a przejście na układ binarny jak się zaraz okaże nie nastręcza żadnych większych problemów. W układzie szesnastkowym posługujemy się cyframi 0,1,2,3,4,5,6,7,8,9 i literami A,B,C,D,E,F gdzie A oznacza 10, B oznacza 11 a F 15.
Aby liczbę binarną przedstawić w postaci szesnastkowe] należy liczbę podzielić na grupy po 4 bity poczynając od prawej strony. Dla podanego powyżej adresu mamy więc 1001 1010 1110 0111 a następnie korzystając z tabelki zamieszczonej poniżej zamieniamy grupy bitów na ich odpowiednik w układzie szesnastkowym.
0000—0 0001—1 0010—2 0011—3 0100—4 0101—5
0110—6 0111—7 1000—8 1001—9 1010—A 1011—B
1100—C 1101—D 1110—E 1111—F
W związku z tym otrzymamy $9AE7. Liczby zapisane w układzie szesnastkowym poprzedzamy umownie znakiem dolara.
Przejście z układu szesnastkowego na dziesiętny jest równie proste. W systemie dziesiętnym 124 jak wiemy oznacza 1 x102+2x101+4x100. Tu postępujemy analogicznie: $9AE7 = 9x163+10x162 + 14x161 + 7x160 = 39655. Do takich przeliczeń można posłużyć się następującym schematem bardzo przydatnym gdy pod ręką jest tylko prosty kalkulator czterodziałaniowy:
- Weź pierwszą cyfrę z lewej strony. Jeżeli jest ona literą to zamień ją za równoważną liczbę.
- Jeżeli nie ma dalszych cyfr to skończyłeś. STOP.
- Pomnóż otrzymaną wartość przez 16. Dodaj następną cyfrę do wyniku Idź do punktu 2.
W naszym przypadku wygadałoby to następująco:
- Bierzemy pierwszą cyfrę, którą jest 9.
- Są dalsze cyfry.
- 9x16 + 10=154
- Są dalsze cyfry
- 3. 16x154+14 = 2478
- 2. Są dalsze cyfry.
- 3. 16x2478 + 76 = 39655
- 2. Nie ma cyfr. STOP.
Ostatnim na dzisiaj zadaniem będzie często potrzebne przeliczanie z układu dziesiętnego na szesnastkowy. Polega ono na ciągłym dzieleniu liczby dziesiętnej przez 16. Po każdym dzieleniu reszta z dzielenia jest kolejną cyfrą szesnastkową zapisywaną od prawej strony. Dla tego celu można posłużyć się kalkulatorem lub poniższą tabelką: .0000-0 .0625-1 .1250-2 .1875-3 .2500-4 .3125-5 .3750-6 .4375-7 .5000-8 .5625-9 6250-A .6875-B ,7500-C 8125-D ,8750-E 9375-F
Dla przykładu zamienimy wspólnie liczbę 4780 dziesiętne na jej szesnastkowy odpowiednik. 4780/16=498.75 . 75 = C 298/16=18.625 .625=A 18/16= 1.125 .125=2 Jedności już dalej nie dzielimy, tylko wpisujemy na początku i w wyniku otrzymujemy $12AC
Tyle wiadomości na pierwszy wykład. Za miesiąc przystąpimy do pierwszych instrukcji, ćwiczeń i programów.
Dominik Falkowski



