Beispiel #1
0
        /// <summary>
        /// Before processing the body of a procedure, perform housekeeping tasks.
        /// </summary>
        /// <param name="addr"></param>
        /// <param name="state"></param>
        /// <param name="proc"></param>
        /// <returns></returns>
        private void EstablishInitialState(Address addr, ProcessorState st, Procedure proc)
        {
            st.InstructionPointer = addr;;
            st.OnProcedureEntered();
            var sp = proc.Frame.EnsureRegister(Program.Architecture.StackRegister);

            st.SetValue(sp, proc.Frame.FramePointer);
            SetAssumedRegisterValues(addr, st);
        }
Beispiel #2
0
 public void SetValue(Expression dst, Expression value)
 {
     if (dst is Identifier id)
     {
         state.SetValue(id, value);
     }
     else if (dst is SegmentedAccess smem)
     {
         state.SetValueEa(smem.BasePointer, GetValue(smem.EffectiveAddress), value);
     }
     else if (dst is MemoryAccess mem)
     {
         state.SetValueEa(GetValue(mem.EffectiveAddress), value);
     }
 }
Beispiel #3
0
 public void SetAssumedRegisterValues(Address addr, ProcessorState st)
 {
     if (!Program.User.Procedures.TryGetValue(addr, out var userProc) ||
         userProc.Assume == null)
     {
         return;
     }
     foreach (var rv in userProc.Assume)
     {
         var reg = Program.Architecture.GetRegister(rv.Register);
         var val = rv.Value == "*"
             ? Constant.Invalid
             : Constant.Create(reg.DataType, Convert.ToUInt64(rv.Value, 16));
         st.SetValue(reg, val);
     }
 }