为什么malloc会覆盖RSP和RSP + 8?

时间:2008-12-22 19:49:06

标签: windows 64-bit malloc

您可以阅读有关64位调用约定here的信息。 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

2 个答案:

答案 0 :(得分:7)

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

  

请注意,始终会分配空间   对于寄存器参数,即使   参数本身永远不会   归巢;一个被叫者   保证空间已经存在   为其所有参数分配。家   地址是必需的   注册参数使之成为连续的   区域可用以防被叫   功能需要取地址   参数列表(va_list)或   个人论点。

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

答案 1 :(得分:0)

我不确定,但是你是否试过在调试器中单步执行程序集?如果你遵循内部逻辑,你可能会发现一些关于发生了什么的线索。我推荐WinDbg