2008-12-22 102 views
2

你可以閱讀關於64位調用約定here。 x64函數應該自行清理,但是,當我從.asm中調用malloc時,它將覆蓋RSP和RSP + 8處的值。這似乎很錯誤。有什麼建議麼?爲什麼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

沒有任何建議。我像你一樣閱讀它。任何(如果有的話)返回值應該是rax。不應該有任何基於堆棧的參數修改正在進行。好奇。 – 2008-12-22 20:06:51

回答

7

用於x64調用約定,即使參數在調用者必須爲他們保存在堆棧空間的寄存器傳遞:

注意空間總是被分配 爲寄存器參數,即使 參數本身也不會從 回到堆棧;被調用者爲 ,保證已爲其所有參數分配了空間 。首頁 地址所需 寄存器參數,以便連續 區域的情況下,現有的所謂 功能需要採取的 參數列表(va_list的)或 個別參數的地址。

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

+0

因此,如果TestMalloc是一個帶有一個參數的非葉函數,TestMalloc可以假定調用函數已經分配了至少0x20堆棧(因爲0x20>比一個參數所需的空間多),並且TestMalloc只需要分配堆棧if實際上稱爲另一個功能,是嗎? – 2008-12-22 20:53:25

0

我不確定,如實,但你有沒有嘗試在調試器中逐步完成裝配?如果你遵循內部邏輯,你可能會發現一些關於發生了什麼的線索。我建議WinDbg