Kurs Assemblera by Skowik
var napis=new Array("C","Z","A","S ","I ","R","U","C","H ","","","","N","A ","E","K","R","A","N","I","E");
var kolory=new Array("EEEE00","FFCC00","FFBB00","FFAA00","FF9900",
"FF7700","FF5500","FF3300","FF1100","DD0000","BB0000",
"DD0000","FF1100","FF3300","FF5500","FF7700",
"FF9900","FFAA00","FFBB00","FFCC00","EEEE00");
for(i=0; i< 21; i++)
document.write(napis[i].fontcolor(kolory[i]));
W poprzedniej lekcji poznaliśmy metody
wypisywania na ekran w trybach tekstowych.Znaki wypisywane na ekranie wcale
nie muszą być statyczne , mogą się dynamicznie zmieniać.Aby wprowadzić trochę
dynamiki trzeba wiedzieć jak zmieniać pozycję kursora tak by w wybranymprzez nas
miejscu ekranu wprowadzić zmianę znaku.Jeżeli chcielibyśmy przemieścić
kursor pod wybrane przez nas współrzędne ekranowe należy wpisać poniższy
fragment kodu:
MOV AH,02HMOV BH,nr_stronyMOV DH,wiersz;yMOV
DL,kolumna;xINT 10HMożemy również odczytywać pozycję
kursora na ekranie. Zrobimy to wpisując poniższy fragment kodu:
MOV AH,03HMOV BH,nr_stronyINT 10HPo wykonaniu
powyższego kodu w rejestrach CH i CL będziemy mieli informacje o wielkości
kursora (CH-początek kursora licząc od góry , CL-Koniec kursora), w rejestrze DH
znajdziemy numer wiersza a w rejestrze DL numer kolumny w której znajduje się
kursor.Poniżej przedstawiam kod programu rysującego ramkę z gwiazdek:
progr segment assume cs:Progr,ds:dane,ss:stosik
gotoxy proc; x= dh y=dlmov ah,02hmov
bh,00hint 10hretendpwritechar procmov ah,0Ahmov
Al,'*';mov bh,00hmov cx,1;int 10hretendp;kbhit
procmov ah,0bhint 21hretendpwait procpush dx;push
cx;mov cx,0;mov dx,50000; mikrosekundmov
ah,86h; funkcja ktora nic nie robi przez CX:DX
mikrosekundint 15hpop cxpop dxretendp;start:
mov ax,dane ;przypisanie wskaznika na segment dane do
rejestru AXmov ds,ax ;przypisanie wartosci AX do
rejestru DSmov ax,stosik ;mov ss,ax mov sp,offset szczyt
mov dx,0000hlewa: call gotoxycall writecharcall
wait;cmp dh,18hje dolinc dhjmp lewadol: call
gotoxycall writecharcall wait;cmp dl,4Fhje prawainc
dljmp dolprawa: call gotoxycall writecharcall wait;cmp
dh,00hje goradec dhjmp prawagora: call gotoxycall
writecharcall wait;cmp dl,00hje czekajdec dljmp
goraczekaj: call kbhit cmp al,0 ; porownanie
wyniku procedury z zeremje czekaj; jesli bufor
jest pusty to sprawdz ponownieEXIT:mov ah,4Ch ;przypisanie do rejestru AH wartosci 4CHmov al,00h
;przypisanie do rejestru AL wartosci 0int 21h
;wywolanie przerwania DOS (21H)progr ends ; koniec segmentudane segment dane ends
stosik segment ;Poczatek segmentu stosudw
100h dup(0) ;wypelnienie przestrzeni 100h slowami (16
bitowymi )o wartosci 0szczyt label word ;stosik ends ; koniec segmentu stosikend start ; koniec programu z zaznaczeniem od ktorego miejsca program sie ma
zaczacDla skrócenia programu zastosowałem w nim
procedury. Dla pokazania ruchu opóżniłem każde wyświetlenie gwiazdki o 5000
mikrosekund. Aby to zrobić zastosowałem funkcję 86H przerwania 15H. Funkcja ta
nic nie robi(czeka) przez tyle czasu ile odczytuje z pary rejestrów CX DX. Czas
trwania tej funkcji podawany jest w mikrosekundach(1/1000000 s) w taki sposób że
młodsza część znajduje się w DX a starsza w CX.Czas ten można więc wyrazić
wzorem T:=(65536*CX)+DX, czyli może być liczbą 32-bitową.Dokładniej omówię
tą funkcję w lekcji czwartej.W programie przedstawionym powyżej
wykorzystałem też możliwość reakcji na zapełnienie bufora klawiatury. Program
tak długo chodzi w pętli kbhit, aż nie zostanie naciśnięty jakikolwiek klawisz.
Wówczas program przechodzi dalej i kończy się. Używa się tego np. do zobaczenia
wyników działania programu przed jego zakończeniem. Aby takie coś wykonać należy
wpisać:
czekaj: mov ah,0bhint 21hcmp al,0 ;
porownanie wyniku funkcji z zeremje czekaj; jesli
bufor jest pusty to sprawdz ponownieFunkcja 0Bh
przerwania DOSowskiego sprawdza czy w buforze klawiatury jest jakiś znak. Jeśli
bufor jest pusty to w rejestrze AL jest 0 w przeciwnym wypadku jest
0FFh.Czasami chcemy by migający kursor nie był widoczny. Możemy tego
dokonać funkcją 01H przerwania 10H. Funkcja ta ustawia rozmiar i kształt
kursora.Aby kursor był widoczny początkowa i kończowa linia kursora powinna
mieścić sie w przedziale 0-1Fh. Podanie 20H powoduje ukrycie kursora.
MOV AH,01HMOV CH,linia początkowaMOV CL,linia końcowaINT
10HAby przećwiczyć nabyte umiejętności przeanalizujemy
teraz program rysujący spiralę z gwiazdek na ekranie.
progr segment assume cs:Progr,ds:dane,ss:stosik
gotoxy procmov ah,02hmov bh,00hint
10hretendpwritechar procmov ah,0Ahmov Al,'*'mov
bh,00hmov cx,1;int 10hretendp;kbhit procmov
ah,0bhint 21hretendpwait procpush dx;push cx;mov
cx,0;mov dx,50000;mov ah,86h; int 15hpop cxpop
dxretendp;start: mov ax,dane mov ds,ax mov
ax,stosik mov ss,ax mov sp,offset szczytmov ah,01hmov
cl,20h;mov ch,20h;int 10h;mov dx,0000hlewa: call
gotoxycall writecharcall wait;cmp dh,ymax;je dolinc
dhjmp lewadol: call gotoxycall writecharcall wait;cmp
dl,xmax;je prawainc dljmp dolprawa: call gotoxycall
writecharcall wait;cmp dh,yminje goradec dhjmp
prawagora: call gotoxycall writecharcall wait;cmp
dl,xmin;je rawadec dljmp gorarawa:dec xmax; dec
ymax;inc xmin;inc ymin;cmp ymax,12je czekajjmp
lewa;czekaj: call kbhit cmp al,0 je
czekaj;EXIT:;Kursormov ah,01hmov
cl,1Eh;mov ch,20h;int 10h;mov ah,4Ch mov al,00h int 21h
progr ends dane segment xmax db 4fh;ymax db 18h;xmin db
01h;ymin db 00h;dane ends stosik segment dw 100h dup(0)
szczyt label word stosik ends end start
Strona utworzona przez(c)2001
Wyszukiwarka
Podobne podstrony:
36 porad jak zwiekszyc ruch na stronieJak zwiekszyc ruch na stronie wwwWymiary znakow na ekranieWymiary znakow na ekraniegdy noob na ekranieJak Zwiekszyc Ruch Na Stronie wwwJak zwiekszyc ruch na stronie WWWpisanie na ekraniejak zwiekszyc ruch na stronie www www przeklej plwięcej podobnych podstron