Tyto instrukce jsou velmi používané hned z několika důvodů. Umožňují jednoduché osamostatnění hodnoty určitého bitu(nebo několika bitů najednou) z čísla - ve spojení s instrukcí AND. Dále jsou kvůli své rychlosti používané v rychlých rutinách(engine her), kde nahrazují a radikálně urychlují násobení čísel.
Funkce je následující :
<co> -------------- CF << | << bity << | << 0 --------------Př:
Z toho "obrázku" to není zrovna pochopitelné, takže to vysvětlím pořádně.
Dejme tomu, že mám instrukci SHL AL,3. AL si můžu představit jako 8 bitů. Těchto 8 bitů vezmu a posunu je o 3 doprava. Neboli tři původní bity úplně vlevo jsou vysunuty ven z AL. Tři bity vpravo jsou naplněny nulami, zbytek se o tři posune doleva.
Když se nad tím zamyslíš, zjistíš, že bitovým posunem doleva čísla X o jedna vznikne číslo 2*X. Posunem o dva vznikne číslo 4*X, atd. Obecně posunem o A vznikne číslo X*2A. Ale jak násobit třeba číslem 10 ? Stačí použít trochu matematiky :
X*10 = X*(4+1)*2
X*10 = (X*4+X)*2
MOV AX,ZÁKLAD ; ZÁKLAD číslo, které chci násobit deseti SHL AX,2 ; Násobení čtyřmi ADD AX,ZÁKLAD SHL AX,1 ; Násobení dvěma. V AX je výsledek
Obecně se tento postup dá zjistit jednoduchým způsobem. Přepíšu si číslo, kterým chci násobit do dvojkové soustavy. Např. 10110(22). Najdu zleva první jedničku a začnu psát standartní MOV AX,ZÁKLAD. Potom najdu další jedničku směrem doprava od první jedničky. Zjistím, jak jsou od sebe daleko, neboli odečtu jejich pozice. U nás je to 2. Připíšu tedy instrukci SHL AX,2. Opět přidám ADD AX,ZÁKLAD a jedu na další jedničku. Teď je rozdíl jedna, tak píšu SHL AX,1 a ADD AX,ZÁKLAD. Byla to už poslední jednička, tak připíšu poslední SHL AX,1(pozice poslední jedničky).
Samozřejmě, tento způsob se používá pouze v případě, že číslo, kterým budu chtít násobit znám už předem a přímo pro něj algoritmus dělám. Pro program, který se zeptá uživatele na dvě čísla a pak je vynásobí tento postup nejde použít a musí se použít MUL.
Zapoměl jsem napsat, co lze použít jako parametr <o kolik>. Může to být buď konstanta, nebo registr CL. Nic víc(pokud vím).
Opak instrukce SHL. Posun doprava, dělení dvěma ... Není třeba delšího popisu.
Úvodní stránka | Aritmetické instrukce | Zbylé instrukce |
Stránku připravuje Lukáš Valenta,
1. v celostátním kole soutěže v programování, kategorie mládež.