public Indexado(string NombreRegistroD, string NombreRegistroDesplazamiento, ResultadosCompilacion resultados, LineaLexica cs, TipoInstruccion tipo) : base(cs, tipo) { this.NombreRegistroDesplazamiento = NombreRegistroDesplazamiento; this.NombreRegistroD = NombreRegistroD; Destino = Registros.PorNombre(NombreRegistroD); TamañoDestino = TamañoRegistro(NombreRegistroD); }
public Inmediato(string NombreRegistroD, Numero Fuente, ResultadosCompilacion resultados, LineaLexica cs, TipoInstruccion tipo) : base(cs, tipo) { this.NombreRegistroD = NombreRegistroD.ToUpper(); Destino = Registros.PorNombre(this.NombreRegistroD); TamañoDestino = TamañoRegistro(this.NombreRegistroD); this.Fuente = Fuente; TamañoFuente = this.Fuente.Tamaño; if (TamañoFuente > TamañoDestino) { resultados.ResultadoCompilacion($"El valor '{Fuente.Hex}' - {TamañoFuente} sobrepasa el tamaño del operando de destino '{this.NombreRegistroD}' - {TamañoDestino}", LineaDocumento); } }
public PorRegistro(string NombreRegistroD, string NombreRegistroF, ResultadosCompilacion resultados, LineaLexica cs, TipoInstruccion tipo) : base(cs, tipo) { this.NombreRegistroF = NombreRegistroF; this.NombreRegistroD = NombreRegistroD; Destino = Registros.PorNombre(NombreRegistroD); TamañoDestino = TamañoRegistro(NombreRegistroD); Fuente = Registros.PorNombre(NombreRegistroF); TamañoFuente = TamañoRegistro(NombreRegistroF); if (TamañoFuente != TamañoDestino) { resultados.ResultadoCompilacion($"El tamaño de '{NombreRegistroF}' - {TamañoFuente} no conicide con el tamaño de '{NombreRegistroD.ToUpper()}' - {TamañoDestino}", LineaDocumento); } }
public Indirecto(string NombreRegistroD, string NombreRegistroF, ResultadosCompilacion resultados, LineaLexica cs, TipoInstruccion tipo) : base(cs, tipo) { this.NombreRegistroF = NombreRegistroF; this.NombreRegistroD = NombreRegistroD; Destino = Registros.PorNombre(NombreRegistroD); TamañoDestino = TamañoRegistro(NombreRegistroD); Fuente = Registros.PorNombre(NombreRegistroF); TamañoFuente = TamañoRegistro(NombreRegistroF); //Validar que la dirección sea valdida? //if (TamañoFuente != TamañoDestino) //{ // resultados.ResultadoCompilacion($"El tamaño de '{NombreRegistroF}' - {TamañoFuente} no conicide con el tamaño de '{NombreRegistroD.ToUpper()}' - {TamañoDestino}", LineaDocumento); //} }
private bool Salto(LineaLexica linea) { if (linea[0].TipoToken != TipoToken.PalabraReservada) { return(false); } if (linea.Elementos != 2) { this.Errores.ResultadoCompilacion("Se esperaba un salto, formato incorrecto", linea.LineaDocumento); return(true); } if (linea[0].TipoToken == TipoToken.PalabraReservada && linea[1].TipoToken == TipoToken.Identificador) { TipoInstruccion instruccion = (TipoInstruccion)Enum.Parse(typeof(TipoInstruccion), linea[0].Lexema.ToUpper()); this.CodeSegment.AgregarInstruccion(new Salto(linea[1].Lexema, linea, instruccion)); return(true); } return(false); }
/// <summary> /// Modo indirecto MOV AX,[SI]/[DI] /// </summary> /// <param name="linea"></param> /// <param name="Errores"></param> /// <param name="tipo"></param> /// <returns></returns> protected override Instruccion EsValida(LineaLexica linea, ResultadosCompilacion Errores, TipoInstruccion tipo) { return(new Indirecto(linea[1].Lexema, linea[4].Lexema, Errores, linea, tipo)); }
protected override Instruccion EsValida(LineaLexica linea, ResultadosCompilacion Errores, TipoInstruccion tipo) { throw new NotImplementedException(); }
public Simple(string NombreOperador, LineaLexica LineaDocumento, TipoInstruccion tipo) : base(LineaDocumento, tipo) { this.NombreOperador = NombreOperador; this.Tamaño = TamañoRegistro(NombreOperador); this.Operador = Registros.PorNombre(NombreOperador); }
/// <summary> /// Modo inmediato MOV AX,09h /// </summary> /// <param name="linea"></param> /// <param name="Errores"></param> /// <param name="tipo"></param> /// <returns></returns> protected override Instruccion EsValida(LineaLexica linea, ResultadosCompilacion Errores, TipoInstruccion tipo) { Numero numero = new Numero(linea[3]); if (numero.Tamaño == Tamaños.Invalido) { Errores.ResultadoCompilacion($"Valor númerico incorrecto", linea.LineaDocumento); } return(new Inmediato(linea[1].Lexema, numero, Errores, linea, tipo)); }
/// <summary> /// DirectoI [001],AX /// </summary> /// <param name="linea"></param> /// <param name="Errores"></param> /// <param name="tipo"></param> /// <returns></returns> protected override Instruccion EsValida(LineaLexica linea, ResultadosCompilacion Errores, TipoInstruccion tipo) { Numero numero = new Numero(linea[2]); if (numero.Tamaño == Tamaños.Invalido) { Errores.ResultadoCompilacion($"Valor númerico incorrecto", linea.LineaDocumento); } else if (numero.Tamaño < Tamaños.Palabra) { numero.ByteEnPalabra(); } return(new DirectoI(linea[5].Lexema, numero, Errores, linea, tipo)); }
public Direccionamiento(LineaLexica cs, TipoInstruccion tipo) : base(cs, tipo) { }
public Etiqueta(string Identificador, LineaLexica LineaDocumento, TipoInstruccion Tipo) : base(LineaDocumento, Tipo) { this.Identificador = Identificador; }
/// <summary> /// Modo indexado MOV AX,[BX + SI/DI ] /// </summary> /// <param name="linea"></param> /// <param name="Errores"></param> /// <param name="tipo"></param> /// <returns></returns> protected override Instruccion EsValida(LineaLexica linea, ResultadosCompilacion Errores, TipoInstruccion tipo) { if (linea.Elementos >= 8) { return(new Indexado(linea[1].Lexema, linea[6].Lexema, Errores, linea, tipo)); } return(new Indexado(linea[1].Lexema, linea[4].Lexema, Errores, linea, tipo)); }
public DefineByte(LineaLexica LineaDocumento, TipoInstruccion Tipo) : base(LineaDocumento, Tipo) { this.Valores = new List <Numero>(); }
public Begin(LineaLexica LineaDocumento, TipoInstruccion Tipo) : base(LineaDocumento, Tipo) { }
protected Instruccion(LineaLexica Linea, TipoInstruccion Tipo) { this.Tipo = Tipo; this.LineaDocumento = Linea?.LineaDocumento; this.Linea = Linea?.ToString(); }
public DirectoI(string NombreRegistro, Numero Fuente, ResultadosCompilacion resultados, LineaLexica cs, TipoInstruccion tipo) : base(NombreRegistro, Fuente, resultados, cs, tipo) { NombreRegistroD = NombreRegistro; Destino = Registros.PorNombre(NombreRegistro); TamañoDestino = TamañoRegistro(NombreRegistroD); this.Fuente = Fuente; TamañoFuente = this.Fuente.Tamaño; //Validar que la dirección sea valdida? //if (TamañoFuente > TamañoDestino) //{ // resultados.ResultadoCompilacion($"El valor '{Fuente.Hex}' - {TamañoFuente} sobrepasa el tamaño del operando de destino '{NombreRegistro.ToUpper()}' - {TamañoDestino}", LineaDocumento); //} }
protected abstract Instruccion EsValida(LineaLexica linea, ResultadosCompilacion Errores, TipoInstruccion tipo);
public Salto(string Etiqueta, LineaLexica Linea, TipoInstruccion Tipo) : base(Linea, Tipo) { this.Etiqueta = Etiqueta; }
public ReturnControl(LineaLexica LineaDocumento, TipoInstruccion Tipo) : base(LineaDocumento, Tipo) { }