【发布时间】:2012-01-01 19:41:42
【问题描述】:
这是我的代码:
void Graph::PutPixel(DWORD x, DWORD y, DWORD c)
{
__asm
{
Mov Eax, y
Mov Ebx, _width
Mul Ebx
Add Eax, x
Shl Eax, 2 // Multiply by four
Add Eax, _buffer
Mov Edi, Eax
Mov Eax, c
StosD
}
}
其中 _buffer 和 _width 是 Graph 类成员:
private:
DWORD _width;
DWORD* _buffer;
它不起作用;我从两个变量中得到 0 值,但实际上它们还有一些其他值。
我可以通过将类变量复制到局部变量并使用它们来修复它:
void Graph::PutPixel(DWORD x, DWORD y, DWORD c)
{
DWORD bufAddr = (DWORD)_buffer;
DWORD w = _width;
__asm
{
Mov Eax, y
Mov Ebx, w
Mul Ebx
Add Eax, x
Shl Eax, 2 // Multiply by four
Add Eax, bufAddr
Mov Edi, Eax
Mov Eax, c
StosD
}
}
直接使用有什么问题?有可能吗?
【问题讨论】:
-
您是否尝试过,在您的第一个示例中,使用
Mov Ebx, ._width等。 -
这里有一个解决方案,还是不太方便:Mov Esi, this;移动 Ebx, [Esi]._width
-
你应该可以做到msdn.microsoft.com/en-us/library/7y325bw3.aspx,只是不能调用类方法。
-
@Kefir 您使用
this指针的评论暗示了问题:您正在使用一个类及其成员变量。汇编器不是 C++,在汇编器中你会以最小的步骤做很多事情,所以这似乎是你的答案。该解决方案有什么不方便的地方? -
这似乎解决了问题...stackoverflow.com/questions/4583288/…
标签: c++ assembly inline-assembly