【发布时间】:2012-12-01 11:29:54
【问题描述】:
我正在使用 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
【问题讨论】:
-
第一部分
m_bmp_data的类型是什么? -
它是无符号字符*(或 BYTE*)
-
检查生成的汇编代码。顺便问一下,你有理由重新发明
memset吗?您的编译器通常可以很好地优化它。 -
用“mov edi, m_bmp_data”翻译成“mov edi, 10h”。为什么是 10 小时? “mov edi, dest”翻译成“mov edi, dword ptr [dest]”。真的,我不知道如何将 memset 与整数值一起使用,所以我只使用内联 asm
标签: c++ winapi assembly inline-assembly