March 2010
Beginner
760 pages
18h 51m
English
Of course, we can easily accomplish the converse of merging two bit streams; that is, we can extract and distribute bits in a bit string among multiple destinations. The following code takes the 32-bit value in EAX and distributes alternate bits among the BX and DX registers:
mov( 16, cl ); // Count the loop iterations.
ExtractLp: shr( 1, eax ); // Extract even bits to (e)bx.
rcr( 1, ebx );
shr( 1, eax ); // Extract odd bits to (e)dx.
rcr( 1, edx );
dec( cl ); // Repeat 16 times.
jnz ExtractLp;
shr( 16, ebx ); // Need to move the results from the H.O.
shr( 16, edx ); // bytes of ebx/edx to the L.O. bytes.This sequence executes 99 instructions. This isn't terrible, but we can probably do a little better by using an algorithm ...