Popiol |
Poison Headcrab |
|
|
Dołączył: 02 Lis 2005 |
Posty: 16 |
Przeczytał: 0 tematów
Ostrzeżeń: 0/5
|
Skąd: Wygiełzów |
|
|
|
|
|
|
Sorki, ale w temacie assembler w OpenGL to ci nie pomogę, bo nic o tym nie wiem.
Tymczasem jednak omówię ostatni programik. Poprawiłem go trochę, tak, że teraz można sobie rzeczywiście trochę pograć. Dodatkowym utrudnieniem w grze jest to, że pod XP beznadziejnie to chodzi. Ja najwięcej miałem 11 pkt, ale krótko grałem . Jest tu parę fajnych, naprawdę przydatnych funkcji, które można używać w innych programach.
Pierwsza taka funkcja to cout. Jej nazwa znacznie przerasta faktyczne możliwości. Można tą funkcją wypisać stały string (wpisany w kod na stałe). Najciekawszy jest tu sposób przekazywania do funkcji parametru. String, który chcemy wyświetlić definiujemy bespośrednio po wywołaniu funkcji. Jeśli nic nie wpiszemy to program się wykrzaczy. String kończymy tutaj znakiem o kodzie 0, a nie $ jak w przerwaniu, które użyłem w pierwszym poście. Procedurka cout jest na tyle sprytna, że pobiera sobie ze stosu adres powrotny, czyli adres komórki znajdującej się po wywołaniu procedury. Właśnie tam jest nasz string. Adres wrzucamy do rejestru indeksowego di. Teraz wystarczy zapuścić pętle, która wypisuje znak spod adresu di i inkrementuje rejestr, aż napotka znak o kodzie 0. Do wypisywania znaku użyłem tym razem przerwania biosowego, a nie dosowego, bo przerwaniem biosowym skaczę do różnych miejsc ekranu. Jest to przerwanie z serii 10h (Video BIOS Services), o numerze 15 (ah = 0Eh, Write Text in Teletype Mode). W al podaje się kod ASCII znkau, w bh numer strony (standardowo 0), a w bl kolor tła teksu (tylko w trybie graficznym). Po wyjściu z pętli wstawiamy na stos poprawny adres powrotny. Użyłem w tej procedurce operacji xor. Mam nadzieje, że wiecie co to jest, a jeśli nie to trudno, napiszę tylko, że xor x, x zeruje x.
Następna ciekawa procedura to wypiszCyfre. Musi ona zamienić cyfrę, zapisaną w rejestrze al na kod ASCII. Robi to dodając do cyfry liczbę 48, bo 48 to kod cyfry 0. Do wypisania znaku użyłem tu trochę innego przerwania niż poprzednio. Tamto też mogło by tu być. Różnica między tymi przerwaniami jest taka, że to poprzednie (ah = 0Eh) przesuwa kursor, a to drugie (ah = 0Ah) nie. Dzięki tej procedurze możemy wypisywać na ekran liczby, ale nie jest to takie proste. Przechodzimy zatem do procedury piszPunkty. Tutaj dzielimy liczbę, którą chcemy wypisać przez 10. Reszta z dzielenia, którą dostajemy w rejestrze ah to cyfra jedności. Wypisujemy ją i dzielimy przez 10 część całkowitą ostatniego dzielenia. Dostajemy cyfrę dziesiątek. Wypisujemy ją... itd. Ta procedurka dochodzi tylko do cyfry setek, co w przypadku liczby jednobajtowej wystarczy. Można napisać analogiczną procedurę, która wypisuje dwubajtowe liczby. Oczywiście zamiast wpisywać ręcznie kilka dzieleń i wypisań liczby lepiej umieścić to w pętli. Zamiast od razu wypisywać cyfrę można też wrzucić ją na stos. Na końcu możemy wypisać od razu wszystkie wrzucone cyfry. Będzie to wyglądać tak:
Kod: | .model tiny
.code
org 256
start:
mov ax, 2559
call wypiszLiczbe2
jmp exit
wypiszLiczbe2 proc
;wypisuje liczbe z rejestru ax
cmp ax, 0
je wypiszzero
mov bl, 10
mov cx, 5
push 100 ; ogranicznik
wypiszLiczbe2_petla:
div bl
push ax
cmp al, 0
je wypisz
mov ah, 0
loop wypiszLiczbe2_petla
wypisz:
pop ax
wypiszLiczbe2_petla2:
mov al, ah
add al, 48
xor bx, bx
mov ah, 0Eh
int 10h
pop ax
cmp ax, 100
jne wypiszLiczbe2_petla2
ret
wypiszzero:
mov al, 48
xor bx, bx
mov ah, 0Eh
int 10h
ret
wypiszLiczbe2 endp
exit:
mov ah, 4ch
int 21h
end start |
Największa liczba jaką możemy wypisać za pomocą tej procedury to 2559, bo jak to podzielimy przez 10 to część całkowita jeszcze mieści się w jednym bajcie. Można to przerobić tak, żeby działało dla większych liczb.
Kolejna przydatna procedurka nazywa się skocz. Ustawia ona kursor w danym miejscu na ekranie. W rejestrze dl podajemy numer kolumny, a w rejestrze dh numer wiersza. Przerwanie z tej samej serii co ostatnio, numer 2.
Na razie tyle, resztę opiszę kiedy indziej, bo muszę zabierać się za projekt z grafiki . |
|