确定指令是否具有间接内存操作数

时间:2016-05-04 20:31:33

标签: c++ linux assembly intel-pin

查看PIN Inspection API Page,有一个名为INS_IsLea()的方法,如果当前指令是LEA指令,则返回true。这很有用,但我需要确定其中一个指令操作数是否是间接引用。例如:

MOV rax, (%rdi)

我希望能够确定第二个操作数实际上是间接引用,但似乎没有可用的方法。

3 个答案:

答案 0 :(得分:1)

INS_OperandIsMemory()如果您只是想检查其中一个操作数是否是内存操作数。

请注意,第二个参数n表示Intel语法中的操作数(0-indexed),例如

; rax = destination op; rdi = source op
mov rax, [rdi] ; rax = op #0 ; rdi = op #1

答案 1 :(得分:1)

看起来你正在寻找两种情况:

  1. 如果操作数是包含内存地址的寄存器。这用于间接跳转或调用。可以通过INS_IsIndirectBranchOrCall(ins)
  2. 检测到
  3. 如果第二个操作数是用于算术或移动操作的内存位置。可以通过(!INS_IsBranchOrCall(ins) && (INS_MemoryOperandCount(ins) > 0))
  4. 检测到

    注:lea指令只是将内存地址加载到寄存器中。它实际上从未访问过内存地址。阅读hereINS_IsLea返回true,指令操作码为lea。因此,它将为MOV rax, (%rdi)

    返回false

答案 2 :(得分:0)

我只是在这里猜测,因为我在阅读这个问题之前从未听说过这个图书馆,但是......

我认为如果INS_IsMemoryRead()INS_IsMemoryWrite()中的一个为真,则必须有间接内存操作数。

此外,从不同的角度来看,INS_MemoryOperand*()函数会检查操作数。