protected Address ReadSegmentedCodeAddress(int byteSize, ImageReader rdr, ProcessorState state) { if (byteSize == PrimitiveType.Word16.Size) { return(Address.SegPtr(state.GetRegister(Registers.cs).ToUInt16(), rdr.ReadLeUInt16())); } else { ushort off = rdr.ReadLeUInt16(); ushort seg = rdr.ReadLeUInt16(); return(Address.SegPtr(seg, off)); } }
public void BwiX86_WalkX86ServiceCall() { // Checks to see if a sequence return value (es:bx) trashes the state appropriately. BuildTest16(m => { m.Int(0x21); state.SetRegister(Registers.es, Constant.Word16(0)); state.SetRegister(Registers.bx, Constant.Word16(0)); state.SetRegister(Registers.ah, Constant.Word16(0x2F)); }); wi.Process(); Assert.IsFalse(state.GetRegister(Registers.es).IsValid, "should have trashed ES"); Assert.IsFalse(state.GetRegister(Registers.bx).IsValid, "should have trashed BX"); }
protected bool TryReadSegmentedCodeAddress(int byteSize, EndianImageReader rdr, ProcessorState state, out Address addr) { if (byteSize == PrimitiveType.Word16.Size) { if (rdr.TryReadLeUInt16(out ushort uOffset)) { addr = CreateSegmentedAddress(state.GetRegister(Registers.cs).ToUInt16(), uOffset); return(true); } } else { if (rdr.TryReadLeUInt16(out var off) && rdr.TryReadLeUInt16(out var seg)) { addr = CreateSegmentedAddress(seg, off); return(true); } } addr = null; return(false); }