C++ c+中的asm块+;作为宏
我想写一个宏,它可以将所有内容转换为void*甚至是成员函数。 代码如下:C++ c+中的asm块+;作为宏,c++,assembly,macros,C++,Assembly,Macros,我想写一个宏,它可以将所有内容转换为void*甚至是成员函数。 代码如下: #define toVoidStar(xx,yy)\ __asm push ecx; \ __asm mov ecx, yy; \ __asm mov [xx], ecx; \ __asm pop ecx; end在我“调用它”时给出错误:错误C2017:非法转义 如果我在代码中使用它,它就可以正常工作: void * myvoid; __asm { push ecx;
#define toVoidStar(xx,yy)\
__asm push ecx; \
__asm mov ecx, yy; \
__asm mov [xx], ecx; \
__asm pop ecx;
end在我“调用它”时给出错误:错误C2017:非法转义
如果我在代码中使用它,它就可以正常工作:
void * myvoid;
__asm
{
push ecx;
mov ecx, imageMousePressed;
mov [myvoid], ecx;
pop ecx;
}
我知道这不是一个很好的解决方案,但无论如何,有人能帮助它工作吗?您不能给出如下宏定义:
#define toVoidStar(xx,yy)\
__asm push ecx; \
__asm mov ecx, yy; \
__asm mov [xx], ecx; \
__asm pop ecx;
因为行
之后的所有行都按ecx代码>将被注释掉,因为代码>已使用。请参阅我的答案。为什么不使用standart union hack
template<class T>
void* as_void(T const & x)
{
union hlp_t{
void * v_ptr;
T t;
};
hlp_t a;
a.t = x;
return a.v_ptr;
}
模板
空*为空(T常数和x)
{
联合医院{
无效*v_ptr;
T;
};
hlp_t a;
a、 t=x;
返回a.v_ptr;
}
用法:as\u void(&std::vector::size)
因为asm关键字是语句分隔符,所以也可以将汇编指令放在同一行():
因此,解决方法是省去分号,编译器就会知道语句的结尾。您能详细说明为什么要这样做吗?void*(void指针)在没有任何汇编程序的情况下都是可能的。由于汇编分号的原因,它无法工作。也许你应该尝试将其重写为模板函数。谢谢。有办法让它工作吗?在这种情况下,内联函数不好,因为我不知道xx的类型。您只想将4个字节移动到myvoid
中地址所指向的位置,对吗?是的,但我不能执行void*myvoid=&eventHandlerFunct,因为它是一个成员函数。不管怎么说,另一个答案是联合黑客可以很好地工作,但我仍然好奇我的解决方案是否能以某种方式工作。因此,如果你想尝试自己的解决方案,为什么不能让它成为一个内联
函数呢!模板内联void*as_void2(T const x){void*myVoid;_asm{push ecx;mov ecx,x;mov myVoid,ecx;pop ecx;}return&myVoid;}Er,你确定在联合中应该是T
,而不是T*
?@QPaysTaxes是的,在我的例子中是T->void(std::vector:::*)(int),所以T正是需要转换的内容,T*会产生指向指针的指针为了让我澄清,您只需删除宏中每个“行”末尾的分号?@QPaysTaxes是的。
__asm mov al, 2 __asm mov dx, 0xD007 __asm out dx, al