您可以在此处阅读有关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
Michael Burr.. 7
对于x64调用约定,即使参数在寄存器中传递,调用者也需要在堆栈上为它们节省空间:
注意,总是为寄存器参数分配空间,即使参数本身从不归位到堆栈; 确保被调用者已为其所有参数分配了空间.寄存器参数需要归属地址,因此如果被调用函数需要获取参数列表(va_list)的地址或单个参数,则可以使用连续区域.
http://msdn.microsoft.com/en-us/library/ew5tede7.aspx
对于x64调用约定,即使参数在寄存器中传递,调用者也需要在堆栈上为它们节省空间:
注意,总是为寄存器参数分配空间,即使参数本身从不归位到堆栈; 确保被调用者已为其所有参数分配了空间.寄存器参数需要归属地址,因此如果被调用函数需要获取参数列表(va_list)的地址或单个参数,则可以使用连续区域.
http://msdn.microsoft.com/en-us/library/ew5tede7.aspx