public void BwiX86_RewriteIndirectCall()
        {
            BuildTest16(m =>
            {
                m.Call(m.MemW(Registers.cs, Registers.bx, 4));
            });
            var uc = new UserCallData
            {
                Address   = Address.SegPtr(0xC00, 0),
                Signature = new FunctionType(
                    Reg(Registers.ax),
                    new Identifier[] { Reg(Registers.cx) })
            };

            program.User.Calls.Add(uc.Address, uc);

            wi.Process();
            var sw = new StringWriter();

            block.WriteStatements(sw);
            string sExp =
                "\tax = SEQ(0x0C00, Mem0[ds:bx + 0x0004:word16])(cx)" + nl;

            Assert.AreEqual(sExp, sw.ToString());
        }
        public ICallSiteDialog CreateCallSiteDialog(Program program, UserCallData ucd)
        {
            Debug.Assert(ucd != null && ucd.Address != null);
            var dlg = new CallSiteDialog();

            dlg.Address          = ucd.Address;
            dlg.NoReturn.Checked = ucd.NoReturn;
            return(dlg);
        }
Beispiel #3
0
 private UserCallData GetUserCallDataFromAddress(Address addr)
 {
     if (!program.User.Calls.TryGetValue(addr, out UserCallData ucd))
     {
         ucd = new UserCallData {
             Address = addr
         };
     }
     return(ucd);
 }
Beispiel #4
0
        private FunctionType GetCallSignatureAtAddress(Address addrCallInstruction)
        {
            UserCallData call = null;

            if (!program.User.Calls.TryGetValue(addrCallInstruction, out call))
            {
                return(null);
            }
            return(call.Signature);
        }
Beispiel #5
0
        private bool OnAfterCall(FunctionType sigCallee, ProcedureCharacteristics characteristics)
        {
            UserCallData userCall = null;

            if (program.User.Calls.TryGetUpperBound(ric.Address, out userCall))
            {
                var linStart    = ric.Address.ToLinear();
                var linEnd      = linStart + ric.Length;
                var linUserCall = userCall.Address.ToLinear();
                if (linStart > linUserCall || linUserCall >= linEnd)
                {
                    userCall = null;
                }
            }
            if ((characteristics != null && characteristics.Terminates) ||
                (userCall != null && userCall.NoReturn))
            {
                scanner.TerminateBlock(blockCur, ric.Address + ric.Length);
                return(false);
            }

            if (sigCallee != null)
            {
                if (sigCallee.StackDelta != 0)
                {
                    Expression newVal = new BinaryExpression(
                        Operator.IAdd,
                        stackReg.DataType,
                        stackReg,
                        Constant.Create(
                            PrimitiveType.CreateWord(stackReg.DataType.Size),
                            sigCallee.StackDelta));
                    newVal = newVal.Accept(eval);
                    SetValue(stackReg, newVal);
                }
            }
            state.OnAfterCall(sigCallee);

            // Adjust stack after call
            if (sigCallee != null)
            {
                int delta = sigCallee.StackDelta - sigCallee.ReturnAddressOnStack;
                if (delta != 0)
                {
                    var d = Constant.Create(stackReg.DataType, delta);
                    this.Emit(new Assignment(
                                  stackReg,
                                  new BinaryExpression(Operator.IAdd, stackReg.DataType, stackReg, d)));
                }
            }
            return(true);
        }
Beispiel #6
0
        private SerializedCall_v1 SerializeUserCall(Program program, UserCallData uc)
        {
            if (uc == null || uc.Address == null)
            {
                return(null);
            }
            var procser = program.CreateProcedureSerializer();
            SerializedSignature ssig = null;

            if (uc.Signature != null)
            {
                ssig = procser.Serialize(uc.Signature);
            }
            return(new SerializedCall_v1
            {
                InstructionAddress = uc.Address.ToString(),
                Comment = uc.Comment,
                NoReturn = uc.NoReturn,
                Signature = ssig,
            });
        }
Beispiel #7
0
 private void SetUserCallData(UserCallData ucd)
 {
     program.User.Calls[ucd.Address] = ucd;
 }
Beispiel #8
0
 private SerializedCall_v1 SerializeUserCall(Program program, UserCallData uc)
 {
     if (uc == null || uc.Address == null)
         return null;
     var procser = program.CreateProcedureSerializer();
     SerializedSignature ssig = null;
     if (uc.Signature != null)
     {
         ssig = procser.Serialize(uc.Signature);
     }
     return new SerializedCall_v1
     {
         InstructionAddress = uc.Address.ToString(),
         Comment = uc.Comment,
         NoReturn = uc.NoReturn,
         Signature = ssig,
     };
 }