我試圖在模板中傳遞一個函式指標,然后在 asm 代碼中使用它:
template <auto T>
_declspec(naked) void Test()
{
__asm
{
lea eax, T
jmp [eax]
}
}
int main()
{
Test<MessageBoxA>();
Test<Sleep>();
}
我知道裸函式在執行時會崩潰,但我已經簡化了代碼以僅顯示我想要實作的目標。
這段代碼的問題在于,一旦編譯,如果你在反匯編器中查看匯編代碼,它會如下所示:
lea eax, 0
jmp [eax]
它在 eax 中存盤 0。相反,它應該將MessageBoxA地址(和Sleep另一個函式)存盤在 eax 中。
我不知道是我做錯了什么還是編譯器失敗了。
uj5u.com熱心網友回復:
我不是匯編專家,但是static constexpr void*為非型別模板引數值創建一個集合似乎可以解決問題:
template <auto T>
__declspec(naked) void Test()
{
static constexpr void* fptr = T;
__asm
{
lea eax, fptr
jmp [eax]
}
}
const void sleep()
{
}
int main()
{
Test<(&sleep)>();
return 0;
}
生成
lea eax, OFFSET void * `void Test<&void sleep(void)>(void)'::`2'::fptr
jmp SHORT DWORD PTR [eax]
該示例可以在編譯器資源管理器中使用:https ://godbolt.org/z/f1d7daa49
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/467084.html
下一篇:RecyclerView顯示串列
