【问题标题】:Intel Pin:Invalid REG for IARG_REG_VALUE reg: xmm0英特尔引脚:IARG_REG_VALUE 的 REG 无效 reg:xmm0
【发布时间】:2019-04-18 03:52:25
【问题描述】:

我正在制作一个程序来跟踪该程序,但我遇到了像标题这样的错误。 有没有人能看懂的?

INS_InsertCall(ins, action, AFUNPTR(RegOpnd::at_call),
            IARG_PTR, data,
            IARG_PTR, this,
            IARG_REG_VALUE, reg_,
            IARG_END);

我检查了 IARG_REG_VALUE 与 xmm 寄存器不兼容。 如何获取信息?

【问题讨论】:

    标签: intel-pin


    【解决方案1】:

    正如documentation 所说:

    这不能用于检索大小大于 ADDRINT 的寄存器的值(例如 x87 FPU/XMM/YMM/ZMM/opmask)

    您有两种选择:

    • 测试寄存器的类型并使用IARG_REG_CONST_REFERENCE(或IARG_REG_REFERENCE,如果您想修改寄存器)。
    • 获取 CPU 上下文(如果您希望修改其中的任何寄存器,请使用 IARG_CONST_CONTEXTIARG_CONTEXT)并检查上下文中的寄存器。

    我猜第一个选项更有意义,所以它应该类似于下面的代码:

    警告:以下代码尚未经过测试/编译...

    仪器:

    const unsigned int opnd_count =  INS_OperandCount(ins);
    for(unsigned int i=0; i < opnd_count;i++)
    {
        if (INS_OperandIsReg(ins,i))
        {
            REG r = INS_OperandReg(ins,i);
            if ((r))
            {
                INS_InsertCall(ins, IPOINT_AFTER, (AFUNPTR)xmm_arg, 
                               IARG_REG_CONST_REFERENCE, r,
                               IARG_REG_REFERENCE, r, // you might remove this one if you don't modify the reg.
                               IARG_UINT32, i,
                               IARG_UINT32, (r-REG_XMM_BASE), // note: REG_XMM_BASE = REG_XMM0
                               IARG_END);
            }
    
        }
    }
    

    分析:

    // regConstRef: const reference on the register
    // regRef: reference on the register
    // opnd_indx: operand index (0 for the 1st inst. op.; 1 for the 2nd inst. op.)
    // regno: register number: 0 = XMM0; 1 = XMM1, etc.
    VOID xmm_arg(PIN_REGISTER* regConstRef, PIN_REGISTER* regRef, UINT32 opnd_indx, UINT32 regno)
    {
        // just "dump" the register
        std::cout << "XMM" << regno << " operand_index: " << opnd_indx << " ";
        for(unsigned int i=0;i< MAX_DWORDS_PER_PIN_REG;i++)
        {
            std::cout << std::setw(10) << regConstRef->dword[i] << " ";
        }  
        std::cout << std::endl;
    }  
    

    【讨论】:

    • 谢谢,评论。我会尝试用代码运行它。我终于想对应XMM/YMM/ZMM寄存器了。
    猜你喜欢
    • 2017-02-03
    • 2019-01-10
    • 2016-06-01
    • 2020-06-01
    • 2018-01-27
    • 1970-01-01
    • 1970-01-01
    • 2017-05-24
    • 1970-01-01
    相关资源
    最近更新 更多