示例#1
0
 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));
     }
 }
示例#2
0
        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");
        }
示例#3
0
 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);
 }