[ASM] Konwersja bajtów na liczbę zmiennoprzecinkową

0

Mój problem jest następujący:

W pamięci mam kolory RGB, powiedzmy:

0h : R0
1h : G0
2h : B0

3h : R1
4h : G1
5h : B1

6h : R2
7h : G2
8h : B2

itd.

(gdzie pod Ri, Gi, Bi kryją się wartości 0-255).

Chcę je skonwertować na liczby zmienno-przecinkowe pojedynczej precyzji, aby następnie pomnożyć każdą wartość przez odpowiednią liczbę (rownież REAL4).

Wszystkie wartości R przez 0,39; wszystkie wartości G przez 0,51; wszystkie wartości B przez 0,19.

Nasunęło mi się wykorzystanie rozszerzeń SSE/SSE2.

Ponieważ w jednym rejestrze XMM można spakować 4 wartości typu REAL4, chciałbym to skonstruować w następujący sposób:

user image

I tutaj jest problem:

Czy da się skonwertować 3 bajty z pamięci do 3 liczb REAL4 w rejestrze XMM (tak jak na rysunku), pozostawiając ostatnie pole puste (albo wpisując tam cokolwiek, np. 0) ?

Wtedy można by łatwo przemnożyć wszystkie wartości RGB przez żądane liczby.

0

Po co chcesz liczby całkowite konwertować na zmiennoprzecinkowe?
Liczby 0-255 są całkowite, zatem możesz pomnożyć normalnie liczbę całkowitą przez zmiennoprzecinkową i w wyniku otrzymasz liczbę zmiennoprzecinkową.

0

Ale czy wtedy będę mógł do tego użyć rejestrów XMM w taki sposób jak to opisałem?

0

moze wystarczy taka precedurka

scale_color: //skladowa koloru w ax, mnoznik (x100) w bx
imul ax, bx
mov bx, 100;
idiv bl
ret //wynik w al

i wywolanie dla kazdej skladowej

mov ax, R
mov bx, 39
call scale_color
...
mov ax, G
mov bx, 51
call scale_color
...
mov ax, B
mov bx, 19
call scale_color
...
0

Nie używałem dużo MMX i pochodnych ale wydaje mi się, że najpierw musisz zrobić unpack ( http://homepage.mac.com/randyhyde/webster.cs.ucr.edu/www.artofasm.com/Windows/HTML/TheMMXInstructionSeta2.html ) a potem konwersję z int na float (jest w sse chyba). I zamiast dodawać to 0 w każdym rejestrze to zrobić 3 mnożniki (dla każdego przesunięcia). Ttak jak koledzy mówią, nie bawić się w floaty tylko w 16 bitach fixed point.

1 użytkowników online, w tym zalogowanych: 0, gości: 1