Rozdział 26


Używanie kodu maszynowego

 

Podsumowanie

USR z argumentem liczbowym
 

Ten rozdział został napisany dla tych, którzy rozumieją kod maszynowy mikroprocesora Z80, czyli zbiór instrukcji używanych przez ten układ scalony. Jeśli nie znasz tego, a chciałbyś poznać, to wokoło znajdziesz mnóstwo książek na ten temat. Musisz zdobyć jakąś, której tytuł brzmi jakoś tak "Kod maszynowy z80 (lub język maszynowy) dla zupełnie zielonych", a jeśli będzie w niej wspomniany Spectrum, to tym lepiej.

Programy maszynowe są zwykle zapisywane w języku asemblera i chociaż wyglądają jak szyfr, nie są zbytnio trudne do zrozumienia przy odrobinie praktyki. (Instrukcje języka asemblera możesz zobaczyć w Dodatku A.) Jednakże do ich uruchomienia na komputerze będziesz musiał taki program zakodować na ciąg bajtów, a w tej postaci są one nazywane kodem maszynowym. To kodowanie jest zwykle dokonywane przez sam komputer przy pomocy programu o nazwie asembler. Spectrum nie posiada wbudowanego żadnego asemblera, lecz możesz taki kupić sobie na kasecie. Jeśli ci się to nie uda, to możesz też ręcznie dokonać takiego kodowania, o ile program nie jest zbyt długi.

Weźmy przykładowy program

 

ld bc, 99
ret

 

który ładuje parę rejestrów bc liczbą 99. Tłumaczy się to na cztery bajty kodu maszynowego 1, 99, 0 (dla ld bc,99) i 201 (dla ret). (Jeśli w Dodatku A wyszukasz 1 i 201, to znajdziesz ld bc, NN — gdzie NN oznacza dowolną liczbę dwubajtową — i ret.)

Gdy masz swój program maszynowy, następnym krokiem jest umieszczenie go w komputerze. (Asembler prawdopodobnie zrobiłby to automatycznie.) Musisz zdecydować, gdzie umieścić go w pamięci, a najlepiej jest zrobić dodatkowe miejsce pomiędzy obszarem BASIC a grafikami definiowanymi przez użytkownika.

Przykładowo załóżmy, że masz ZX Spectrum 16K.  Na początku szczyt pamięci RAM wygląda następująco:

 

Jeśli wpiszesz

 

CLEAR 32499

 

 

dostaniesz 100 bajtów (aby nie brakło) od adresu 32500.

Aby wstawić ten program w kodzie maszynowym, możesz uruchomić taki program:

 

10 LET a=32500
20 READ n: POKE a,n
30 LET a=a+1:GOTO20
40 DATA 1,99,0,201

 

(Zatrzyma się on z komunikatem E Out of DATA [E Koniec danych], gdy wypełni te cztery podane przez ciebie bajty.)

 

Aby uruchomić ten kod maszynowy, użyjesz funkcji USR, lecz tym razem z argumentem liczbowym będącym adresem początku kodu maszynowego w pamięci. Wynikiem tej funkcji zawsze jest zawartość pary rejestrów bc przy powrocie z programu w kodzie maszynowym, zatem jeśli wpiszesz:

 

PRINT USR 32500

 

to otrzymasz odpowiedź 99.

 

Adres powrotny do systemu BASIC jest umieszczany na stosie procesora Z80 w normalny sposób, zatem powracasz przy pomocy instrukcji ret. W swoich programach nie powinieneś korzystać z rejestrów iy oraz i. Swój program w kodzie maszynowym możesz bardzo łatwo zapisać na taśmie przy pomocy polecenia:

 

SAVE "jakaś nazwa" CODE 32500,4

 

Niestety, nie ma sposobu takiego zapisu, aby po załadowaniu program sam się uruchomił, lecz możesz to obejść przy pomocy programu w języku BASIC:

 

10 LOAD "" CODE 32500,4
20 PRINT USR 32500

 

Wykonaj najpierw

 

SAVE "jakaś nazwa" LINE

 

a następnie

 

SAVE "xxxx" CODE 32500,4
LOAD "
jakaś nazwa"

 

To załaduje i automatycznie uruchomi program w języku BASIC, a ten z kolei załaduje i uruchomi program w kodzie maszynowym.

 

 


   I Liceum Ogólnokształcące   
im. Kazimierza Brodzińskiego
w Tarnowie

©2018 mgr Jerzy Wałaszek

Dokument ten rozpowszechniany jest zgodnie z zasadami licencji
GNU Free Documentation License.

Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl

W artykułach serwisu są używane cookies. Jeśli nie chcesz ich otrzymywać,
zablokuj je w swojej przeglądarce.
Informacje dodatkowe