wyswietlanie na ekranie




Kurs Assemblera by Skowik

















var napis=new Array("W","Y","S","W","I","E","T","L","A","N","I","E ","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]));


Na wstępie poznaliśmy szablon programu i
poznaliśmy jedną funkcję przerwania 21H która służy do opuszczania programu i
wyjścia do DOS.Napiszemy teraz program który wypisuje napis na
ekranie.Do wyświetlania napisy na ekranie służy funkcja 09h przerwania
21H.Napis który ma być wyświetlany znajduje się w zmiennej która jest w
segmencie danych. W skład napisu mogą wchodzić takie znaki jak
ENTER(0AH,0DH).Wyświetlanie napisu kończy znak $. Jesli procesor nie napotka w
łańcuchu znaku'$' wówczas będzie wyświetlać znaki aż do wystąpienia znaku o
kodzie ASCII znaku'$'.Przykładowy fragment programu wyświetlającego wygląda
w następująco:
MOV AH,09HMOV DX,OFFSET napisINT 21HZapis "MOV
DX, OFFSET napis" można zamienić na "LEA DX,napis". Zmienna "napis" wraz z
ciągiem znaków powinna znajdować się w segmencie danych. Instrukcja LEA oblicza
przesunięcie w adresie logicznym czyli miejsce w którym znajduje się zmienna o
nazwie napis od początku segmentu danych. Adres ten jest następnie kopiowany do
rejestru DX , skąd będzie go czerpała funkcja 9 przerwania DOSowskiego.
Poniżej podaję przykład programu wypisującego liczby na ekranie.
;dyrektywa ASSUME
przyporządkowywuje logicznie nazwy do segmentow. np. dzieki temu program sam
bedzie szukal etykiet we wszystkich segmentach programuASSUME
cs:CODE ds:DANE ss:STOSIK;poczatek segmentu
koduCODE SEGMENT ;ponizej umiescimy zmienne i
procedury :;etykieta start jest punktem startowym
programuStart:mov ax,dane ;deklaracja
danychmov ds,axmov ax,stosik ;deklaracja
stosumov ss,axmov sp,offset szczyt mov AH,09Hmov
DX,OFFSET napisint 21Hmov ax,4C00hint DOSCODE
ENDSDANE SEGMENTnapis DB '123456','7',0Ah,0Dh,'$'DANE
ENDSSTOSIK SEGMENTdw 100h dup (0)szczyt label wordSTOSIK
ENDSEND Start;koniec programu z zaznaczonym miejscem
startu programu
Gdy skompilujemy go to program w bieżącej pozycji
kursora wypisze "1234567". Oprócz wypisywania na ekran funkcją 09h przerwania
DOSowskiego mamy do dyspozycji funkcje przerwania 10h czyli BIOSowego przerwania
sterującego kartą grafiki.Aby wyświetlić na ekranie znak w bieżącej pozycji
kursora należy wpisać:
MOV AH,0AHMOV AL,kod_ASCII_znakuMOV BH,nr_stronyMOV
CX,liczba_powtorzen_znakuINT 10HJeżeli chcielibyśmy
wyświetlić znak z przemieszczeniem w kursora należy wpisać poniższy fragment
kodu:
MOV AH,0EHMOV AL,kod_ASCII_znakuMOV BH,nr_stronyINT
10HProgram który umieszczam poniżej demonstruje
wykorzystanie funkcji przerwania 10H do wyświetlania znaków na
ekranie.
progr segmentassume cs:Progr,ds:dane,ss:stosikstart: mov
ax,danemov ds,axmov ax,stosikmov ss,axmov sp,offset szczyt
;Warunki poczatkowemov dl,'A' ;kod znakumov dh,1 ;ilosc znakow do
wypisaniamov bl,40 ;BL-ile spacjimov
cx,24 ;CX(licznik)-ile wierszysk1: push
cx ;ilosc wierszy na stosmov ch,0 ;wypisanie znakumov cl,dh ;ilosc
znakow do wypisaniamov al,dl ;kod ascii
znakumov bh,0 ;nr strony ekranumov
ah,0ah ;nr funkcji przerwania 10hint 10h ;wywolanie przerwania;przejscie do
nastepnej liniimov al,0Ah ;#10mov
bh,0mov ah,0Ehint 10hmov al,0Dh ;
#13mov bh,0 mov ah,0Eh ; funkcja przerwania
10hint 10h ; wykonanie przerwania 10h(sterowanie
ekranem)inc dl ;zwiekszenie kodu znaku o
1inc dh ;zwiekszenie ilosci powtorzen
znaku inc dh ;dec bl ; zmniejszenie ilosci
spacji pop cx ; pobrabnie ze strosu ilosci
wierszy dec cx ; zmniejszenie wartosci rejestru
cx o 1jnz sk1 ; gdy flaga Z=0 (cx>0) wykonaj
skok do etykiety sk1mov ah,4Ch ;funkcja
exitmov al,0 ;0int 21h ;przerwanie DOS'a(21H)progr endsdane
segmentdane endsstosik segmentdw 100h dup(0)szczyt label
wordstosik endsend startPo skompilowaniu i
uruchomieniu program powinien wyświetlić na ekranie piramidkę z liter od A do X.
Teraz zabierzemy się za coś trudniejszego , a mianowicie za odczyt z komórek
pamięci Aby odczytać(pobrać) daną komórkę pamięci należy znać jej adres. Gdy
znamy jej adres należy go przedstawić w postaci adresu segmentowego.np
0:0417hŻeby pobrać wartość tej komórki do rejestru AX wykonujemy nastepujące
czynności:
XOR AX,AX;Zerujemy rejestr AXMOV ES,AX;Do rejestru ES przesyłamy zawartość rejestru AXMOV
AX,ES:[417h];Pobieramy zawartość komórki 0:0417h do rejestru
AXPowyższe umiejętności przećwiczymy teraz
na programie wypisującym konfigurację komputera. Informacja ta jest zakodowana
pod adresem 0:0410h w następującej formie:

bit 0 informuje o braku stacji dyskietek
bit 1 informuje czy w komputerze jest koprocesor arytmetyczny
bity 2-3 informują o ilości pamięci podstawowej komputera (max. 640 KB)
bity 4-5 informują o trybie Video karty grafiki
bity 6-7 informują o liczbie stacji dysków w komputerze(ważne tylko gdy
bit 0 jest ustawiony na 1)
bit 8 informuje o DMA
bity 9-11 informują o portach szeregowych
bit 12 informuje o braku Gameportu
bit 13 informuje o drukarce szeregowej
bity 14-15 informują o portach równoległych Czasami w programie
wystąpi przerwanie 11H które pobiera z BIOS informacje o komputerze, kopiuje je
do AX i pod adres 0:0410h. Jest to spowodowane krótszym zapisem jednakże
wykomuje ono więcej funkcji niż zwykłe pobieranie wartości z
komórki.Spróbuję wyjaśnić też mechanizm pobierania pojedyńczych bitów z
rejestru.Załóżmy , że w rejestrze AL mamy dowolną liczbę binarną
np.10011011Chcąc dowiedzieć się co znajduje się na 3-5 bitach stosujemy tzw
maskę AND czyli mnożenie logiczne poszczególnych bitów.




AX
10011011

AND
00111000

-----
----------

wynik
00011000Następnie
wynik przesuwamy o 3 miejsca w prawo(SHR) i otrzymujemy informację ,że na 3-5
bicie w rejestrze AX są wartości 011.W programie parokrotnie będzie
wprowadzana maska AND.
progr segmentassume cs:progr, ds:dane, ss: stosik;procedura wypisujaca na ekrannaekran procmov
ah,09hint 21hretendpstart: mov ax,dane;mov
ds,axmov ax,stosikmov ss,axmov sp, offset szczyt;czyszczenie ekranumov ah,00mov al,03hint
10h; poczatek programu;wypisanie ilosci
RS 232int 11hand ax,0000111000000000b;Maska
ANDshr ax,9;przesuniecie logiczne w prawo wyniku
add ax,30h; dodanie do rejestru kodu ASCII znaku
'0'mov bx,offset portys;obliczenie przesuniecia
zmiennej zgledem poczatku segmentu danych mov ds:[bx],al;zapis do zmiennej w segmencie danych;wypisanie ilosci lptmov ax,0xor ax,axmov
es,axmov ax,es:[410h]and ax,1100000000000000bshr ax,14add
ax,30h; kod znaku '0'mov bx,offset portyrmov ds:[bx],almov dx,
offset napiscall naekran;; wypisywanie trybu
videoint 11hand ax,0000000000110000bshr ax,4cmp
ax,1je vga1cmp ax,2je vga2cmp ax,3je
vga3vga1:mov dx,offset vga40kcall naekranjmp
fdd1vga2:mov dx,offset vga80kcall naekranjmp
fdd1vga3:mov dx,offset vgamcall naekranjmp
fdd1;sprawdzanie czy FDD jest w
komputerzeint 11hand ax,1bcmp ax,0 ; porownanie rejestru ax z zeremje fdd2 ; skok do etykiety fdd2 jesli ustawione jest ZF; sprawdzanie
ile FDD jest w systemiefdd1:int 11hand
ax,0000000011000000bshr ax,6;add ax,1;add ax,30hmov
bx,offset dyskimov ds:[bx],al;mov dx,offset dyski; podanie adresu napisu o istnieniu napeducall
naekranjmp dosfdd2:; wpisanie brak
FDDmov dx,offset ndyski; podanie przesuniecia
adresu napisow o braku napedu wzgledem poczatku segmentu danychcall
naekran; koniec programu; wyjscie do
DOSdos:mov ah,4Chmov al,0int 21hprogr
ends; Segment z danymi do
programudane segmentnapis db ' Informacje o komputerze
:',10,13,'----------------------',10,13portys db 20h,20h,'portow
szeregowych',10,13portyr db 20h,20h,'portow rownoleglych',10,13,'$'dyski
db ' stacji dyskietek',10,13,'$'pamram db 20h,20h,'bajtow konwencjonalnej
pamieci RAM',10,13,'$'ndyski db 'brak napedu dyskietek',10,13,'$'vga80k
db 'Karta graficzna dziala w kolorowym trybie tekstowym 80x25
',10,13,'$'vga40k db 'Karta graficzna dziala w kolorowym trybie tekstowym
40x25 ',10,13,'$'vgam db 'karta graficzna dziala w czarno-bialym trybie
tekstowym ',10,13,'$'dane endsstosik segmentdw 100h
dup(?)szczyt label word;stosik endsend start;











Strona utworzona przez(c)2001


Wyszukiwarka

Podobne podstrony:
czas i ruch na ekranie
Wymiary znakow na ekranie
Wymiary znakow na ekranie
gdy noob na ekranie
pisanie na ekranie
Whitman na ekranie
ClickIt program do tworzenia aktywnych miejsc na ekranie komputera(1)
Ukrycie konta na ekranie powitalnym
Linijka na ekranie komputera Info
na;szklanym;ekranie,kategoria,432
Sterowanie rejestrami przesuwnymi z wykorzystaniem interfejsu SPI na przykładzie 6 cyfrowego wyświet
Kolejny miernik na ICL7107 i wyświetlaczach LED wspólna anoda schemat
wyswietlanie informacji o systeme,IP, przegladarce na stronie
wyswietlanie informacji o systeme,IP, przegladarce na stronie
lista komunikatów na wyświetlaczu

więcej podobnych podstron