コード例 #1
0
        void ProcessNextBlocks(X86Instruction ins)
        {
            long       target = 0;
            BasicBlock nb     = null;

            switch (ins.Mnemonic)
            {
            case X86Mnemonic.Jmp:
            {
                if (ins.Operand1.OperandUsage == X86OperandUsage.Normal)
                {
                    target = (long)(ulong)ins.Operand1.Value;
                    nb     = method.GetOrCreateBlock(target);
                    nextBlocks.Add(nb);
                    nb.prevBlocks.Add(this);
                }
            }
            break;

            case X86Mnemonic.Retn:
                break;

            case X86Mnemonic.Jl:
            case X86Mnemonic.Je:
            case X86Mnemonic.Jne:
            {
                target = (long)(ulong)ins.Operand1.Value;
                nb     = method.GetOrCreateBlock(target);
                nextBlocks.Add(nb);
                nb.prevBlocks.Add(this);

                target = ins.Offset + ins.ComputeSize();
                nb     = method.GetOrCreateBlock(target);
                nextBlocks.Add(nb);
                nb.prevBlocks.Add(this);
            }
            break;

            default:
                throw new NotImplementedException();
            }
        }