Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c+中的asm块+;作为宏_C++_Assembly_Macros - Fatal编程技术网

C++ c+中的asm块+;作为宏

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;

我想写一个宏,它可以将所有内容转换为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;
    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