【问题标题】:How to store register values using assembly to C++ variables?如何使用程序集将寄存器值存储到 C++ 变量?
【发布时间】:2021-05-23 16:33:45
【问题描述】:
int my_var;
void __declspec(naked) stuff()
{
    __asm
    {
        lea edx, [ecx + edi + 0x0000111]
    }
}

如何将地址[ecx + edi + 0x0000111]的值存储在上面的c++变量“my_var”中。

【问题讨论】:

  • 回答 like this 可能会有所帮助。
  • 我可能会查看 MS 文档,例如 here
  • @tadman:这是相反的问题,而不是特定于 MSVC 的内联 asm 风格(即使对于在目标文件或独立文件中没有符号的本地变量,它也变得微不足道asm)。
  • @PeterCordes 这很方便。

标签: c++ assembly visual-c++ x86 inline-assembly


【解决方案1】:

来自微软docs

__asm 块可以引用该块出现的范围内的任何符号,包括变量名。

因此你可以这样做:

int my_var;
void __declspec(naked) stuff()
{
    __asm
    {
        lea edx, [ecx + edi + 0x0000111]
        mov my_var, edx
        ret

    }
}

【讨论】:

  • 您的答案可能应该包括缺少的ret 指令,此naked 函数需要可调用而不会崩溃。
  • @PeterCordes 没有注意到。谢谢。
  • 我之前尝试过,它给了我地址而不是地址中的内容,所以是实际值。
  • @EmreKöycü 我假设您想要获得寄存器的“值”。它可能是某事的地址。要获得您想要的值,只需将 my_var 定义为合适类型的指针,然后在 _asm 块之后取消引用它(记得删除 ret 指令)。
猜你喜欢
  • 2013-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-07
  • 1970-01-01
相关资源
最近更新 更多