| procedure ESBExchange (var Obj1, Obj2; const Size: LongWord); register;
asm
	push 	edi			// Preserve EDI
	push 	ebx			// Preserve EBX
	push 	ecx            // Preserve ECX (which currently has Size)
	shr  	ecx, 2         // Integer divide by 4 to see if less than 4 Byte
						// ECX now contains the number of DWords to Swap
	jz   	@@LessThanFour	// If so then jump
@@AgainDWords:
						// Swap DWords
	mov  	ebx, [eax]	// Copy a DWord from Obj1 into EBX
	mov  	edi, [edx]	// Copy a DWord from Obj2 into EDI
	mov  	[edx], ebx	// Copy a Dword from EBX into Obj2
	mov  	[eax], edi	// Copy a Dword from EDI into Obj1
	add  	eax, 4		// Move to the next DWord in Obj1
	add  	edx, 4		// Move to the next DWord in Obj2
	dec  	ecx			// Decrement count
	jnz  	@@AgainDWords	// Repeat until ECX is Zero
@@LessThanFour:
	pop  	ecx  		// Restore original ECX (i.e Size)
	and  	ecx, $3		// Get just the remainder after division by 4
	jz   	@@Done		// If Zero nothing to do
	mov  	bl, [eax]      // Otherwose swap a byte
	mov  	bh, [edx]
	mov  	[edx], bl
	mov  	[eax], bh
	inc  	eax      		// And move one byte
	inc  	edx
	dec  	ecx
	jz   	@@Done
	mov  	bl, [eax]		// Repeat for remainding bytes...
	mov  	bh, [edx]
	mov  	[edx], bl
	mov  	[eax], bh
	inc  	eax
	inc  	edx
	dec  	ecx
	jz   	@@Done
	mov  	bl, [eax]
	mov  	bh, [edx]
	mov  	[edx], bl
	mov  	[eax], bh
@@Done:
	pop  	ebx            // Restore EBX
	pop  	edi			// Restore EDI
End; |