pRoGraMerZ


Forum pRoGraMerZ Strona Główna -> Assembler -> Pierwsze kroki Idź do strony Poprzedni  1, 2, 3, 4  Następny
Napisz nowy temat  Odpowiedz do tematu Zobacz poprzedni temat :: Zobacz następny temat 
PostWysłany: Nie 15:12, 13 Lis 2005
freeman
Administrator

 
Dołączył: 20 Paź 2005
Posty: 9
Przeczytał: 0 tematów

Ostrzeżeń: 0/5





Świetny tutorial :] Good Job
Zaraz zabieram się do czytania, hehe. Cool
Piotrek, Ty uczysz się OpenGL'a na uczelni - czy asembler jest tego częścią? Możnaby programować shadery w asemblerze pod OpenGL'em... ale pewnie do tego długa droga, przynajmniej w moim przypadku Smile


Post został pochwalony 0 razy
Zobacz profil autora
PostWysłany: Śro 1:04, 23 Lis 2005
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 Smile. 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 Smile.


Post został pochwalony 0 razy
Zobacz profil autora
PostWysłany: Śro 1:16, 23 Lis 2005
Popiol
Poison Headcrab

 
Dołączył: 02 Lis 2005
Posty: 16
Przeczytał: 0 tematów

Ostrzeżeń: 0/5
Skąd: Wygiełzów





Mam pytanie do administratorów. Czy te posty kiedyś przejdą w końcu na drugą stronę Question Ta strona zaczyna się niebespiecznie wydłużać Smile.


Post został pochwalony 0 razy
Zobacz profil autora
PostWysłany: Sob 11:46, 26 Lis 2005
bednarz
Administrator

 
Dołączył: 20 Paź 2005
Posty: 6
Przeczytał: 0 tematów

Ostrzeżeń: 0/5





mowisz i masz Smile


Post został pochwalony 0 razy
Zobacz profil autora
PostWysłany: Nie 20:58, 27 Lis 2005
Popiol
Poison Headcrab

 
Dołączył: 02 Lis 2005
Posty: 16
Przeczytał: 0 tematów

Ostrzeżeń: 0/5
Skąd: Wygiełzów





no teraz to jest full wypas Very Happy


Post został pochwalony 0 razy
Zobacz profil autora
Pierwsze kroki
Forum pRoGraMerZ Strona Główna -> Assembler
Możesz pisać nowe tematy
Możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Wszystkie czasy w strefie EET (Europa)  
Strona 2 z 4  
Idź do strony Poprzedni  1, 2, 3, 4  Następny
  
  
 Napisz nowy temat  Odpowiedz do tematu  


fora.pl - załóż własne forum dyskusyjne za darmo
Powered by phpBB © 2001-2003 phpBB Group
Theme created by Vjacheslav Trushkin
Regulamin