Docstoc

Jednostka MMX

Document Sample
Jednostka MMX Powered By Docstoc
					ARCHITEKTURA KOMPUTERÓW - LABORATORIUM




Jednostka MMX
  Dokumentacja ćw. 1-5
        Zuzanna Hartleb i Artur Angiel
                 2010-06-16
                                       Jednostka MMX


       Program odczytuje z dysku obrazek, wykonuje na nim wybrane przez użytkownika operacje
graficzne, oraz zapisuje (zgodnie z wolą użytkownika) zmieniony obraz na dysku.

      Obrazek zostaje wyswietlony na ekranie w trybie 13h, który charakteryzuje się rozdzielczością
320x200 pikseli oraz 256 kolorami, określonymi za pomocą palety kolorów. Pamięć tego trybu
znajduje się pod adresem 0A000h:0000h i zajmuje 64000 bajtów.

      Informacje znajdujące się w nagłówku pliku bmp przechowywane są w programie w postaci
następujących struktur:



                 BitmapFileHeader         struc
                       bfType             DW      ?
                       bfSize             DD      ?
                       bfReserved1        DW      ?
                       bfReserved2        DW      ?
                       bfOffBits          DD      ?
                 BitmapFileHeader         ends

                 BitmapInfoHeader struc
                       biSize                     DD      ?
                       biWidth                    DD      ?
                       biHeight                   DD      ?
                       biPlanes                   DW      ?
                       biBitCount                 DW      ?
                       biCompresion               DD      ?
                       biSizeImage                DD      ?
                       biXPelsPerMeter            DD      ?
                       biYPelsPerMeter            DD      ?
                       biClrUsed                  DD      ?
                       biClrImportant             DD      ?
                 BitmapInfoHeader ends




      Program, aby był bardziej przejrzysty, korzysta z makroinstrukcji.

      Makroinstrukcja "otworz_plik", przyjmuje jako argumenty nazwę pliku w kodzie ASCIIZ, oraz
zmienną przechowującą uchwyt do pliku. Do rejestru AH należy załadować numer funkcji
otwierającej plik (3Dh), do AL maskę określającą uprawnienia otwartego pliku (10010000b), a w DX
początek bufora zawierającego nazwę pliku, zakończoną znakiem '$'.

      Przerwanie 21h na podstawie zawartości rejestrów otwiera plik i w rejestrze AX zwraca
16-bitowy uchwyt do pliku, za pomocą którego będziemy w przyszłości odwoływać się do tego pliku.

      W przypadku błędu ustawiany jest CF i makroinstrukcja kończy program.



Ćwiczenie 1-5                                                                             Strona 2
                                          Jednostka MMX


         otworz_plik     macro nazwa, uchwyt
                push     ax
                push     dx

                 mov     ah, 3Dh
                 mov     al, 10010000b
                 xor     dx, dx
                 mov     dx, offset nazwa
                 int     21h

                 jnc    Git
                 wyswietl          blad

                 mov     ah, 4Ch
                 int     21h

         Git:
                 wyswietl          poprawnie
                 mov               uchwyt, ax

                 pop     dx
                 pop     ax
         endm




      Makro "czytaj_z_pliku" czyta określoną liczbę bajtów z pliku. Jako parametry przyjmuje bufor,
do którego zapisze odczytane dane, liczbę bajtów do przeczytania, oraz uchwyt do pliku. W AH należy
podać numer funkcji (3Fh), w BX uchwyt do pliku, w CX liczbę bajtów do przeczytania, a w DX offset
bufora operacji. Następnie wywoułuje przerwanie 21h.

         czytaj_z_pliku            macro bufor, liczba_bajtow, uchwyt
         push ax
         push bx
         push cx
         push dx

         mov     ah,   3Fh
         mov     bx,   uchwyt
         mov     cx,   liczba_bajtow
         mov     dx,   offset bufor
         int     21h

         pop     dx
         pop     cx
         pop     bx
         pop     ax
         endm


Ćwiczenie 1-5                                                                             Strona 3
                                     Jednostka MMX

      Za pomocą powyższego makra odczytujemy nagłówki pliku, paletę, oraz sam obraz.

      Następnie za pomocą makra "zamknij_plik" zamykamy dostęp do tego pliku. Makro przyjmuje
jeden parametr, mianowicie uchwyt do pliku:

         zamknij_plik           macro uchwyt
               push ax
               push bx

                 mov    ah, 3Eh
                 mov    bx, uchwyt
                 int    21h

                 pop    bx
                 pop    ax
         endm



       Następnie za pomocą przerwania 10h i funkcji 0013h przekazanej przez AX uruchamia się tryb
graficzny 13h:

         tryb_graficzny    macro
               push ax
               mov   ax, 0013h
               int   10h
               pop   ax
         endm




Ćwiczenie 1-5                                                                           Strona 4
                                       Jednostka MMX


      Następnie program ustawia paletę kolorów na skalę szarości. Do CX ładuje wartość 256,
ponieważ tyle jest pól palety i w kolejnych krokach obliczane są wartości trzech składowych. Aby
uzyskać odcień szarości, wszystkie trzy składowe kolorów muszą być równe, w tym celu poprzez
funkcję 3C8h umieszczoną w DX, odwołujemy się do pola palety, a poprzez 3C9h do kolejnych
składowych. Dzięki powyższym odwołujemy się do portów graficznych.

         ustaw_palete           proc    near
               push ax
               push cx
               push dx

               xor      ax, ax
               mov      cx, 256         ; załadowanie ilości pól palety
         petelka:
               mov      dx, 3C8h        ;   odwołanie się do portu określającego
                                        ;   nr pola palety
                out     dx, al          ;   wysłanie kolejnych numerów pól (0-
                                        ;   255)
                mov     dx, 3C9h        ;   odwoładnie do kolejnych składowych
                push    ax
                shr     al, 2           ;   przesunięcie bitowe w prawo, aby
                                        ;   obliczyć wartość dla składowych
                out     dx, al          ;   wysłanie obliczonych wartości
                out     dx, al          ;   dx inkrementuje się automatycznie
                out     dx, al
                pop     ax
                inc     al              ; inkrementacja numeru pola
                loop    petelka

               pop   dx
               pop   cx
               pop   ax
               ret
         ustaw_palete           endp



      Następnie program wyświetla obraz, który w formacie .bmp zapisany jest "do góry nogami", co
oznacza, że ostatni wiersz jest zapisany jako pierwszy, przedostani jako drugi itd. przy czym należy
pamiętać, że ułożenie kolejnych pikseli w danym wierszu jest właściwe, czyli piksel znajdujący się na
ekranie po lewej, jest też zapisany w bitmapie na początku wiersza. W procedurze "wyswietl_obraz"
najpierw wyswietlamy pierwszy wiersz bitmapy na samym dole od lewej strony, a następnie
odejmujemy 640, aby znaleźć się na początku poprzedniego wiersza, przez co wyświetlony obraz
będzie zgodny z oryginałem, a nie będzie to odbicie lustrzane. Offset bufora obrazu musi zostać
umieszczony w rejestrze SI. Procedura po wyświetleniu obrazu czeka na dowolny klawisz, aby
kontynuować działanie programu.




Ćwiczenie 1-5                                                                               Strona 5
                                     Jednostka MMX


       wyswietl_obraz        proc    near
             push ax
             push es
             push di
             push cx
             push si

                mov   cx,   200
                mov   ax,   0A000h
                mov   es,   ax
                mov   di,   0F8C0h

       peteleczka:
             push cx
             mov   cx, 320
             rep movsb
             pop   cx
             sub   di, 640
             loop peteleczka

                mov     ah, 08h      ;oczekiwanie na dowolny klawisz
                int     21h

             pop   si
             pop   cx
             pop   di
             pop   es
             pop   ax
             ret
       wyswietl_obraz endp



     Następnie za pomocą makra "tryb_tekstowy" przywracamy wyswietlanie w trybie tekstowym.
W tym celu należy w AX podać funkcję 0003h i wywołać przerwanie 10h.

      tryb_tekstowy          macro
            push ax

                mov   ax, 0003h
                int   10h
                pop   ax
      endm




Ćwiczenie 1-5                                                                      Strona 6
                                       Jednostka MMX


       Następnie program wyświetla użytkownikowi stosowne komunikaty dot. wyboru operacji do
przeprowadzenia na pliku. W przypadku tego programu jest to negatyw oraz jasność. Program
przyjmuje tylko i wyłącznie znak '1' bądź '2' i w zależności od wyboru skacze do odpowiedniej etykiety
wykonującej wybraną operację:

                wyswietl       powitanie
                wyswietl       wybor
                wyswietl       opcje

        Wybor_opcji:

                mov        ah, 08h     ;oczekiwanie na dowolny klawisz
                int        21h

                cmp al, 31h
                je    Wybor_negatyw
                cmp al, 32h
                je    Wybor_jasnosc

                jmp Wybor_opcji



       Głównym elementem programu są makroinstrukcje wykonujące operacje na obrazie -
"negatyw_mmx" oraz "jasnosc_mmx". Oba te makra są do siebie podobne, różnią się jedynie
wykonywanymi operacjami na rejestrach MMX. Jako, że obraz zajmuje 64000 bajtów, a w jednym
rejestrze jesteśmy w stanie pomieścić osiem jednobajtowych wartości, musimy operację negacji,
bądź rozjaśniania wykonać 8000 razy. W tym celu program ładuje w pętli po 8 bajtów do rejestru
MM0, a następnie w przypadku negatywu, wykonuje bitowe XOR z samymi jedynkami oraz rejestrem
MM0, co jest równoważne negacji, a w przypadku jasności, dodaje do aktualnych wartości pól palety
pewną stałą przekazaną jako jeden z argumentów makroinstrukcji.

        negatyw_mmx macro bufor, Odjemna
              push si
              push cx

              mov       si, offset obraz
              mov       cx, 8000
        neguj:
              movq      mm0, [si]
              pxor      mm0, Odjemna
              movq      [si], mm0
              add       si, 8
              loop      neguj

                pop     cx
                pop     si
        endm



Ćwiczenie 1-5                                                                                Strona 7
                                     Jednostka MMX


       jasnosc_mmx macro bufor, stala_jasnosci
             push si
             push cx

             mov   si, offset obraz
             mov   cx, 8000
       jasnij:
             movq mm0, [si]
             paddusb     mm0, stala_jasnosci
             movq [si], mm0
             add   si, 8
             loop jasnij

                pop   cx
                pop   si
       endm




     Program po wykonaniu zadanej mu operacji pyta użytkownika czy zapisać zmieniony obraz.
Odpowiedzią mogą być 't' lub 'n'. W zależności od wybranej opcji zmieniony obraz zostaje zapisany
pod nazwą "lena_mod.bmp" bądź nie. Odpowiada za to następujący fragment:



       Zapisuj:
             mov           ah, 08h
             int           21h

                cmp   al, 6Eh
                je    Koniec
                cmp   al, 74h
                jne   Zapisuj

                zapisz_plik




      Makroinstrukcja "zapisz_plik" odpowiada za zapisanie wszystkich informacji do pliku
wyjściowego, którego nazwę należy podać w kodzie ASCIIZ. Na utworzenie pliku pozwala programowi
funkcja 5Bh z przerwania 21h. Kiedy plik zostanie poprawnie utworzony, program kolejno zapisuje
nagłówki, paletę, oraz samą bitmapę. Pozwala na to funkcja 40h przerwania 21h.




Ćwiczenie 1-5                                                                           Strona 8
                                  Jednostka MMX


       zapisz_plik    macro
             push     ax
             push     bx
             push     cx
             push     dx

                mov   ah, 5Bh
                mov   al, 10010001b
                mov   dx, offset plik_wyjsciowy
                mov   cx, 00000000b
                int   21h
                mov   uchwyt2, ax
                jnc   poprawnie_utworzono

                wyswietl    blad_zapisu
                jmp   Koniec

       poprawnie_utworzono:
             mov   ah, 40h
             mov   bx, uchwyt2
             mov   cx, 14
             mov   dx, offset naglowek_pliku
             int   21h

                mov   ah,   40h
                mov   bx,   uchwyt2
                mov   cx,   40
                mov   dx,   offset info_bitmapy
                int   21h

                mov   ah,   40h
                mov   bx,   uchwyt2
                mov   cx,   1024
                mov   dx,   offset paleta
                int   21h

                mov   ah,   40h
                mov   bx,   uchwyt2
                mov   cx,   64000
                mov   dx,   offset obraz
                int   21h

                pop   dx
                pop   cx
                pop   bx
                pop   ax
       endm




Ćwiczenie 1-5                                     Strona 9

				
DOCUMENT INFO
Shared By:
Categories:
Tags:
Stats:
views:18
posted:12/19/2011
language:Polish
pages:9