Jednostka MMX
Transkrypt
Jednostka MMX
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ęd 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 bfType bfSize bfReserved1 bfReserved2 bfOffBits BitmapFileHeader struc DW DD DW DW DD ends BitmapInfoHeader struc biSize biWidth biHeight biPlanes biBitCount biCompresion biSizeImage biXPelsPerMeter biYPelsPerMeter biClrUsed biClrImportant BitmapInfoHeader ends ? ? ? ? ? DD DD DD DW DW DD DD DD DD DD DD ? ? ? ? ? ? ? ? ? ? ? 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ładowad 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, zakooczoną 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ływad się do tego pliku. W przypadku błędu ustawiany jest CF i makroinstrukcja kooczy program. Ćwiczenie 1-5 Strona 2 Jednostka MMX otworz_plik push push mov mov xor mov int macro nazwa, uchwyt ax dx ah, 3Dh al, 10010000b dx, dx dx, offset nazwa 21h jnc Git wyswietl mov int blad ah, 4Ch 21h Git: wyswietl mov pop pop poprawnie uchwyt, ax dx 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 podad 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 push ax push bx push cx push dx mov mov mov mov int ah, bx, cx, dx, 21h pop pop pop pop endm dx cx bx ax Ćwiczenie 1-5 macro bufor, liczba_bajtow, uchwyt 3Fh uchwyt liczba_bajtow offset bufor 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 push ax push bx macro uchwyt mov mov int ah, 3Eh bx, uchwyt 21h pop pop bx 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śd 256, ponieważ tyle jest pól palety i w kolejnych krokach obliczane są wartości trzech składowych. Aby uzyskad odcieo szarości, wszystkie trzy składowe kolorów muszą byd 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 push ax push cx push dx xor mov petelka: mov proc ax, ax cx, 256 dx, 3C8h out dx, al mov push shr dx, 3C9h ax al, 2 out out out pop inc loop dx, al dx, al dx, al ax al petelka pop dx pop cx pop ax ret ustaw_palete near ; załadowanie ilości pól palety ; ; ; ; ; odwołanie się do portu określającego nr pola palety wysłanie kolejnych numerów pól (0255) odwoładnie do kolejnych składowych ; ; ; ; przesunięcie bitowe w prawo, aby obliczyć wartość dla składowych wysłanie obliczonych wartości dx inkrementuje się automatycznie ; inkrementacja numeru pola 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ętad, ż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źd 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 zostad umieszczony w rejestrze SI. Procedura po wyświetleniu obrazu czeka na dowolny klawisz, aby kontynuowad działanie programu. Ćwiczenie 1-5 Strona 5 Jednostka MMX wyswietl_obraz push ax push es push di push cx push si mov mov mov mov cx, ax, es, di, proc near 200 0A000h ax 0F8C0h peteleczka: push cx mov cx, 320 rep movsb pop cx sub di, 640 loop peteleczka mov int ah, 08h 21h ;oczekiwanie na dowolny klawisz 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 podad funkcję 0003h i wywoład przerwanie 10h. tryb_tekstowy push ax mov int pop macro ax, 0003h 10h 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śd. 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 wyswietl wyswietl powitanie wybor opcje Wybor_opcji: mov int ah, 08h 21h ;oczekiwanie na dowolny klawisz 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ścid osiem jednobajtowych wartości, musimy operację negacji, bądź rozjaśniania wykonad 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 mov neguj: movq pxor movq add loop pop pop si, offset obraz cx, 8000 mm0, [si] mm0, Odjemna [si], mm0 si, 8 neguj cx 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 pop cx si endm Program po wykonaniu zadanej mu operacji pyta użytkownika czy zapisad zmieniony obraz. Odpowiedzią mogą byd '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 int cmp je cmp jne ah, 08h 21h al, 6Eh Koniec al, 74h Zapisuj zapisz_plik Makroinstrukcja "zapisz_plik" odpowiada za zapisanie wszystkich informacji do pliku wyjściowego, którego nazwę należy podad 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 push push push push mov mov mov mov int mov jnc macro ax bx cx dx ah, 5Bh al, 10010001b dx, offset plik_wyjsciowy cx, 00000000b 21h uchwyt2, ax 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 mov mov mov int ah, bx, cx, dx, 21h 40h uchwyt2 40 offset info_bitmapy mov mov mov mov int ah, bx, cx, dx, 21h 40h uchwyt2 1024 offset paleta mov mov mov mov int ah, bx, cx, dx, 21h 40h uchwyt2 64000 offset obraz pop pop pop pop dx cx bx ax endm Ćwiczenie 1-5 Strona 9