2

您可以在此处阅读有关 64 位调用约定的信息。x64 函数应该自行清理,但是,当我从 .asm 调用 malloc 时,它会覆盖 RSP 和 RSP+8 处的值。这似乎非常错误。有什么建议么?

public TestMalloc

extern malloc : near

.CODE

align 8
TestMalloc proc
    mov rcx, 100h
    000000018000BDB8 48 C7 C1 00 01 00 00   mov         rcx,100h 

    call malloc
    000000018000BDBF E8 CC AC 06 00         call        malloc (180076A90h) 

    ret
    000000018000BDC4 C3                     ret              
    000000018000BDC5 66 66 90               xchg        ax,ax 
TestMalloc endp

END
4

2 回答 2

7

对于 x64 调用约定,即使参数在寄存器中传递,调用者也需要在堆栈上为它们节省空间:

请注意,总是为寄存器参数分配空间,即使参数本身从未归入堆栈;被调用者保证已为其所有参数分配空间。寄存器参数需要本地地址,因此如果调用的函数需要获取参数列表 (va_list) 或单个参数的地址,则可以使用连续区域。

http://msdn.microsoft.com/en-us/library/ew5tede7.aspx

于 2008-12-22T20:41:45.213 回答
0

老实说,我不确定,但是您是否尝试过在调试器中单步执行程序集?如果您遵循内部逻辑,您可能会发现一些关于正在发生的事情的线索。我推荐WinDbg

于 2008-12-22T20:11:21.263 回答