在特定地址的ASM中获取寄存器的值

时间:2013-01-01 10:29:22

标签: c++ assembly x86

我仍在尝试学习如何在C ++中使用ASM,但我遇到了一个问题。我想要做的就是读取程序中整数的指针。

写入此整数的程序代码如下:

00A3EB6C - mov [edi+0C],eax

现在,我想做的就是将指针[edi+0C]放在该地址。我想这样做的原因是因为我无法以任何其他方式找到可靠的内存指针。

非常感谢任何帮助!

如果措辞严厉,我很抱歉,很难解释。

编辑:我的最终目标是在我的Windows窗体上的标签中的地址[edi+0C]处的指针00A3EB6C处显示整数的值。

我正在使用附加到外部应用程序的DLL,只是为了澄清。

1 个答案:

答案 0 :(得分:2)

所以假设你有这样的功能:

void func(...)
{
    asm {
      ... 

      mov [edi+0xc], eax
      ... 
    }
}

现在,要从函数中获取eax的值,您需要传入一个指针

void func(..., int *ptr)
{
    asm {
       ... 

       mov [edi+oxc], eax
       mov [ptr], eax
       ... 
    }
 }

或者您可以将其用作返回值:

int func(...)
{
   int ret;

   asm {
       ... 

       mov [edi+oxc], eax
       mov [ret], eax
       ... 
    }

   return ret;
}

也有其他选择,但这些选项最简单。

如果你真的想要获得一个指向edi的指针,你将使用一个指向指针的指针作为参数[或一个指针作为返回值 - 所以我只会向你显示指向指针的指针,作为返回值遵循与上述完全相同的模式]

void func(..., int **ptr)
{
    asm {
       ... 

     // Assumes eax isn't used elsewhere below! 
     // Otherwise, find another free register. 
       mov [edi+oxc], eax
       lea [edi+0xc], eax      // LEA = load effective address. 
       mov [ptr], eax
       ... 
    }
 }