Cosmos/source2/Compiler/Cosmos.Compiler.Assembler.X86/JumpBase.cs

59 lines
No EOL
2.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace Cosmos.Compiler.Assembler.X86 {
public abstract class JumpBase: InstructionWithDestination {
public string DestinationLabel {
get {
if (DestinationRef != null) {
return DestinationRef.Name;
}
return String.Empty;
}
set {
DestinationRef = ElementReference.New(value);
}
}
protected bool mNear = true;
protected bool mCorrectAddress = true;
protected virtual bool IsRelativeJump {
get {
return true;
}
}
public override void WriteData( Cosmos.Compiler.Assembler.Assembler aAssembler, Stream aOutput )
{
if (mCorrectAddress) {
if(IsRelativeJump) {
if (DestinationValue.HasValue && !DestinationIsIndirect) {
var xCurAddress = ActualAddress;
var xOrigValue = DestinationValue.Value;
DestinationValue = (uint)(xOrigValue - xCurAddress.Value);
try {
base.WriteData(aAssembler, aOutput);
return;
} finally {
DestinationValue = xOrigValue;
}
}
}
}
base.WriteData(aAssembler, aOutput);
}
//public override string ToString() {
// var xResult = base.ToString();
// if (mNear) {
// if (!xResult.StartsWith(Mnemonic + " near", StringComparison.InvariantCultureIgnoreCase)) {
// if (xResult.StartsWith(Mnemonic)) {
// return Mnemonic + " near " + xResult.Substring(Mnemonic.Length + 1);
// }
// }
// }
// return xResult;
//}
}
}