Pierwszy program
W tym artykule przedstawię najprostszy możliwy program, który tak właściwie nie będzie robić nic, poza zajmowaniem pamięci i miejsca na dysku :-) Nawet taki program trzeba jednak napisać i wcale nie zajmie on 0 bajtów... dzięki niemu poznasz szkielet programu assemblerowego i łatwiej ci będzie zrozumieć kolejne przykłady. Program "nie rób nic" wygląda tak:
Jak widzisz - na początku określany jest model programu. Do wyboru jest kilka, między innymi tiny, small, medium, huge... model tiny charakteryzuje się tym, że cały program wraz z danymi musi zmieścić się w jednym segmencie - czyli (w trybie rzeczywistym) - 64Kb. Nie przejmuj się tym na razie :-)
W drugiej linijce dyrektywa .code rozpoczyna segment kodu. Jest to zarazem segment danych (ponieważ używamy modelu tiny). Możemy więc spokojnie od tego miejsca umieszczać zarówno zmienne jak i kod programu.
Następnie widzimy etykietę start. Pod koniec programu określamy od którego miejsca ma zacząć się wykonanie - to znaczy skąd ma zacząć pobierać rozkazy procesor na początku wykonywania naszego programu - wybrana została właśnie etykieta start.
Następne dwie linijki to rozkazy procesora . Jak widzisz są aż dwa. Pierwszy to mov a drugi - int.
Przygotuj się teraz - bo poznasz pierwsze rozkazy swojego procesora. Rozkaz mov a,b wysyła b do a. Zarówno a jak i b mogą być miejscem w pamięci bądź też rejestrem - z jednym zastrzeżeniem: nie można przesyłać danych wprost z pamięci do pamięci. Drugi z tych rozkazów int x wywołuje przerwanie o numerze x.
Co oznacza więc ten kod? Do rejestru ah wpisywana jest wartość 4ch, a następnie wywoływane jest przerwanie 21h. W zaufaniu powiem ci, że 21h to przerwanie ms-dosu. Służy one do korzystania z funkcji systemu operacyjnego. Numer funkcji podajemy w ah, a funkcja 4ch oznacza zakończenie programu.
Przed zakończeniem programu umieściłem jeszcze dyrektywę .stack. Nie jest ona tu niezbędna. Mówi o tym, ile miejsca zostanie przeznaczone na stos. W tym programie stosu nie używamy, ale w każdym prawdziwym programie stosu używa się bardzo często. 512 bajtów wystarcza dla małych programików, jednak gdy korzystamy np. z rekurencji stos kończy się bardzo szybko - a w assemblerze nie otrzymamy miłego komunikatu w okienku - zostanie po prostu zamazana pamięć - nie wiadomo jakie mogą być tego skutki. Być może zostaną wykonane losowe rozkazy. A czym to grozi chyba nie muszę tłumaczyć :-)
Pozostało jeszcze wytłumaczyć po co są właściwie te dwie instrukcje w programie. Może wystarczyłoby nie umieszczać żadnych instrukcji? Otóż wtedy procesor skoczyłby do etykiety start i zaczął wykonywać to, co by się tam znajdywało... a chyba nikt nie jest w stanie przewidzieć co by się tam mogło znaleźć... W najlepszym przypadku program się po prostu zawiesi.
Jak skompilować ten program? Jeżeli korzystasz z Turbo Assemblera firmy Borland, musisz najpierw skompilować plik źródłowy tasm first.asm a potem to skonsolidować tlink first.obj . W wyniku otrzymasz plik first.exe, który jest gotowy do uruchomienia.
.model tiny
.code
start:
mov ah,4ch
int 21h
.stack 512
end start
.code
start:
mov ah,4ch
int 21h
.stack 512
end start
Jak widzisz - na początku określany jest model programu. Do wyboru jest kilka, między innymi tiny, small, medium, huge... model tiny charakteryzuje się tym, że cały program wraz z danymi musi zmieścić się w jednym segmencie - czyli (w trybie rzeczywistym) - 64Kb. Nie przejmuj się tym na razie :-)
W drugiej linijce dyrektywa .code rozpoczyna segment kodu. Jest to zarazem segment danych (ponieważ używamy modelu tiny). Możemy więc spokojnie od tego miejsca umieszczać zarówno zmienne jak i kod programu.
Następnie widzimy etykietę start. Pod koniec programu określamy od którego miejsca ma zacząć się wykonanie - to znaczy skąd ma zacząć pobierać rozkazy procesor na początku wykonywania naszego programu - wybrana została właśnie etykieta start.
Następne dwie linijki to rozkazy procesora . Jak widzisz są aż dwa. Pierwszy to mov a drugi - int.
Przygotuj się teraz - bo poznasz pierwsze rozkazy swojego procesora. Rozkaz mov a,b wysyła b do a. Zarówno a jak i b mogą być miejscem w pamięci bądź też rejestrem - z jednym zastrzeżeniem: nie można przesyłać danych wprost z pamięci do pamięci. Drugi z tych rozkazów int x wywołuje przerwanie o numerze x.
Co oznacza więc ten kod? Do rejestru ah wpisywana jest wartość 4ch, a następnie wywoływane jest przerwanie 21h. W zaufaniu powiem ci, że 21h to przerwanie ms-dosu. Służy one do korzystania z funkcji systemu operacyjnego. Numer funkcji podajemy w ah, a funkcja 4ch oznacza zakończenie programu.
Przed zakończeniem programu umieściłem jeszcze dyrektywę .stack. Nie jest ona tu niezbędna. Mówi o tym, ile miejsca zostanie przeznaczone na stos. W tym programie stosu nie używamy, ale w każdym prawdziwym programie stosu używa się bardzo często. 512 bajtów wystarcza dla małych programików, jednak gdy korzystamy np. z rekurencji stos kończy się bardzo szybko - a w assemblerze nie otrzymamy miłego komunikatu w okienku - zostanie po prostu zamazana pamięć - nie wiadomo jakie mogą być tego skutki. Być może zostaną wykonane losowe rozkazy. A czym to grozi chyba nie muszę tłumaczyć :-)
Pozostało jeszcze wytłumaczyć po co są właściwie te dwie instrukcje w programie. Może wystarczyłoby nie umieszczać żadnych instrukcji? Otóż wtedy procesor skoczyłby do etykiety start i zaczął wykonywać to, co by się tam znajdywało... a chyba nikt nie jest w stanie przewidzieć co by się tam mogło znaleźć... W najlepszym przypadku program się po prostu zawiesi.
Jak skompilować ten program? Jeżeli korzystasz z Turbo Assemblera firmy Borland, musisz najpierw skompilować plik źródłowy tasm first.asm a potem to skonsolidować tlink first.obj . W wyniku otrzymasz plik first.exe, który jest gotowy do uruchomienia.
Autorem tekstu jest:
Jacek Popławski
Materiał dodany przez użytkownika: alphan
