gpt4 book ai didi

c++ - 程序集和模板类

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:33:37 26 4
gpt4 key购买 nike

我正在做一个小项目,并试图将一些硬编码值用于内联汇编。为此,我正在使用模板。我创建了一个代码片段来展示我所看到的内容

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

事实证明,对于汇编代码,它试图使用数据段而不是“直接将数字粘贴到那里”

        ; 25   : {

push ebp
mov ebp, esp
push ecx

; 26 : auto o = new MyClass<999>();

push 4
call ??2@YAPAXI@Z ; operator new
add esp, 4

; 14 : size_t value = T;

mov DWORD PTR _value$2[ebp], 999 ; 000003e7H

; 26 : auto o = new MyClass<999>();

mov DWORD PTR [eax], 0
mov DWORD PTR [eax], 999 ; 000003e7H

; 15 : __asm
; 16 : {
; 17 : mov eax, [T]

mov eax, DWORD PTR ds:0

; 18 : mov [value], eax

mov DWORD PTR _value$2[ebp], eax

; 19 : }
; 20 : std::cout << value << std::endl;

我正在使用 Visual Studio 2015。有没有其他方法可以实现这一点。

提前致谢

特里特隆。

最佳答案

啊,多么可爱又扭曲的问题!

我尝试了一个用 T 初始化的 constexpr 变量。结果是一样的——从内存中加载值。宏可用于将文字传递给内联汇编,但它们不能与模板很好地混合。

使用 T 在类中初始化一个枚举在理论上应该可行(https://msdn.microsoft.com/en-us/library/ydwz5zc6.aspx 提到枚举可以在内联汇编中使用),但是在内联汇编中使用它会使 visual studio 2015 编译器崩溃:-)。

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

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

关于c++ - 程序集和模板类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35952524/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com