Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.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++_Assembly - Fatal编程技术网

C++ 程序集和模板类

C++ 程序集和模板类,c++,assembly,C++,Assembly,我正在做一个小项目,并试图得到一些硬编码的值到内联汇编。为此,我使用了模板。我创建了一个代码剪报来显示我看到的内容 #include <iostream> template <size_t T> struct MyClass { size_t myValue = T; void doSomething() { size_t value

我正在做一个小项目,并试图得到一些硬编码的值到内联汇编。为此,我使用了模板。我创建了一个代码剪报来显示我看到的内容

      #include <iostream>

      template <size_t T>
      struct MyClass
      {
          size_t myValue = T;

          void doSomething()
          {
              size_t value = T;
              __asm
              {
                  mov eax, [T]
                  mov [value], eax
              }
              std::cout << value << std::endl;
          }
      };

   int main()
   {
       auto o = new MyClass<999>();

       o->doSomething();
       return 0;
   }
#包括
模板
结构MyClass
{
大小\u t myValue=t;
无效剂量测定法()
{
尺寸t值=t;
__asm
{
mov-eax[T]
mov[值],eax
}

啊,多可爱的问题啊

我尝试了一个用T初始化的constexpr变量。结果是相同的-从内存加载的值。宏可以用来将文本传递给内联程序集,但它们不能与模板很好地混合

在类内使用T初始化枚举在理论上是可行的(提到枚举可用于内联汇编),但在内联汇编中使用它会导致visual studio 2015编译器崩溃:-)

似乎有效的是一个函数模板,它使用template参数声明一个枚举,然后在内联程序集中使用该枚举。如果必须在模板类中使用该枚举,则可以在类中实例化模板函数,如下所示:

    #include <iostream>

    template <size_t T> void dosomething() {
      enum { LOCALENUM = T };
      size_t value = 0;
      __asm
      {
        mov eax, LOCALENUM
        mov[value], eax
      }
      std::cout << value << std::endl;
    }


    template <size_t T>
    struct MyClass
    {
      size_t myValue = T;
      void doSomething()
      {
        ::dosomething<T>();
      }
    };

    int main()
    {
      //dosomething<999>();
      auto o = new MyClass<999>();
      o->doSomething();
      return 0;
    }
#包括
模板void dosomething(){
枚举{LOCALENUM=T};
大小\u t值=0;
__asm
{
mov eax,LOCALENUM
mov[值],eax
}
std::cout doSomething();

001B1021 mov eax,3E7h我没有看到模板和汇编代码混合。勇敢的灵魂,你是。如果
t
是一个值,你不应该使用
mov eax,t
,而不是
[t]
?是的,但如果使用该值,结果类似。它似乎被0替换。ds是您遇到的。问题似乎出在类上。正如您所说,这可能是一个错误,但您提供的答案对我的情况很有用。我可以将此参数传递给该函数。谢谢。实际上,似乎您可以移动dosomething()当在函数中声明枚举时,答案中的函数将成为类中的成员函数。似乎只是在类范围中声明枚举会使编译器崩溃。
    #include <iostream>

    template <size_t T> void dosomething() {
      enum { LOCALENUM = T };
      size_t value = 0;
      __asm
      {
        mov eax, LOCALENUM
        mov[value], eax
      }
      std::cout << value << std::endl;
    }


    template <size_t T>
    struct MyClass
    {
      size_t myValue = T;
      void doSomething()
      {
        ::dosomething<T>();
      }
    };

    int main()
    {
      //dosomething<999>();
      auto o = new MyClass<999>();
      o->doSomething();
      return 0;
    }
     auto o = new MyClass<999>();
     001B1015  mov         dword ptr [eax],0  
     001B101B  mov         dword ptr [eax],3E7h  
      o->doSomething();
     001B1021  mov         eax,3E7h    <--- Victory!
     001B1026  mov         dword ptr [ebp-4],eax  
     001B1029  mov         ecx,dword ptr            [_imp_?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A (01B2048h)]  
     001B102F  push        offset std::endl<char,std::char_traits<char> > (01B1050h)  
     001B1034  push        dword ptr [ebp-4]  
     001B1037  call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (01B2044h)]