这是代码:
__declspec ( naked ) void nseel_asm_assign(void)
{
__asm
{
fld qword ptr [eax]
fstp qword ptr [ebx]
}
}
__declspec ( naked ) void nseel_asm_assign_end(void) {}
使用它们的代码会崩溃。调试器显示地址正常,例如
&nseel_asm_assign 0x0f45e4a0 {vis_avs.dll!nseel_asm_assign(void)} void(*)()
&nseel_asm_assign_end 0x0f45e4b0 {vis_avs.dll!nseel_asm_assign_end(void)} void(*)()
但是,当这些函数的地址由实际的 C 代码而不是由调试器获取时,它就不再正确并且使用代码会因为大小为负数而崩溃:
fn 0x0f455056 {vis_avs.dll!_nseel_asm_assign} void(*)()
fn_e 0x0f45295f {vis_avs.dll!_nseel_asm_assign_end} void(*)()
带下划线的函数只包含一条指令,例如jmp nseel_asm_assign
如何在没有下划线的情况下获取实际函数的地址?
更新:如果您想知道我为什么要编写这样的代码,那不是我,而是第三方,并且在使用 VC++ 6.0 构建时它工作得很好。