Jesli jestes poczatkujacym sciagnij ponizsze pliki
TP.ZIP - Podstawy programowania w turbo pascalu - lekcje po polsku mego autorstwa
ASEMBLER.ZIP - Opis podstawowych mnemonnikow assemblera(pl)
OTO INNE TEMATY
Uruchamianie programow w assemblerze(TASM)
Na poczatek wyjasnie znaczenie skrotu TASM - Turbo assembler
Pliki pisane w assemblerze moga miec wlasciwie dowolne rozszezenie, ale glownie nadaje sie je w
postaci *.asm. Pliki takie przygotowywuje sie w dowolnym edytorze tekstu(ja czesto stosuje EDIT
dosa lucz F4 nortona, jesli chcemy stworzyc w NC nowy plik to nacisnij SHIFT+F4 i wpisz nazwe
pliku). Gdy mamy gotowy plik *.asm to piszemy:
tlink nazwapliku.asm
wowczas otrzymujemy plik w przejsciowej postaci *.obj
Teraz piszemy:
tasm nazwapliku.obj
Teraz otrzymujemy gotowy plik nazwapliku.exe
Jesli mamy TASM 4.0 piszemy:
TASM nazwapliku.asm
i bez zbednych zabaw otrzymujemy plik nazwapliku.exe
Uzywanie assemblera w turbo pascalu
Turbo pascal udostepnia nam mozliwosc uzywania tzw. BASM czyli wbudowanego assemblera.
Juz na samym poczatku zaznacze, ze ma on spore ograniczenia bowiem normalnie udostepnia
rozkazy procesorow od 8086 do 8286. Instrukcje 286 wywoluje sie dyrektywa kompilatora
{G+}
Do poinformowania kompilatora, ze bedziemy stosowac rozkazy BASM uzywa sie rozkazu
ASM ,a blok rozkazow BASM konczy sie rozkazem END;. NP:
Uses crt;
begin
asm
mov ax,13h
int 10h
end;
repeat
until keypressed;
end.
Powyzszy przyklad uruchamia tryb 13h(320x200 przy 256 kolorach).
Komunikacja BASM i pascala
Podstawowym zagadnienieniem BASM jest komunikacja BASM z samym turbo pascalem.
Czesto sie zdaza, ze w basm chcemy uzyc zmiennej pascala - wtedy pojawia sie problem.
Np. mamy zmienna "zmienna" typu word i chcemy nadac jej wartosc 5:
var
zmienna:word;
begin
asm
mov word ptr ds:[zmienna],5
end;
write(zmienna);
end.
Instrukcja mov przenosi tu wartosc "5" pod slowo("word") ktore znajduje sie w segmencie
danych("DS"- standardowy segment w ktorym pascal umieszcza dane), miedzy [] znajduje sie
nazwa zmiennej <- tu zostanie wstawiony jej offset czyli polozenie wzgledem poczatku
segmentu w ktorym sie znajduje czyli DS.
Rozwiazanie tego problemu przydaje sie przy wypisywaniu tekstu rozkazem 09h dosa.NP.
uses crt;
var
zmienna:string;
begin
clrscr;
zmienna:='Czesc$';
asm
mov ah,09h {ah = 09h -> wypisywanie tekstu ktorego poczatek jest DS:DX, zakonczonego
znakiem $}
mov dx,offset zmienna+1 {dx = offset(zmienna)+1}
int 21h {wywolanie przerwania dosa -> 21h}
end;
end.
Tu mala uwaga!Rozkaz:
mov dx,offset zmienna+1
Wynika z budowy zmiennej typu "string":
Bajt i jego znaczenie
0(jej offset + 0) Ilosc znakow w tym ciagu tekstowym
1(jej offset + 1) Pierwszy znak ciagu
Nalezy tez zauwazyc, ze nie musimy ustawiac wartosci DS na segment zmiennej "zmienna"
czyli segment danych, bo robi to standardowo pascal.
Powrot na strone glowna Piotra Sokolowskiego