您可以阅读有关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
答案 0 :(得分:7)
对于x64调用约定,即使参数在寄存器中传递,调用者也需要在堆栈中为它们节省空间:
请注意,始终会分配空间 对于寄存器参数,即使 参数本身永远不会 归巢;一个被叫者 保证空间已经存在 为其所有参数分配。家 地址是必需的 注册参数使之成为连续的 区域可用以防被叫 功能需要取地址 参数列表(va_list)或 个人论点。
答案 1 :(得分:0)
我不确定,但是你是否试过在调试器中单步执行程序集?如果你遵循内部逻辑,你可能会发现一些关于发生了什么的线索。我推荐WinDbg。