【发布时间】:2014-05-28 11:02:20
【问题描述】:
我正在尝试在 x64 asm 中做一些非常基本的事情:
有一个 asm 函数,它接受一个函数指针并将其设置在一个变量中。这个函数是从 C 代码中调用的。
有另一个 asm 函数调用函数指针,如果不为空,这个函数指针也是一个 C 函数(由 1 中的函数设置)。
到目前为止,我对 C 方面的看法如下:
extern "C" void _asm_set_func_ptr(void* ptr);
void _cdecl c_call_back()
{
}
void init()
{
_asm_set_func_ptr(c_call_back);
}
还有 asm 方面:
.DATA
g_pFuncPtr QWORD 0
.CODE ;Indicates the start of a code segment.
_asm_set_func_ptr PROC fPtr:QWORD
mov [rsp+qword ptr 8], rcx
mov rax, [rsp+qword ptr 8]
mov g_pFuncPtr, rax
ret
_asm_set_func_ptr ENDP
_asm_func PROC
push RBX
push RBP
push RDI
push RSI
push RSP
push R12
push R13
push R14
push R15
CMP g_pFuncPtr, 0
JE SkipCall
MOV RAX, [ g_pFuncPtr ];
CALL RAX;
SkipCall:
pop RBX
pop RBP
pop RDI
pop RSI
pop RSP
pop R12
pop R13
pop R14
pop R15
ret
_asm_func ENDP
但似乎我在调用_asm_set_func_ptr() 后损坏了堆栈,我也不确定在_asm_func 中如何调用g_pFuncPtr 是否正确?我的代码有什么问题?我正在使用 VS2013 MASM64 构建它。
【问题讨论】: