From c8dfbd81270e5b59ec6c5f478dc5690f2bd7e7dd Mon Sep 17 00:00:00 2001 From: Charles Betros Date: Wed, 10 Aug 2016 18:06:18 -0500 Subject: [PATCH] Fix array copy. --- .../System/Assemblers/Array_InternalCopy.cs | 38 +++++++++++-------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/source/Cosmos.Core.Plugs/System/Assemblers/Array_InternalCopy.cs b/source/Cosmos.Core.Plugs/System/Assemblers/Array_InternalCopy.cs index e7a77d0aa..775c6325a 100644 --- a/source/Cosmos.Core.Plugs/System/Assemblers/Array_InternalCopy.cs +++ b/source/Cosmos.Core.Plugs/System/Assemblers/Array_InternalCopy.cs @@ -1,54 +1,62 @@ +using Cosmos.Debug.Kernel; using Cosmos.IL2CPU.Plugs; using XSharp.Compiler; +using ObjectInfo = Cosmos.IL2CPU.Plugs.System.ObjectImpl; using CPUx86 = Cosmos.Assembler.x86; namespace Cosmos.Core.Plugs.System.Assemblers { public class Array_InternalCopy : AssemblerMethod { - private const int SourceArrayDisplacement = 0x1C; - private const int SourceIndexDisplacement = 0x18; - private const int DestinationArrayDisplacement = 0x14; + private const int SourceArrayDisplacement = 0x24; + private const int SourceIndexDisplacement = 0x1C; + private const int DestinationArrayDisplacement = 0x18; private const int DestinationIndexDisplacement = 0x10; private const int LengthDisplacement = 0xC; - /* void Copy(Array sourceArray, ebp + 0x1C - * int sourceIndex, ebp + 0x18 - * Array destinationArray, ebp + 0x14 + /* void Copy(Array sourceArray, ebp + 0x24 + * int sourceIndex, ebp + 0x1C + * Array destinationArray, ebp + 0x18 * int destinationIndex, ebp + 0x10 * int length, ebp + 0xC * bool reliable); ebp + 0x8 */ public override void AssembleNew(Assembler.Assembler aAssembler, object aMethodInfo) { + XS.Exchange(XSRegisters.BX, XSRegisters.BX); + XS.Comment("Source"); XS.Set(XSRegisters.EAX, XSRegisters.EBP, sourceDisplacement: SourceArrayDisplacement); - XS.Set(XSRegisters.EAX, XSRegisters.EAX, sourceIsIndirect: true); // dereference memory handle to pointer + //XS.Set(XSRegisters.EAX, XSRegisters.EAX, sourceIsIndirect: true); // dereference memory handle to pointer XS.Push(XSRegisters.EAX); - new CPUx86.Add { DestinationReg = CPUx86.RegistersEnum.ESP, DestinationIsIndirect = true, SourceValue = 12, Size = 32 }; // pointer is at the element size + new CPUx86.Add { DestinationReg = CPUx86.RegistersEnum.ESP, DestinationIsIndirect = true, SourceValue = ObjectInfo.FieldDataOffset, Size = 32 }; // pointer is at the element size XS.Pop(XSRegisters.EAX); XS.Set(XSRegisters.EAX, XSRegisters.EAX, sourceIsIndirect: true); // element size XS.Set(XSRegisters.EBX, XSRegisters.EBP, sourceDisplacement: SourceIndexDisplacement); XS.Multiply(XSRegisters.EBX); XS.Add(XSRegisters.EAX, 16); XS.Set(XSRegisters.ESI, XSRegisters.EBP, sourceDisplacement: SourceArrayDisplacement); - XS.Set(XSRegisters.ESI, XSRegisters.ESI, sourceIsIndirect: true); // dereference memory handle to pointer + //XS.Set(XSRegisters.ESI, XSRegisters.ESI, sourceIsIndirect: true); // dereference memory handle to pointer XS.Add(XSRegisters.ESI, XSRegisters.EAX); // source ptr + + XS.Exchange(XSRegisters.BX, XSRegisters.BX); + XS.Comment("Destination"); XS.Set(XSRegisters.EDX, XSRegisters.EBP, sourceDisplacement: DestinationArrayDisplacement); - XS.Set(XSRegisters.EDX, XSRegisters.EDX, sourceIsIndirect: true); // dereference memory handle to pointer + //XS.Set(XSRegisters.EDX, XSRegisters.EDX, sourceIsIndirect: true); // dereference memory handle to pointer XS.Push(XSRegisters.EDX); - new CPUx86.Add { DestinationReg = CPUx86.RegistersEnum.ESP, DestinationIsIndirect = true, SourceValue = 12, Size = 32 }; // pointer is at element size + new CPUx86.Add { DestinationReg = CPUx86.RegistersEnum.ESP, DestinationIsIndirect = true, SourceValue = ObjectInfo.FieldDataOffset, Size = 32 }; // pointer is at element size XS.Pop(XSRegisters.EAX); - XS.Set(XSRegisters.EAX, XSRegisters.EAX, sourceIsIndirect: true); // dereference handle to pointer + XS.Set(XSRegisters.EAX, XSRegisters.EAX, sourceIsIndirect: true); // element size XS.Set(XSRegisters.ECX, XSRegisters.EBP, sourceDisplacement: DestinationIndexDisplacement); XS.Multiply(XSRegisters.ECX); XS.Add(XSRegisters.EAX, 16); XS.Set(XSRegisters.EDI, XSRegisters.EBP, sourceDisplacement: DestinationArrayDisplacement); - XS.Set(XSRegisters.EDI, XSRegisters.EDI, sourceIsIndirect: true); // dereference handle to pointer - XS.Add(XSRegisters.EDI, XSRegisters.EAX); + //XS.Set(XSRegisters.EDI, XSRegisters.EDI, sourceIsIndirect: true); // dereference handle to pointer + XS.Add(XSRegisters.EDI, XSRegisters.EAX); // destination ptr // calculate byte count to copy + XS.Exchange(XSRegisters.BX, XSRegisters.BX); XS.Set(XSRegisters.EAX, XSRegisters.EBP, sourceDisplacement: DestinationArrayDisplacement); - XS.Set(XSRegisters.EAX, XSRegisters.EAX, sourceIsIndirect: true); // dereference memory handle to pointer + //XS.Set(XSRegisters.EAX, XSRegisters.EAX, sourceIsIndirect: true); // dereference memory handle to pointer XS.Add(XSRegisters.EAX, 12); XS.Set(XSRegisters.EAX, XSRegisters.EAX, sourceIsIndirect: true); XS.Set(XSRegisters.EDX, XSRegisters.EBP, sourceDisplacement: LengthDisplacement);