public void VpUndoUnnecessarySlicingOfSegmentPointer() { var m = new ProcedureBuilder(); var es = m.Reg16("es", 1); var bx = m.Reg16("bx", 3); var es_bx = m.Frame.EnsureSequence(es.Storage, bx.Storage, PrimitiveType.Word32); m.Assign(es_bx, m.SegMem(PrimitiveType.Word32, es, bx)); m.Assign(es, m.Slice(PrimitiveType.Word16, es_bx, 16)); m.Assign(bx, m.Cast(PrimitiveType.Word16, es_bx)); m.SegStore(es, m.IAdd(bx, 4), m.Byte(3)); var ssa = RunTest(m); var sExp = #region Expected @"es:es def: def es uses: es_bx_3 = Mem0[es:bx:word32] bx:bx def: def bx uses: es_bx_3 = Mem0[es:bx:word32] Mem0:Global memory def: def Mem0 uses: es_bx_3 = Mem0[es:bx:word32] es_bx_3: orig: es_bx def: es_bx_3 = Mem0[es:bx:word32] uses: es_4 = SLICE(es_bx_3, word16, 16) bx_5 = (word16) es_bx_3 Mem0[es_bx_3 + 0x0004:byte] = 0x03 es_4: orig: es def: es_4 = SLICE(es_bx_3, word16, 16) bx_5: orig: bx def: bx_5 = (word16) es_bx_3 Mem6: orig: Mem0 def: Mem0[es_bx_3 + 0x0004:byte] = 0x03 // ProcedureBuilder // Return size: 0 void ProcedureBuilder() ProcedureBuilder_entry: def es def bx def Mem0 // succ: l1 l1: es_bx_3 = Mem0[es:bx:word32] es_4 = SLICE(es_bx_3, word16, 16) bx_5 = (word16) es_bx_3 Mem0[es_bx_3 + 0x0004:byte] = 0x03 ProcedureBuilder_exit: "; #endregion AssertStringsEqual(sExp, ssa); }
public void TrcoSegmentedDirectAddress() { Program prog = CreateProgram(); prog.TypeStore.EnsureExpressionTypeVariable(prog.TypeFactory, prog.Globals); ProcedureBuilder m = new ProcedureBuilder(); Identifier ds = m.Local16("ds"); Expression e = m.SegMem(PrimitiveType.Byte, ds, m.Int16(0x0200)); coll = CreateCollector(prog); e = e.Accept(en); e.Accept(eqb); e.Accept(coll); Verify(null, "Typing/TrcoSegmentedDirectAddress.txt"); }
public void TrcoSegmentedAccess() { ProcedureBuilder m = new ProcedureBuilder(); Identifier ds = m.Local16("ds"); Identifier bx = m.Local16("bx"); Identifier ax = m.Local16("ax"); Expression e = m.SegMem(PrimitiveType.Word16, ds, m.IAdd(bx, 4)); coll = CreateCollector(); e = e.Accept(en); e.Accept(eqb); e.Accept(coll); Verify(null, "Typing/TrcoSegmentedAccess.txt"); }
public void DtbSignedCompare() { ProcedureBuilder m = new ProcedureBuilder(); Identifier p = m.Local32("p"); Identifier ds = m.Local16("ds"); ds.DataType = PrimitiveType.SegmentSelector; Identifier ds2 = m.Local16("ds2"); ds.DataType = PrimitiveType.SegmentSelector; m.Assign(ds2, ds); m.Store( m.SegMem(PrimitiveType.Bool, ds, m.Word16(0x5400)), m.Lt(m.SegMemW(ds, m.Word16(0x5404)), m.Word16(20))); m.Store(m.SegMemW(ds2, m.Word16(0x5404)), m.Word16(0)); ProgramBuilder prog = new ProgramBuilder(); prog.Add(m); RunTest(prog.BuildProgram(), "Typing/DtbSignedCompare.txt"); }
public void DtbSegmentedDirectAddress() { ProcedureBuilder m = new ProcedureBuilder(); var arch = new Reko.Arch.X86.X86ArchitectureReal(); var prog = new Program { Architecture = arch, Platform = new DefaultPlatform(null, arch) }; store.EnsureExpressionTypeVariable(factory, prog.Globals); Identifier ds = m.Local16("ds"); Expression e = m.SegMem(PrimitiveType.Byte, ds, m.Int16(0x0200)); TraitCollector coll = new TraitCollector(factory, store, dtb, prog); e = e.Accept(aen); e.Accept(eqb); e.Accept(coll); dtb.BuildEquivalenceClassDataTypes(); Verify("Typing/DtbSegmentedDirectAddress.txt"); }
public void DtbSegmentedAccess() { ProcedureBuilder m = new ProcedureBuilder(); Identifier ds = m.Local16("ds"); Identifier bx = m.Local16("bx"); Expression e = m.SegMem(bx.DataType, ds, m.IAdd(bx, 4)); var arch = new Reko.Arch.X86.X86ArchitectureReal(); Program prog = new Program { Architecture = arch, Platform = new DefaultPlatform(null, arch), }; TraitCollector trco = new TraitCollector(factory, store, dtb, prog); e = e.Accept(aen); e.Accept(eqb); e.Accept(trco); dtb.BuildEquivalenceClassDataTypes(); Verify("Typing/DtbSegmentedAccess.txt"); }