Cześć, jestem w trakcie pisania programu tworzącego negatyw bitmapy. Funkcja, która wykonuje ten negatyw pobiera jednowymiarową tablicę bajtów, rozmiary tablicy oraz zmienną do której zapisuje ilość cykli procesora. Wygląda mniej więcej tak:
Negatyw24 PROC stdcall uses eax ebx ecx edx, tab :dword, amount :dword, cycles :dword
RDTSC
mov ECX, cycles ;pobranie adresu tablicy
mov [ECX], EDX ;zapis starszej polowki licznika
mov [ECX+4], EAX ;zapis mlodszej polowki licznika
mov EAX, tab ;kopiuj adres 1 komorki
add EAX, amount ;dodaj ilosc komorek
sub EAX, 1 ;przjedz do ost komorki
loop:
mov BL, [EAX] ;pobierz komorke do rej
mov CL, 255 ;laduj FF do CL
sub CL, BL ;neguj bajt w BL
mov [EAX], CL ;zapisz zaneg bajt do pao
cmp EAX, tab ;sprawdz koniec tablicy
je end
sub EAX, 1 ;przesun sie w tablicy o 1 komorke do tylu
jmp loop
end:
RDTSC ;dokonaj drugiego odczytu licznika cykli
mov ECX, cycles
mov EBX, [ECX] ;odczytaj z pamieci poprzednie pomiary
mov EBX, [ECX+4]
sub EAX, [ECX+4] ;oblicz roznice
sbb EDX, [ECX]
mov [ECX], EDX ;i zapisz rezultat do kolejnych dwoch pol tablicy
mov [ECX+4], EAX
ret
Negatyw24 ENDP
Aktualnie mój kod napisany jest bez wykorzystania instrukcji procesora MMX. Czy byłby ktoś w stanie tak przerobić kod odpowiedzialny za samo wykonanie negatywu:
mov EAX, tab ;kopiuj adres 1 komorki
add EAX, amount ;dodaj ilosc komorek
sub EAX, 1 ;przjedz do ost komorki
loop:
mov BL, [EAX] ;pobierz komorke do rej
mov CL, 255 ;laduj FF do CL
sub CL, BL ;neguj bajt w BL
mov [EAX], CL ;zapisz zaneg bajt do pao
cmp EAX, tab ;sprawdz koniec tablicy
je end
sub EAX, 1 ;przesun sie w tablicy o 1 komorke do tylu
jmp loop
end:
aby wykorzystać te instrukcje MMX? Może to być zrobione sztucznie, czyli zamiast int stosować float, cokolwiek. Wszelkie moje próby kończyły się niepowodzeniem, stąd prośba do Was. Niestety mam takie wymagania projektowe i muszę to tak zrobić.