mirror of
https://github.com/danbulant/Cosmos
synced 2026-06-10 18:21:20 +00:00
182 lines
9.8 KiB
C#
182 lines
9.8 KiB
C#
using System;
|
|
using System.Linq;
|
|
using Cosmos.Assembler;
|
|
using Cosmos.Assembler.x86;
|
|
|
|
namespace Cosmos.Debug.DebugStub {
|
|
public class CmdSend : Cosmos.Assembler.Code {
|
|
|
|
public CmdSend(Assembler.Assembler aAssembler) : base(aAssembler) {}
|
|
|
|
public override void Assemble() {
|
|
new Comment("X#: Group DebugStub");
|
|
new Comment("X#: procedure SendRegisters {");
|
|
new LiteralAssemblerCode("DebugStub_SendRegisters:");
|
|
new LiteralAssemblerCode("; Send the actual started signal");
|
|
new Comment("X#: AL = #Ds2Vs_Registers");
|
|
new LiteralAssemblerCode("Mov AL, DebugStub_Const_Ds2Vs_Registers");
|
|
new Comment("X#: ComWriteAL()");
|
|
new LiteralAssemblerCode("Call DebugStub_ComWriteAL");
|
|
new Comment("X#: ESI = .PushAllPtr");
|
|
new LiteralAssemblerCode("Mov ESI, [DebugStub_PushAllPtr]");
|
|
new Comment("X#: ECX = 32");
|
|
new LiteralAssemblerCode("Mov ECX, 32");
|
|
new Comment("X#: ComWriteX()");
|
|
new LiteralAssemblerCode("Call DebugStub_ComWriteX");
|
|
new Comment("X#: ESI = @.CallerESP");
|
|
new LiteralAssemblerCode("Mov ESI, DebugStub_CallerESP");
|
|
new Comment("X#: ComWrite32()");
|
|
new LiteralAssemblerCode("Call DebugStub_ComWrite32");
|
|
new Comment("X#: ESI = @.CallerEIP");
|
|
new LiteralAssemblerCode("Mov ESI, DebugStub_CallerEIP");
|
|
new Comment("X#: ComWrite32()");
|
|
new LiteralAssemblerCode("Call DebugStub_ComWrite32");
|
|
new Comment("X#: }");
|
|
new LiteralAssemblerCode("DebugStub_SendRegisters_Exit:");
|
|
new LiteralAssemblerCode("Ret");
|
|
new LiteralAssemblerCode("; procedure SendFrame2 {");
|
|
new LiteralAssemblerCode("; AL = (int)Ds2Vs.Frame");
|
|
new LiteralAssemblerCode("; Call(\"DebugStub_ComWriteAL\")");
|
|
new LiteralAssemblerCode("; ");
|
|
new LiteralAssemblerCode("; EAX = 32");
|
|
new LiteralAssemblerCode("; Call(\"DebugStub_ComWriteAX\")");
|
|
new LiteralAssemblerCode("; ");
|
|
new LiteralAssemblerCode("; ESI = CallerEBP.Value");
|
|
new LiteralAssemblerCode("; ESI.Add(8) // Dont transmit EIP or old EBP");
|
|
new LiteralAssemblerCode("; ECX = 32");
|
|
new LiteralAssemblerCode("; Call(\"DebugStub_ComWriteX\")");
|
|
new LiteralAssemblerCode("; }");
|
|
new LiteralAssemblerCode("; procedure SendStack2 {");
|
|
new LiteralAssemblerCode("; AL = (int)Ds2Vs.Stack");
|
|
new LiteralAssemblerCode("; Call(\"DebugStub_ComWriteAL\")");
|
|
new LiteralAssemblerCode("; ");
|
|
new LiteralAssemblerCode("; // Send size of bytes");
|
|
new LiteralAssemblerCode("; ESI = CallerESP.Value");
|
|
new LiteralAssemblerCode("; EAX = CallerEBP.Value");
|
|
new LiteralAssemblerCode("; EAX.Sub(ESI)");
|
|
new LiteralAssemblerCode("; Call(\"DebugStub_ComWriteAX\")");
|
|
new LiteralAssemblerCode("; ");
|
|
new LiteralAssemblerCode("; // Send actual bytes");
|
|
new LiteralAssemblerCode("; //");
|
|
new LiteralAssemblerCode("; // Need to reload ESI, WriteAXToCompPort modifies it");
|
|
new LiteralAssemblerCode("; ESI = CallerESP.Value");
|
|
new LiteralAssemblerCode("; Label = \".SendByte\"");
|
|
new LiteralAssemblerCode("; ESI.Compare(CallerEBP.Value)");
|
|
new LiteralAssemblerCode("; JumpIf(Flags.Equal, \".Exit\")");
|
|
new LiteralAssemblerCode("; Call(\"DebugStub_ComWrite8\")");
|
|
new LiteralAssemblerCode("; Jump(\".SendByte\")");
|
|
new LiteralAssemblerCode("; }");
|
|
new LiteralAssemblerCode("; procedure SendMethodContext2 {");
|
|
new LiteralAssemblerCode("; // sends a stack value");
|
|
new LiteralAssemblerCode("; // Serial Params:");
|
|
new LiteralAssemblerCode("; // 1: x32 - offset relative to EBP");
|
|
new LiteralAssemblerCode("; // 2: x32 - size of data to send");
|
|
new LiteralAssemblerCode("; [XSharp(PreserveStack = true)]");
|
|
new LiteralAssemblerCode("; AL = (int)Ds2Vs.MethodContext");
|
|
new LiteralAssemblerCode("; Call(\"DebugStub_ComWriteAL\")");
|
|
new LiteralAssemblerCode("; ");
|
|
new LiteralAssemblerCode("; // offset relative to ebp");
|
|
new LiteralAssemblerCode("; // size of data to send");
|
|
new LiteralAssemblerCode("; Call(\"DebugStub_ComReadEAX\")");
|
|
new LiteralAssemblerCode("; ECX = EAX");
|
|
new LiteralAssemblerCode("; Call(\"DebugStub_ComReadEAX\")");
|
|
new LiteralAssemblerCode("; ");
|
|
new LiteralAssemblerCode("; // now ECX contains size of data (count)");
|
|
new LiteralAssemblerCode("; // EAX contains relative to EBP");
|
|
new LiteralAssemblerCode("; ESI = CallerEBP.Value");
|
|
new LiteralAssemblerCode("; ESI.Add(EAX) //TODO: ESI = ESI + EAX");
|
|
new LiteralAssemblerCode("; ");
|
|
new LiteralAssemblerCode("; Label = \".SendByte\"");
|
|
new LiteralAssemblerCode("; ECX.Compare(0)");
|
|
new LiteralAssemblerCode("; JumpIf(Flags.Equal, \".AfterSendByte\")");
|
|
new LiteralAssemblerCode("; Call(\"DebugStub_ComWrite8\")");
|
|
new LiteralAssemblerCode("; ECX--");
|
|
new LiteralAssemblerCode("; Jump(\".SendByte\")");
|
|
new LiteralAssemblerCode("; Label = \".AfterSendByte\"");
|
|
new LiteralAssemblerCode("; }");
|
|
new LiteralAssemblerCode("; procedure SendMemory2 {");
|
|
new LiteralAssemblerCode("; // sends a stack value");
|
|
new LiteralAssemblerCode("; // Serial Params:");
|
|
new LiteralAssemblerCode("; // 1: x32 - offset relative to EBP");
|
|
new LiteralAssemblerCode("; // 2: x32 - size of data to send");
|
|
new LiteralAssemblerCode("; [XSharp(PreserveStack = true)]");
|
|
new LiteralAssemblerCode("; procedure");
|
|
new LiteralAssemblerCode("; Call(\"DebugStub_ComReadEAX\")");
|
|
new LiteralAssemblerCode("; ECX = EAX");
|
|
new LiteralAssemblerCode("; AL = (int)Ds2Vs.MemoryData");
|
|
new LiteralAssemblerCode("; Call(\"DebugStub_ComWriteAL\")");
|
|
new LiteralAssemblerCode("; ");
|
|
new LiteralAssemblerCode("; Call(\"DebugStub_ComReadEAX\")");
|
|
new LiteralAssemblerCode("; ESI = EAX");
|
|
new LiteralAssemblerCode("; ");
|
|
new LiteralAssemblerCode("; // now ECX contains size of data (count)");
|
|
new LiteralAssemblerCode("; // ESI contains address");
|
|
new LiteralAssemblerCode("; ");
|
|
new LiteralAssemblerCode("; Label = \"DebugStub_SendMemory_SendByte\"");
|
|
new LiteralAssemblerCode("; new Compare { DestinationReg = Registers.ECX, SourceValue = 0 }");
|
|
new LiteralAssemblerCode("; JumpIf(Flags.Equal, \"DebugStub_SendMemory_After_SendByte\")");
|
|
new LiteralAssemblerCode("; Call(\"DebugStub_ComWrite8\")");
|
|
new LiteralAssemblerCode("; ECX--");
|
|
new LiteralAssemblerCode("; Jump(\"DebugStub_SendMemory_SendByte\")");
|
|
new LiteralAssemblerCode("; ");
|
|
new LiteralAssemblerCode("; Label = \"DebugStub_SendMemory_After_SendByte\"");
|
|
new LiteralAssemblerCode("; }");
|
|
new LiteralAssemblerCode("; }");
|
|
new LiteralAssemblerCode("; procedure SendTrace2 {");
|
|
new LiteralAssemblerCode("; // Modifies: EAX, ESI");
|
|
new LiteralAssemblerCode("; DebugStatus.Value.Compare(Status.Run)");
|
|
new LiteralAssemblerCode("; JumpIf(Flags.Equal, \".Normal\")");
|
|
new LiteralAssemblerCode("; AL = (int)Ds2Vs.BreakPoint");
|
|
new LiteralAssemblerCode("; Jump(\".Type\")");
|
|
new LiteralAssemblerCode("; ");
|
|
new LiteralAssemblerCode("; Label = \".Normal\"");
|
|
new LiteralAssemblerCode("; AL = (int)Ds2Vs.TracePoint");
|
|
new LiteralAssemblerCode("; ");
|
|
new LiteralAssemblerCode("; Label = \".Type\"");
|
|
new LiteralAssemblerCode("; Call(\"DebugStub_ComWriteAL\")");
|
|
new LiteralAssemblerCode("; ");
|
|
new LiteralAssemblerCode("; // Send Calling EIP.");
|
|
new LiteralAssemblerCode("; ESI = CallerEIP.Address");
|
|
new LiteralAssemblerCode("; DebugStub_ComWrite32()");
|
|
new LiteralAssemblerCode("; }");
|
|
new LiteralAssemblerCode("; procedure SendText2 {");
|
|
new LiteralAssemblerCode("; // Input: Stack");
|
|
new LiteralAssemblerCode("; // Output: None");
|
|
new LiteralAssemblerCode("; // Modifies: EAX, ECX, EDX, ESI");
|
|
new LiteralAssemblerCode("; // Write the type");
|
|
new LiteralAssemblerCode("; AL = (int)Ds2Vs.Message");
|
|
new LiteralAssemblerCode("; Call(\"DebugStub_ComWriteAL\")");
|
|
new LiteralAssemblerCode("; ");
|
|
new LiteralAssemblerCode("; // Write Length");
|
|
new LiteralAssemblerCode("; ESI = EBP");
|
|
new LiteralAssemblerCode("; ESI = ESI + 12");
|
|
new LiteralAssemblerCode("; ECX = ESI[0]");
|
|
new LiteralAssemblerCode("; Call(\"DebugStub_ComWrite16\")");
|
|
new LiteralAssemblerCode("; ");
|
|
new LiteralAssemblerCode("; // Address of string");
|
|
new LiteralAssemblerCode("; ESI = EBP[8]");
|
|
new LiteralAssemblerCode("; Label = \".WriteChar\"");
|
|
new LiteralAssemblerCode("; ECX.Compare(0)");
|
|
new LiteralAssemblerCode("; JumpIf(Flags.Equal, \".Exit\")");
|
|
new LiteralAssemblerCode("; Call(\"DebugStub_ComWrite8\")");
|
|
new LiteralAssemblerCode("; ECX--");
|
|
new LiteralAssemblerCode("; // We are storing as 16 bits, but for now I will transmit 8 bits");
|
|
new LiteralAssemblerCode("; // So we inc again to skip the 0");
|
|
new LiteralAssemblerCode("; ESI++");
|
|
new LiteralAssemblerCode("; Jump(\".WriteChar\")");
|
|
new LiteralAssemblerCode("; }");
|
|
new LiteralAssemblerCode("; procedure SendPtr2 {");
|
|
new LiteralAssemblerCode("; // Input: Stack");
|
|
new LiteralAssemblerCode("; // Output: None");
|
|
new LiteralAssemblerCode("; // Modifies: EAX, ECX, EDX, ESI");
|
|
new LiteralAssemblerCode("; // Write the type");
|
|
new LiteralAssemblerCode("; AL = (int)Ds2Vs.Pointer");
|
|
new LiteralAssemblerCode("; Call(\"DebugStub_ComWriteAL\")");
|
|
new LiteralAssemblerCode("; ");
|
|
new LiteralAssemblerCode("; // pointer value");
|
|
new LiteralAssemblerCode("; ESI = EBP[8]");
|
|
new LiteralAssemblerCode("; DebugStub_ComWrite32()");
|
|
new LiteralAssemblerCode("; }");
|
|
}
|
|
}
|
|
}
|