【问题标题】:Writing to ecx register causes "Access violation" in Windows 7在 Windows 7 中写入 ecx 寄存器会导致“访问冲突”
【发布时间】:2011-10-21 08:31:33
【问题描述】:

您好,非常感谢您的帮助!

在我的 c++ 代码中,我有一些嵌入式汇编代码,并且在 [mov ecx,1AF858h] 行处不断弹出一条错误消息,提示“访问冲突”。它可以在 Windows XP 上完美运行,但不幸的是不能在 Windows 7 上运行。

我不明白是什么导致了问题,我想知道我需要做些什么来解决它。

亲切的问候,大卫

【问题讨论】:

  • 这在很大程度上取决于在哪里完成。请显示更多代码。另外,您的代码是否在这两种情况下都编译为 32 位目标?
  • 如果是 Visual Studio,则内联程序集仅在 32 位模式下可用。在类中,ECX 寄存器通常保存this 指针。更改可能会产生“有趣”的效果。
  • 真的是[mov ecx,1AF858h] 而不是mov ecx,[1AF858h]?因为在后者的情况下,它只是从地址 0x1AF858 读取时的标准访问冲突,与 ecx 无关。但无论如何发布更多代码和/或错误上下文。
  • 背景:我正在尝试将汇编代码加载到字节数组中,然后执行它。我已经测试了其他一些东西,看起来 Windows 7 不允许从动态分配的内存块执行任何代码。它是否正确?有什么办法可以解决这个问题?
  • 您可以使用mov ecx, 1234h 进行测试,如果这不会产生访问冲突就在那里,那么它就是1AF858h 的AV。在这种情况下,您将需要下面关于Virtual*Protect 的答案

标签: c++ visual-studio-2010 windows-7 assembly


【解决方案1】:

您需要使用VirtualProtect/VirtualProtectEx 将您的字节数组标记为可执行或使用正确的flags 使用VirtualAlloc 分配它(在编写代码时可能是PAGE_READWRITE,然后是PAGE_EXECUTE_READ)。请注意,它可能需要基于页面完成。

【讨论】:

  • 非常感谢您的帮助!!!现在可以了。我正在使用的代码:VirtualProtect(ptr, size, PAGE_EXECUTE_READWRITE, &flOldProtect)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-22
  • 1970-01-01
  • 2010-11-05
  • 1970-01-01
  • 1970-01-01
  • 2015-08-29
  • 2012-01-12
相关资源
最近更新 更多