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

Jef*_*urs 2 windows malloc 64-bit

您可以在此处阅读有关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
Run Code Online (Sandbox Code Playgroud)

Mic*_*urr 7

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

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

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