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

Podobne dokumenty