c++ asm 将指针移动到寄存器 = 访问冲突错误

标签 c++ winapi assembly inline-assembly

我正在使用 asm insert 来清除位图,它是这样创建的:

CreateDIBSection(m_dc, &bmpinfo, DIB_RGB_COLORS, (void **)&m_bmp_data, NULL, NULL);

asm 插入(C++)

int c = RGB32(color.r, color.g, color.b);

int length = m_width * m_height;

__asm
{
    mov edi, m_bmp_data
    mov ecx, length
    mov eax, c
    rep stosd
}

此代码抛出访问冲突错误。但如果我这样做 - 没问题:

BYTE* dest = m_bmp_data;
__asm
{
    mov edi, dest
...

这些和平有什么区别?

更新: 对于“mov edi, m_bmp_data”,它翻译成“mov edi, 10h”。为什么是 10 小时?对于“mov edi, dest”,它翻译成“mov edi, dword ptr [dest]”。真的,我没有找到如何将 memset 与整数值一起使用,所以我只使用内联 asm

最佳答案

    mov edi, m_bmp_data

只有当 m_bmp_data 是局部或全局变量时才能正常工作。这个名字强烈暗示它不是,很可能是 C++ 类的成员。这需要取消引用 this 指针,如下所示:

    __asm {
        mov eax, this;
        mov edi, [eax + m_bmp_data];
        // etc..
    }

实际上写这段代码没有意义,你还不如使用你找到的解决方法,编译器永远不会出错。

关于c++ asm 将指针移动到寄存器 = 访问冲突错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13658980/

相关文章:

c++ - Windows ACL 和 ACCESS_MASK

c++ - SymGetLineFromAddr 无法正常工作

c - C 中 Ackermann 函数的替代实现

graphics - 用汇编程序进行图形编程?

c++ - 如何使用 Vector Class Library 进行 AVX 矢量化以及 openmp #pragma omp parallel 进行缩减?

c++ - Credential Provider 和系统服务之间的 IPC

c++ - 以管理员身份创建进程并获取其 ProcessInformation Like ProcessID

gcc - golang 在使用和不使用 cgo 进行构建时使用的汇编程序

c++ - 如何在使用 OpenCV/C++ 拼接之前检测图像位置

c++ - 有没有办法阻止键盘宏在程序上运行?