anchor.diff:  
         end;
         P := VA + Int32(PInst^.Disp.Value);
  -      try
  -        { Since UnivDisasm can disassemble from anywere (memory,disk,..)
  -          User may provide wrong address !!
  -          ==> So we must use try to access memory !!!
  -        }
  -        P := PByte(PUInt64(P)^);
  -      except
  -        P := nil;
  -        PInst^.Error(ERROR_INVALID_EFFECTIVE_ADDRESS);
  +      if DS = SEG_DS then
  +      begin
  +        try
  +          { Since UnivDisasm can disassemble from anywere (memory,disk,..)
  +            User may provide wrong address !!
  +            ==> So we must use try to access memory !!!
  +          }
  +          P := PByte(PUInt64(P)^);
  +        except
  +          P := nil;
  +          PInst^.Error(ERROR_INVALID_EFFECTIVE_ADDRESS);
  +        end;
  +        PInst^.DstAddr.Addr := P;
         end;
  -      PInst^.DstAddr.Addr := P;
  -    end
  -    else
  -    begin
  +    end else begin
         { No EIP/RIP }
  -      P := PByte(PInst^.Disp.Value);
  -      try
  -        case PInst^.AddressMode of
  -          AM_16: P := PByte(PUInt16(P)^);
  -          AM_32: P := PByte(PUInt32(P)^);
  -        else PInst^.Error(ERROR_INVALID_ADDRESS_MODE);
  +      if DS = SEG_DS then
  +      begin
  +        P := PByte(PInst^.Disp.Value);
  +        try
  +          case PInst^.AddressMode of
  +            AM_16: P := PByte(PUInt16(P)^);
  +            AM_32: P := PByte(PUInt32(P)^);
  +          else PInst^.Error(ERROR_INVALID_ADDRESS_MODE);
  +          end;
  +        except
  +          P := nil;
  +          PInst^.Error(ERROR_INVALID_EFFECTIVE_ADDRESS);
           end;
  -      except
  -        P := nil;
  -        PInst^.Error(ERROR_INVALID_EFFECTIVE_ADDRESS);
  +        PInst^.DstAddr.Addr := P;
         end;
  -      PInst^.DstAddr.Addr := P;
  -    end;
  -  end
  -  else
  -  begin
  +    end;
  +  end else begin
       { JMP/CALL [REG] }
       F := F or JF_REG;
       PInst^.DstAddr.Addr := nil;
  
positive.code:         begin
            if VLSize = VL512 then
              N := SIZE_32_BYTE;
          end
          else
          begin
            if VLSize > VL128 then
              N := SIZE_16_BYTE;
          end;
  
negative.code:   if PInst^.ModRm.Value.IsMem then
    begin
      DecodeArgAsMem(PInst, PInst^.Arg1);
    end else begin
      PInst^.Arg1.Reg := (REGS_GP or (PInst^.InternalData.OpSizeV shl 8) or PInst^.ModRm.Value.Rm or PInst^.Fields.B);
    end;
    DS := SegOrDef(PInst, SEG_DS);
    if Assigned(PInst^.VirtualAddr) then
      VA := PInst^.VirtualAddr + (PInst^.NextInst - PInst^.Addr)
    else
  