[ haggar @ 04.12.2004. 19:48 ] @
Zanima me koja je funkcija/svrha ovih operacija s bitovima tako da se mogu jednostavnije izvesti u višim jezicima:

SHL, SHR, SAL, SAR, ROL, ROR, RCL, RCR.

Mislim, znam po kojim se pravilima pomiću bitovi, ali svrha pomicanja je u stvari vršenje množenja i djeljenja, a to je ono što me zanima.

Npr. znam da će SHR EAX,2 cjelobrojno podjeliti vrijednost u EAX sa 2 i pospremiti kvocjent u EAX. Ostale ne znam.
[ Sundance @ 04.12.2004. 20:40 ] @
Kako mislis da ti nije jasno koja je njihova svrha?? Ako znas sto rade, njihova je svrha da rade to sto rade :)

Recimo, u 32-bitnom eax registru imas broj, u binarnom zapisu neka to bude niz 0 i 1. Pomicanjem udesno tezina svakog bita se smanjuje za 2^n gdje je n broj pomaknutih mjesta. Analogno se pomicanjem ulijevo povecava te se preko SHR i SHL moze vrlo lako obaviti mnozenje/dijeljenje sa proizvoljnom potencijom broja 2. Takvo je mnozenje/dijeljenje puno brze nego da si ga radio explicitno preko recimo mul/div.

Recimo mnozenje sa x*640 se moze obaviti kao zbroj mnozenja x*128 + x*512 i takvo fine-tuned mnozenje u asembleru za recimo kritican dio koda koji puno koristi takvo nesto ce biti daleko optimiziranije rjesenje od direktnog mnozenja sa 640. Tako si recimo u good old danima DOS-a racunao adresu pixela u grafickoj memoriji :)

Operacije sa rotiranjem bitova ne postoje direktno u vecini HLL vec ih je potrebno emulirati koristeci maske i bitwise operatore. Kompajleri ih generiraju takodjer obicno pri ispitivanju i postavljanju maski u petljama, za izracunavanje hash-eva i sl.

Najbolje ces nauciti koje je njihova svrha ako ih sam pocnes koristiti u programima.
[ haggar @ 04.12.2004. 23:48 ] @
Pa mislio sam na to, ako je "SHR vrijednost,n" ekvivalent za dijeljenje vrijednosti s n pri kojem zanemarujemo dio iza decimalnog zareza, da tada ne moram pisati kod koji će pomicati bitove već samo napišem naredbu koja uzima će podjeliti zadanu vrijednost sa n i uzeti cijeli dio. Npr, u QBasicu je po toj logici SHR vrijednost,n jednaka vrijednost=INT(vrijednost/n) . E, pa sad me zanima što bi bilo SHR vrijednost,n i ostalima.

Dakle, mislio sam na to da sve te operacije imaju svoje ekvivalente u višim jezicma. Možda sam i u krivu?
[ Sundance @ 05.12.2004. 01:14 ] @
U krivu si :)

SHR vrijednost, n bi odgovaralo dijeljenju sa 2^n [dva na n]

Jedina komanda koje se danas sjecam iz QBAsica jest PRINT :) Nemam pojma sto radi SHR u njemu, ali cisto sumnjam da je dijeljenje sa n.

Ekvivalent ovih instrukcija u HLL ovisi o samom jeziku, recimo shiftanje se moze napraviti preko >> << u C/C++, rotacije ne mogu direktno vec kombinacijom njih i maski.

Sta QBasic podrzava inline asembler?
[ haggar @ 05.12.2004. 15:55 ] @
Ma ne, nismo se razumjeli. Nisam mislio da QBasic ima operacije s bitovima.

Koliko sam ja zakljućio, operacije s bitovima vrše nekakve matematičke operacije. Dakle tu se radi o binarnoj algebri , samo što odavna nisam radio ništa u vezi toga pa sam pozaboravljao. Jedino što sam uspio naći je

Citat:
3.1.2 Use of shifts
Fast multiplication and division are the most common uses of a shift
operations. Recall that in the decimal system, multiplication and division
by a power of ten are simple, just shift digits. The same is true for powers
of two in binary. For example, to double the binary number 10112 (or 11
in decimal), shift once to the left to get 101102 (or 22). The quotient of a
division by a power of two is the result of a right shift. To divide by just 2,
use a single right shift; to divide by 4 (22), shift right 2 places; to divide by
8 (23), shift 3 places to the right, etc. Shift instructions are very basic and
are much faster than the corresponding MUL and DIV instructions!
Actually, logical shifts can be used multiply and divide unsigned values.
They do not work in general for signed values. Consider the 2-byte value
FFFF (signed -1). If it is logically right shifted once, the result is 7FFF
which is +32, 767! Another type of shift can be used for signed values.


Dakle ako program u asmu radi SHR EAX,n a mene zanima samo ta vrijednost u EAX nakon operacije, tada ja ne moram pomicati bitove da dobijem rezultat već samo podijelim broj u EAX sa 2^n i uzmem njegov cijeli dio. SHL je suprotno i on množi.

[ Sundance @ 05.12.2004. 19:55 ] @
Citat:
haggar: Ma ne, nismo se razumjeli. Nisam mislio da QBasic ima operacije s bitovima.

Dakle ako program u asmu radi SHR EAX,n a mene zanima samo ta vrijednost u EAX nakon operacije, tada ja ne moram pomicati bitove da dobijem rezultat već samo podijelim broj u EAX sa 2^n i uzmem njegov cijeli dio.


Ali SHR EAX,n radi dijeljenje sa 2^n, ne razumijem sto zelis reci kad kazes da ne moras pomicati bitove vec samo dijeliti EAX sa 2^n, kad SHR vec to radi :)

I da, ovaj citat je manje vise to (sto sam rekao). Za signed vrijednosti koristis instrukcije za aritmeticko shiftanje.
[ haggar @ 06.12.2004. 16:52 ] @
Pa ja ne programiram u asembleru nego malo basic i ućim c++. Znači vrijedi da je

SHR operand,n = operand/(2^n)
SHL operand,n = operand*(2^n)

Upravo to je ono što me zanima, pa što bi značile one ostale SAL, SAR, ROL, ROR, RCL, RCR?
[ Nothingman @ 19.12.2004. 01:46 ] @
Citat:
Sundance: Tako si recimo u good old danima DOS-a racunao adresu pixela u grafickoj memoriji :)


Nemoj tako, ja i danas ponekad volim da se zezam sa vga grafikom u DOS-u :)
[ Sundance @ 21.12.2004. 02:04 ] @
Citat:
Nothingman: Nemoj tako, ja i danas ponekad volim da se zezam sa vga grafikom u DOS-u :)


Ma VGA programiranje je zakon za pocetnike. Sjecam se da sam kad sam bio mlad i nadobudan prelazio one tutoriale od Denthor of asphyxia, tamo sam prvi put naucio koliko optimizacija u asembleru moze biti vazna.. Nasrecu danas sve manje :)