asm在c ++中作为宏块

时间:2013-05-31 09:38:35

标签: c++ assembly macros

我想编写一个宏,将所有内容转换为void *甚至是成员函数。 这是代码:

#define toVoidStar(xx,yy)\
    __asm push ecx; \
    __asm mov ecx, yy; \ 
    __asm mov [xx], ecx; \ 
    __asm pop ecx;

当我“调用它”时它会给出错误:错误C2017:非法逃避

如果我在代码中使用它,它就可以正常工作:

void * myvoid;

__asm
{
    push ecx;
    mov ecx, imageMousePressed;
    mov [myvoid], ecx;
    pop ecx;
}

我知道这不是一个非常好的解决方案,但无论如何,任何人都可以帮助它起作用吗?

3 个答案:

答案 0 :(得分:8)

为什么不使用标准联盟插孔?

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;
}

用法:as_void(&std::vector<int>::size)

答案 1 :(得分:2)

您不能给出如下的宏定义:

#define toVoidStar(xx,yy)\
    __asm push ecx; \
    __asm mov ecx, yy; \ 
    __asm mov [xx], ecx; \ 
    __asm pop ecx;

由于使用了__asm push ecx;,因此;行之后的所有行都会被注释掉。请参阅我的答案question

答案 2 :(得分:2)

因为__asm关键字是一个语句分隔符,所以您也可以将汇编指令放在同一行(see this link)上:

__asm mov al, 2   __asm mov dx, 0xD007   __asm out dx, al

所以解决方法就是省略分号,编译器会知道语句的结束位置。