[ASM] Zadanie optymalizacyjne

0

Procesor: 8086 (ciekaw jestem gdzie oprócz muzeum można jeszcze taki znaleźć :-D )
Zadanie:
Wyznaczyć dwie liczby Offset i Bank, według wzoru:
a)
Offset := (ywidth+x) and 0ffffh
Bank := (y
width+x) shr 10h
b)
Offset := (y*width+x)4 and 0ffffh
Bank := (y
width+x)*4 shr 10h

Zadanie rozpatrzyć dla width = 640, 800, 1024

Jakby komuś się chciało pobawić i coś zasugerować, to jestem otwarty na propozycje (na razie najszybszą metodę otrzymałem dla 1024 :P)

0

ad b. bank... *4 shr 16. Może na początek samo shr 12 (shr 0ch)

Poza tym jesli offset jest trzymany w danej 2-bajtowej, to nie potrzeba and 0ffffh.

// Widzę, że cały czas gryziesz vesę

[dopisane]

Gdy width to potęgi 2 (1024=2^10), to lepiej uzyć np. shl 10 (shl 0ah) - szybciej, więc nie dziwne, że masz najlepsze efekty.

// 12 dec=0c hex, za pierwszym razem zawsze się gdzieś pomylę

Co do 8086- to jeszcze przedwczoraj (chyba) miałem oryginalnego IBM-a XT z NEC-iem V20 na pokładzie (8086 lub 8088- NEC-a). Chciałem go komus oddać za darmoche, ale niestety zgłosił sie po niego tylko śmietnik. A taki piękny dysk miał - 10Mb 5,25" podwójna wysokość (2xcdrom) MFM, oczywista :)

0

Ja już różne optymalizacje robiłem, ale chciałem się was wypytać :)
I tak doszedłem do wniosku, że najzwyklejsze mnożenie i tak u mnie wystarczy, bo bitmapa jest stale odczytywana z dysku i to właśnie ten odczyt jest najwolniejszy. Ale jakby mnie coś naszło, by w końcu przerobić sobie to na 32-bit i buforować w pamięci to nawet te optymalizacje dla 8086 mogą pomóc, a w każdym razie dają mi możliwość spojrzenia, jak inni podchodzą do takich zaganień :)

0

Kuba - pozwoliłem sobie na optymalizację pod Pentium - może się przyda - pisałeś na gg, że też z chęcią na to popatrzysz.

Wersja dla 640.

Offset := (ywidth+x) and 0ffffh
Bank := (y
width+x) shr 10h

[code]640 = 512 + 128
9 7[/code]

mov eax,y       ;U
mov edx,x       ;  V
shl eax,7       ;U
mov ebx,eax     ;  V (opóźnienie)
shl ebx,2       ;U
add eax,edx     ;  V
add eax,ebx     ;U   (chyba bez opóźnienia)
xor ebx,ebx     ;  V
mov bx,ax       ;U
shr eax, 16     ;  V

offset - ebx (bx)
bank - eax

Jeśli moja znajomość (niestety - jeszcze niezbyt dobra) optymalizacji pod Pentium+ jest poprawna, to ten kod powinien wykonać się w ciągu 6 taktów procesora.

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