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)]