/// <summary> /// Emits the specified platform instruction. /// </summary> /// <param name="context">The context.</param> /// <param name="emitter">The emitter.</param> protected override void Emit(Context context, MachineCodeEmitter emitter) { if (context.OperandCount == 0) { // TODO: //emitter.EmitBranch(LabelCall, context.BranchTargets[0]); return; } Operand destinationOperand = context.Operand1; SymbolOperand destinationSymbol = destinationOperand as SymbolOperand; if (destinationSymbol != null) { emitter.Call(destinationSymbol); } else { if (destinationOperand is MemoryOperand) { //RegisterOperand register = destinationOperand as RegisterOperand; //emitter.EmitSingleRegisterInstructions(0x11, (byte)register.Register.RegisterCode); MemoryOperand memory = destinationOperand as MemoryOperand; emitter.EmitRegisterOperandWithK16(0x101, (byte)memory.Base.RegisterCode, (ushort)memory.Offset); } } }
/// <summary> /// Emits the specified platform instruction. /// </summary> /// <param name="ctx">The context.</param> /// <param name="emitter">The emitter.</param> protected override void Emit(Context ctx, MachineCodeEmitter emitter) { emitter.WriteByte(0xE8); emitter.WriteByte(0x00); emitter.WriteByte(0x00); emitter.WriteByte(0x00); emitter.WriteByte(0x00); emitter.Call(ctx.InvokeTarget); }
/// <summary> /// Emits the specified platform instruction. /// </summary> /// <param name="ctx">The context.</param> /// <param name="emitter">The emitter.</param> protected override void Emit(Context ctx, MachineCodeEmitter emitter) { Operand destinationOperand = ctx.Operand1; SymbolOperand destinationSymbol = destinationOperand as SymbolOperand; if (destinationSymbol != null) { emitter.WriteByte(0xE8); emitter.Call(destinationSymbol); } else { RegisterOperand registerOperand = destinationOperand as RegisterOperand; emitter.Emit(RegCall, registerOperand); } }
/// <summary> /// Emits the specified platform instruction. /// </summary> /// <param name="ctx">The context.</param> /// <param name="emitter">The emitter.</param> protected override void Emit(Context context, MachineCodeEmitter emitter) { Operand destinationOperand = context.Operand1; SymbolOperand destinationSymbol = destinationOperand as SymbolOperand; if (destinationSymbol != null) { emitter.WriteByte(0xE9); emitter.Call(destinationSymbol); } else if (context.Operand1 is RegisterOperand) emitter.Emit(JmpReg, context.Operand1); else emitter.EmitBranch(JMP, context.BranchTargets[0]); }
/// <summary> /// Emits the specified platform instruction. /// </summary> /// <param name="context">The context.</param> /// <param name="emitter">The emitter.</param> protected override void Emit(Context context, MachineCodeEmitter emitter) { if (context.OperandCount == 0) { emitter.EmitBranch(LabelCall, context.BranchTargets[0]); return; } if (context.Operand1.IsSymbol) { emitter.WriteByte(0xE8); emitter.Call(context.Operand1); } else { emitter.Emit(RegCall, context.Operand1); } }
/// <summary> /// Emits the specified platform instruction. /// </summary> /// <param name="ctx">The context.</param> /// <param name="emitter">The emitter.</param> protected override void Emit(Context context, MachineCodeEmitter emitter) { if (context.Operand1 == null) { emitter.EmitBranch(JMP, context.BranchTargets[0]); } else { if (context.Operand1.IsSymbol) { emitter.WriteByte(0xE9); emitter.Call(context.Operand1); } else if (context.Operand1.IsRegister) { emitter.Emit(JMP_R, context.Operand1); } } }
/// <summary> /// Emits the specified platform instruction. /// </summary> /// <param name="context">The context.</param> /// <param name="emitter">The emitter.</param> protected override void Emit(Context context, MachineCodeEmitter emitter) { if (context.OperandCount == 0) { // TODO: //emitter.EmitBranch(LabelCall, context.BranchTargets[0]); return; } if (context.Operand1.IsSymbol) { emitter.Call(context.Operand1); } else { if (context.Operand1.IsMemoryAddress) { emitter.EmitRegisterOperandWithK16(0x101, (byte)context.Operand1.Base.RegisterCode, (ushort)context.Operand1.Offset); } } }
/// <summary> /// Emits the specified platform instruction. /// </summary> /// <param name="context">The context.</param> /// <param name="emitter">The emitter.</param> protected override void Emit(Context context, MachineCodeEmitter emitter) { if (context.OperandCount == 0) { emitter.EmitBranch(LabelCall, context.BranchTargets[0]); return; } Operand destinationOperand = context.Operand1; SymbolOperand destinationSymbol = destinationOperand as SymbolOperand; if (destinationSymbol != null) { emitter.WriteByte(0xE8); emitter.Call(destinationSymbol); } else { RegisterOperand registerOperand = destinationOperand as RegisterOperand; emitter.Emit(RegCall, registerOperand); } }
/// <summary> /// Emits the specified platform instruction. /// </summary> /// <param name="ctx">The context.</param> /// <param name="emitter">The emitter.</param> protected override void Emit(Context ctx, MachineCodeEmitter emitter) { emitter.WriteByte (0xe8); emitter.Write (new byte[4], 0, 4); emitter.Call (ctx.InvokeTarget); }
/// <summary> /// Emits the specified platform instruction. /// </summary> /// <param name="ctx">The context.</param> /// <param name="emitter">The emitter.</param> protected override void Emit(Context ctx, MachineCodeEmitter emitter) { emitter.WriteByte(0xe8); emitter.Write(new byte[4], 0, 4); emitter.Call(ctx.InvokeTarget); }