Solved

Perform XOR operation on two binary blocks of memory ?

Posted on 2002-06-16
10
760 Views
Last Modified: 2010-05-18
Hello Experts,

How to perform a XOR operation on two binary blocks of memory?

Thanks!

P.S: The two memory blocks have the same size(about 2mb) but the data inside is different
0
Comment
Question by:navy_seal
  • 4
  • 2
  • 2
  • +2
10 Comments
 
LVL 11

Assisted Solution

by:robert_marquardt
robert_marquardt earned 147 total points
ID: 7083037
As simple as a for loop.

for I := 0 to SizeOf(Buffer1) do
  Buffer1[I] := Buffer1[I] xor Buffer2[I];

This may be a bit inefficient if the buffer elements are Chars.
Try using Cardinals as buffer elements.
0
 
LVL 7

Accepted Solution

by:
Cynna earned 148 total points
ID: 7083308
navy_seal,

I dig up somebodys old code. It's quite fast:

procedure MemBlockXOR(const Source1, Source2, Destination: Pointer;
                            Blocksize: Integer); assembler;
asm
  push edi
  push esi
  push ebx
  mov esi,eax
  mov edi,ecx
  mov ecx,Blocksize;
  mov eax,[esi]
  and eax,[edx]
  mov [edi],eax
  mov eax,[esi+4]
  and eax,[edx+4]
  mov [edi+4],eax
  add esi,ecx
  add edx,ecx
  add edi,ecx
  shr ecx,3
  test ecx,ecx
  jz @@ending
  neg ecx
@@doit:
  mov eax,[esi+ecx*8]
  mov ebx,[esi+ecx*8+4]
  xor eax,[edx+ecx*8]
  xor ebx,[edx+ecx*8+4]
  mov [edi+ecx*8],eax
  mov [edi+ecx*8+4],ebx
  inc ecx
  jnz @@doit
@@ending:
  pop ebx
  pop esi
  pop edi
end;


I tested it with:

procedure TForm1.Button1Click(Sender: TObject);
var Block1, Block2, Block3: Pointer;
    Size: Integer;
    t0: DWord;
begin
  try
     // Must be multiple of 4-bytes:    
     Size:=16*1024*1024; //16Mb
     GetMem(Block1, Size);
     GetMem(Block2, Size);
     GetMem(Block3, Size);
     FillMemory(Block1, Size, 2);
     FillMemory(Block2, Size, 3);
     t0:=GetTickCount;
       MemBlockXOR(Block1, Block2, Block3, Size);
     Button1.Caption:=IntToStr(GetTickCount-t0)+' ms';
  finally
     FreeMem(Block1);
     FreeMem(Block2);
     FreeMem(Block3);
  end;
end;

On my Athlon XP 1.4Ghz it XORed those 16Mb in 0.13 sec.

0
 
LVL 11

Expert Comment

by:robert_marquardt
ID: 7083333
I would guess that Delphi generates similar code.
The assembler code does a loop unroll to handle 2 DWORDs at once. That makes it "a multiple of 8-bytes".
The speed factor against my loop should be around 2x.
0
 
LVL 7

Expert Comment

by:Cynna
ID: 7083336
navy_seal,

I dig up somebodys old code. It's quite fast:

procedure MemBlockXOR(const Source1, Source2, Destination: Pointer;
                            Blocksize: Integer); assembler;
asm
  push edi
  push esi
  push ebx
  mov esi,eax
  mov edi,ecx
  mov ecx,Blocksize;
  mov eax,[esi]
  and eax,[edx]
  mov [edi],eax
  mov eax,[esi+4]
  and eax,[edx+4]
  mov [edi+4],eax
  add esi,ecx
  add edx,ecx
  add edi,ecx
  shr ecx,3
  test ecx,ecx
  jz @@ending
  neg ecx
@@doit:
  mov eax,[esi+ecx*8]
  mov ebx,[esi+ecx*8+4]
  xor eax,[edx+ecx*8]
  xor ebx,[edx+ecx*8+4]
  mov [edi+ecx*8],eax
  mov [edi+ecx*8+4],ebx
  inc ecx
  jnz @@doit
@@ending:
  pop ebx
  pop esi
  pop edi
end;


I tested it with:

procedure TForm1.Button1Click(Sender: TObject);
var Block1, Block2, Block3: Pointer;
    Size: Integer;
    t0: DWord;
begin
  try
     // Must be multiple of 4-bytes:    
     Size:=16*1024*1024; //16Mb
     GetMem(Block1, Size);
     GetMem(Block2, Size);
     GetMem(Block3, Size);
     FillMemory(Block1, Size, 2);
     FillMemory(Block2, Size, 3);
     t0:=GetTickCount;
       MemBlockXOR(Block1, Block2, Block3, Size);
     Button1.Caption:=IntToStr(GetTickCount-t0)+' ms';
  finally
     FreeMem(Block1);
     FreeMem(Block2);
     FreeMem(Block3);
  end;
end;

On my Athlon XP 1.4Ghz it XORed those 16Mb in 0.13 sec.

0
 
LVL 7

Expert Comment

by:Cynna
ID: 7083340
OOPS,
Sorry for double post.

robert_marquardt, yes it is.
0
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 

Author Comment

by:navy_seal
ID: 7084020
Thanks guys,ill try it out, which solution is faster will get the points :-)
0
 

Author Comment

by:navy_seal
ID: 7084913
sorry Cynna ,but I found the same code that you gave me 2 days a go, so I would give points only If you could give code that is faster

here is where I found it:

http://groups.google.com/groups?hl=en&lr=&frame=right&th=a0343ed619e02a7a&seekm=7nbvmi%24qtf1%40forums.borland.com#s

they are a bit different
0
 
LVL 7

Expert Comment

by:Cynna
ID: 7086284
navy_seal,

Yes, its quite possible I saved it from Google some time ago. Anyway, as far as I can see, this code couldn't be turned up much faster, so you can count me out of the race...
0
 

Expert Comment

by:CleanupPing
ID: 9343194
navy_seal:
This old question needs to be finalized -- accept an answer, split points, or get a refund.  For information on your options, please click here-> http:/help/closing.jsp#1 
EXPERTS:
Post your closing recommendations!  No comment means you don't care.
0
 
LVL 5

Expert Comment

by:Lukasz Lach
ID: 9453405
navy_seal,
No comment has been added lately (17 days), so it's time to clean up this TA.
I will leave a recommendation in the Cleanup topic area for this question:

RECOMMENDATION: split points between robert_marquardt http:#7083333 and Cynna http:#7083336

Please leave any comments here within 7 days.

-- Please DO NOT accept this comment as an answer ! --

Thanks,

anAKiN
EE Cleanup Volunteer
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Best Firemonkey component pack 1 88
add combobox item based on numbers 9 125
URL for downloading Google Chrome for Win XP 2 125
Graphics32 under Delphi 10.1 Berlin 2 38
Introduction The parallel port is a very commonly known port, it was widely used to connect a printer to the PC, if you look at the back of your computer, for those who don't have newer computers, there will be a port with 25 pins and a small print…
In my programming career I have only very rarely run into situations where operator overloading would be of any use in my work.  Normally those situations involved math with either overly large numbers (hundreds of thousands of digits or accuracy re…
Windows 10 is mostly good. However the one thing that annoys me is how many clicks you have to do to dial a VPN connection. You have to go to settings from the start menu, (2 clicks), Network and Internet (1 click), Click VPN (another click) then fi…
Both in life and business – not all partnerships are created equal. As the demand for cloud services increases, so do the number of self-proclaimed cloud partners. Asking the right questions up front in the partnership, will enable both parties …

867 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

21 Experts available now in Live!

Get 1:1 Help Now