 Wane informacje (2:482/33)  -WANE- 
 Msg  : 92 of 94                            Snt Loc
 From : Marcin Macinski                     2:482/33        Tue, 05 Nov, 21:49
 To   : All                                                 Sun, 10 Nov, 21:58
 Subj : Assembler, the story begins [part 6, useful multiplication]

Vitay All!

 Obiecaem w poprzednim odcinku, e nauczymy si mnoy inaczej (: Zauwaylicie
pewnie, e bardzo wiele liczb, ktrych uywa si podczas pisania programw, to
potgi dwjki (ATSD, ciekawe dlaczego? (; ). Program, ktry przedstawiem
ostatnio, wykonywa nastpujc operacj:
 absolute:=320*poz_y+poz_x

 Okazuje si, e mona t operacj moe nie tyle uproci, co znacznie
przyspieszy, stosujc zamiast MUL przesunicia bitowe.

>SHL rejestr,Y
    Przesunicie bitowe w lewo o Y pozycji
>SHR rejestr,Y
    Przesunicie bitowe w prawo o Y pozycji

 Na czym polega idea przesunicia bitowe? Spjrzmy na przykad:

 mov al,00101101b
 shl al,2

 Otrzymujemy w AL warto 10110100b (wszystkie jedynki i zera przesuny si o
dwa miejsca w lewo). Analogicznie sprawa si ma w przypadku przesunicia w
prawo. Co z tego wynika w praktyce? Wemy kolejny przykad:

 bit        7   6   5   4   3   2   1   0
 warto   128  64  32  16  8   4   2   1

 liczba     0   0   0   0   0   1   1   0     (dziesitnie 6)
 (robimy shl liczba,2)
 liczba2    0   0   0   1   1   0   0   0     (dziesitnie 24)

 Liczba2, jak widzimy, jest 2^2 razy wiksza od liczba1. miao wic mona
stwierdzi, e za pomoc SHL mnoy przez potgi dwjki, za SHR - dzieli.

 Sprbujmy teraz pomnoy jak liczb przez 320 za pomoc SHL. Jak to zrobi,
przecie 320 nie jest potg dwjki? To prawda, ale wiadomo, e 320=256+64, a te
dwie ostatnie liczby to z pewnoci 2^8 oraz 2^6.
 Z matematyki wiemy, e A*B = (A1+A2)*B = A1*B+A2*B, gdzie A1+A2=A. Wobec tego

   mov bx,poz_y        ; wprowadzamy do BX warto poz_y
   shl bx,8            ; mnoymy j przez 256
   mov cx,poz_y        ; wprowadzamy do CX warto poz_y
   shl cx,6            ; mnoymy j przez 64
   add bx,cx           ; dodajemy do siebie obie wartoci - i gotowe!
   add bx,poz_x        ; wystarczy jeszcze jedynie doda do tego poz_x
   mov absolute,bx     ; i mamy ju wsprzdne bezwzgldne...

 Wytnij teraz powyszy fragment kodu i wklej go w miejsce poprzedniego (pomidzy
znakami "***"). Upewnij si na wasne oczy, e to dziaa (:

  ,
 /;`\ koniu
 ` | \____
 .-(_ ___ ):.
  `  | ,-'| ;
     ^    ^
--- GoldED/386 2.50+
 * Origin: Myl, e jest martwy, ale boj si zapyta (2:482/33)
