Talk About Network

Google


Register and Login
Nick
Password
Register create new account Sign up is FREE and you can post replies, new topics, bookmark posts and more!
Recover lost password


Programming > Assembly Language > Skybuck present...
Latest [ Topics | Posts ] Archive Post A New Topic Post a Reply
<< Topic < Post Post 1 of 1 Topic 4999 of 5072
Post > Topic >>

Skybuck presents KeepLowBits and KeepHighBits

by "Skybuck Flying" <BloodyShame@[EMAIL PROTECTED] > May 5, 2008 at 05:44 PM

Hello,

Skybuck presents:

KeepLowBits and KeepHighBits functions.

Visual inspection/verification program included ! ;)

// *** Begin of Code ***

program Project1;

{$APPTYPE CONSOLE}

{

Skybuck presents KeepLowBits and KeepHighBits

Version 0.01 created on 5 may 2008 by Skybuck Flying

Correct implementations this time.

Functions to keep original values could come in handy.

Visual Inspection/Verification program.

}

uses
  SysUtils,
  Windows;

// make overloaded versions for easy coding
// display in big endian.
procedure WriteBitPattern( const ParaByte : byte ); overload;
type
 TbitRange = 0..7;
 TbitSet = set of TbitRange;
var
 vBit : TbitRange;
begin
 for vBit:= 0 to 7 do
 begin
  if vBit in TbitSet(ParaByte) then
  begin
   write('1');
  end else
  begin
   write('0');
  end;
 end;
end;

procedure WriteBitPattern( const ParaWord : word ); overload;
type
 TbitRange = 0..15;
 TbitSet = set of TbitRange;
var
 vBit : TbitRange;
begin
 for vBit:= 0 to 15 do
 begin
  if vBit in TbitSet(ParaWord) then
  begin
   write('1');
  end else
  begin
   write('0');
  end;
 end;
end;

procedure WriteBitPattern( const ParaLongWord : longword ); overload;
type
 TbitRange = 0..31;
 TbitSet = set of TbitRange;
var
 vBit : TbitRange;
begin
 for vBit:= 0 to 31 do
 begin
  if vBit in TbitSet(ParaLongWord) then
  begin
   write('1');
  end else
  begin
   write('0');
  end;
 end;
end;

function KeepLowBits( Value : longword; Bits : longword ) : longword;
begin
 Result := Value; // 32 bits case.
 if Bits <= 31 then
 begin
  Result := Result and not (4294967295 shl Bits); // shl instruction
limited 
to 31.
 end;
end;

{

8 instructions:

Project1.dpr.85: if Bits <= 31 then
00408FA4 83FA1F           cmp edx,$1f
00408FA7 770B             jnbe $00408fb4
Project1.dpr.87: Result := Result and not (4294967295 shl Bits); // shl 
instruction limited to 31.
00408FA9 8BCA             mov ecx,edx
00408FAB 83CAFF           or edx,-$01
00408FAE D3E2             shl edx,cl
00408FB0 F7D2             not edx
00408FB2 23C2             and eax,edx
Project1.dpr.89: end;
00408FB4 C3               ret

}

function KeepHighBits( Value : longword; Bits : longword ) : longword;
begin
 Result := Value; // 32 bits case.
 if Bits <= 31 then // 0 to 31 bits case.
 begin
  Result := Result and not (4294967295 shr Bits); // shr instruction
limited 
to 31.
 end;
end;

{

8 instructions:

Project1.dpr.94: if Bits <= 31 then // 0 to 31 bits case.
00408FB8 83FA1F           cmp edx,$1f
00408FBB 770B             jnbe $00408fc8
Project1.dpr.96: Result := Result and not (4294967295 shr Bits); // shr 
instruction limited to 31.
00408FBD 8BCA             mov ecx,edx
00408FBF 83CAFF           or edx,-$01
00408FC2 D3EA             shr edx,cl
00408FC4 F7D2             not edx
00408FC6 23C2             and eax,edx
Project1.dpr.98: end;
00408FC8 C3               ret

}


procedure Main;
var
 vValue : longword;
 vBits : longword;
 vResult : longword;
begin
 // Test KeepHighBits

 writeln('Press enter to test KeepHighBits maximum value');
 readln;

 // test maximum value
 vValue := 4294967295;
 for vBits := 0 to 33 do // go over to see what happens ;) ok no problemo
 begin
  vResult := KeepHighBits( vValue, vBits );
  Writeln( 'KeepHighBits Value: ', vValue, ' Bits: ', vBits, ' Result: ', 
vResult );
  WriteBitPattern( vValue ); WriteLn;
  WriteLn( '21098765432109876543210987654321');
  WriteBitPattern( vResult ); WriteLn;
 end;

 writeln('Press enter to test KeepHighBits minimum value');
 readln;

 // test minimum value
 vValue := 0;
 for vBits := 0 to 33 do // go over to see what happens ;) ok no problemo
 begin
  vResult := KeepHighBits( vValue, vBits );
  Writeln( 'KeepHighBits Value: ', vValue, ' Bits: ', vBits, ' Result: ', 
vResult );
  WriteBitPattern( vValue ); WriteLn;
  WriteLn( '21098765432109876543210987654321');
  WriteBitPattern( vResult ); WriteLn;
 end;

 writeln('Press enter to test KeepHighBits random value');
 readln;

 // test random value
 vValue := GetTickCount;
 for vBits := 0 to 33 do // go over to see what happens ;) ok no problemo
 begin
  vResult := KeepHighBits( vValue, vBits );
  Writeln( 'KeepHighBits Value: ', vValue, ' Bits: ', vBits, ' Result: ', 
vResult );
  WriteBitPattern( vValue ); WriteLn;
  WriteLn( '21098765432109876543210987654321');
  WriteBitPattern( vResult ); WriteLn;
 end;

 // Test KeepLowBits

 writeln('Press enter to test KeepLowBits maximum value');
 readln;

 // test maximum value
 vValue := 4294967295;
 for vBits := 0 to 33 do // go over to see what happens ;) ok no problemo
 begin
  vResult := KeepLowBits( vValue, vBits );
  Writeln( 'KeepLowBits Value: ', vValue, ' Bits: ', vBits, ' Result: ', 
vResult );
  WriteBitPattern( vValue ); WriteLn;
  WriteLn( '12345678901234567890123456789012');
  WriteBitPattern( vResult ); WriteLn;
 end;

 writeln('Press enter to test KeepHighBits minimum value');
 readln;

 // test minimum value
 vValue := 0;
 for vBits := 0 to 33 do // go over to see what happens ;) ok no problemo
 begin
  vResult := KeepLowBits( vValue, vBits );
  Writeln( 'KeepLowBits Value: ', vValue, ' Bits: ', vBits, ' Result: ', 
vResult );
  WriteBitPattern( vValue ); WriteLn;
  WriteLn( '12345678901234567890123456789012');
  WriteBitPattern( vResult ); WriteLn;
 end;

 writeln('Press enter to test KeepHighBits random value');
 readln;

 // test random value
 vValue := GetTickCount;
 for vBits := 0 to 33 do // go over to see what happens ;) ok no problemo
 begin
  vResult := KeepLowBits( vValue, vBits );
  Writeln( 'KeepLowBits Value: ', vValue, ' Bits: ', vBits, ' Result: ', 
vResult );
  WriteBitPattern( vValue ); WriteLn;
  WriteLn( '12345678901234567890123456789012');
  WriteBitPattern( vResult ); WriteLn;
 end;
 writeln('done');
end;

begin
 try
  Main;
 except
  on E:Exception do
   Writeln(E.Classname, ': ', E.Message);
 end;
 readln;
end.

// *** End of Code ***

Bye,
  Skybuck =D
 




 1 Posts in Topic:
Skybuck presents KeepLowBits and KeepHighBits
"Skybuck Flying"  2008-05-05 17:44:12 

Post A Reply:
  Go here to Signup

AddThis Feed Button


About - Advertising - Contact - Frequently Asked Questions - Privacy Policy - Terms of Use - Signup

Contact
tan12V112 Sun Jul 6 16:13:49 CDT 2008.