MENU
Strona startowa
Newsletter
Rejestracja
LOGOWANIE
Forum
Systemy
WAREZ
Chomikuj.pl
Darmowy Hosting
GRAFIKA
Baner Flash
Alfabet HTML
Asembler Kurs
=> Czas i data
=> ADRESOWANIE PAMIĘCI
=> CZAS I RUCH NA EKRANIE
=> DYREKTYWY ASSEMBLERA
=> OBSŁUGA GŁOŚNIKA
=> GENERATOR LICZB LOSOWYCH
=> REJESTRY PROCESORA
=> PĘTLE
=> SZABLON PROGRAMU
PIERWSZY RAZ HTML
Hakerstwo
Świat WWW
Serwery Proxy
Galeria
GRY
SKÓRKA DO GG
Lockerz.com
SKLEP
...
CZAS I RUCH NA EKRANIE
C
Z
A
S
I
R
U
C
H
N
A
E
K
R
A
N
I
E
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,02H
MOV BH,nr_strony
MOV DH,wiersz;y
MOV DL,kolumna;x
INT 10H
Możemy również odczytywać pozycję kursora na ekranie. Zrobimy to wpisując poniższy fragment kodu:
MOV AH,03H
MOV BH,nr_strony
INT 10H
Po 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=dl
mov ah,02h
mov bh,00h
int 10h
ret
endp
writechar proc
mov ah,0Ah
mov Al,'*';
mov bh,00h
mov cx,1;
int 10h
ret
endp;
kbhit proc
mov ah,0bh
int 21h
ret
endp
wait proc
push dx;
push cx;
mov cx,0;
mov dx,50000;
mikrosekund
mov ah,86h;
funkcja ktora nic nie robi przez CX:DX mikrosekund
int 15h
pop cx
pop dx
ret
endp;
start:
mov ax,dane
;przypisanie wskaznika na segment dane do rejestru AX
mov ds,ax
;przypisanie wartosci AX do rejestru DS
mov ax,stosik ;
mov ss,ax
mov sp,offset szczyt
mov dx,0000h
lewa: call gotoxy
call writechar
call wait;
cmp dh,18h
je dol
inc dh
jmp lewa
dol: call gotoxy
call writechar
call wait;
cmp dl,4Fh
je prawa
inc dl
jmp dol
prawa: call gotoxy
call writechar
call wait;
cmp dh,00h
je gora
dec dh
jmp prawa
gora: call gotoxy
call writechar
call wait;
cmp dl,00h
je czekaj
dec dl
jmp gora
czekaj: call kbhit
cmp al,0 ;
porownanie wyniku procedury z zerem
je czekaj;
jesli bufor jest pusty to sprawdz ponownie
EXIT:
mov ah,4Ch
;przypisanie do rejestru AH wartosci 4CH
mov al,00h
;przypisanie do rejestru AL wartosci 0
int 21h
;wywolanie przerwania DOS (21H)
progr ends
; koniec segmentu
dane segment
dane ends
stosik segment
;Poczatek segmentu stosu
dw 100h dup(0)
;wypelnienie przestrzeni 100h slowami (16 bitowymi )o wartosci 0
szczyt label word ;
stosik ends
; koniec segmentu stosik
end start
; koniec programu z zaznaczeniem od ktorego miejsca program sie ma zaczac
Dla 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,0bh
int 21h
cmp al,0 ;
porownanie wyniku funkcji z zerem
je czekaj;
jesli bufor jest pusty to sprawdz ponownie
Funkcja 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,01H
MOV CH,linia początkowa
MOV CL,linia końcowa
INT 10H
Aby 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 proc
mov ah,02h
mov bh,00h
int 10h
ret
endp
writechar proc
mov ah,0Ah
mov Al,'*'
mov bh,00h
mov cx,1;
int 10h
ret
endp;
kbhit proc
mov ah,0bh
int 21h
ret
endp
wait proc
push dx;
push cx;
mov cx,0;
mov dx,50000;
mov ah,86h;
int 15h
pop cx
pop dx
ret
endp;
start:
mov ax,dane
mov ds,ax
mov ax,stosik
mov ss,ax
mov sp,offset szczyt
mov ah,01h
mov cl,20h;
mov ch,20h;
int 10h;
mov dx,0000h
lewa: call gotoxy
call writechar
call wait;
cmp dh,ymax;
je dol
inc dh
jmp lewa
dol: call gotoxy
call writechar
call wait;
cmp dl,xmax;
je prawa
inc dl
jmp dol
prawa: call gotoxy
call writechar
call wait;
cmp dh,ymin
je gora
dec dh
jmp prawa
gora: call gotoxy
call writechar
call wait;
cmp dl,xmin;
je rawa
dec dl
jmp gora
rawa:
dec xmax;
dec ymax;
inc xmin;
inc ymin;
cmp ymax,12
je czekaj
jmp lewa;
czekaj: call kbhit
cmp al,0
je czekaj;
EXIT:
;Kursor
mov ah,01h
mov 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
Teraz 11195 odwiedzający (26022 wejścia)
Logowanie
Nazwa użytkownika:
Hasło:
Ta strona internetowa została utworzona bezpłatnie pod adresem
Stronygratis.pl
. Czy chcesz też mieć własną stronę internetową?
Darmowa rejestracja