3

我还不习惯这整个 64 位的东西,因为我熟悉堆栈中的所有内容。例如,如果我想在 Windows 32 上的程序集中模拟 DllMain,我会这样做:

__declspec(naked) void DllCall_Stub(HMODULE hModule)
{
    _asm
    {
        push 0;
        push 1;
        push [esp + 0Ch]
        mov eax, 0x12345678;        
        call eax;
        ret;
    }
} __declspec(naked) void DllCallStubEnd(void){}

但是,在 Windows 64 上,它显然通过寄存器传递参数。

在 64 位进程上执行此操作的等价物是什么?

4

1 回答 1

3

使用 MSVC 构建时,您需要将汇编代码与 x64 中的 C 代码分开。因为它不再允许内联汇编。在 Windows x64 中,RCX是第一个参数,RDX是第二个,R8R9第三个和第四个,其余的通过堆栈传递。并且您需要为您传递的所有参数分配堆栈,即使是在寄存器上传递的前四个参数。有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/ms235286(v=vs.110).aspx

于 2013-05-29T06:16:29.700 回答