2

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
4

2 に答える 2

7

x64 呼び出し規約の場合、パラメーターがレジスターで渡された場合でも、呼び出し元はスタック上のスペースを節約する必要があります。

パラメータ自体がスタックに格納されていない場合でも、レジスタ パラメータには常に領域が割り当てられることに注意してください。呼び出し先は、そのすべてのパラメーターにスペースが割り当てられていることが保証されます。呼び出された関数が引数リスト (va_list) または個々の引数のアドレスを取得する必要がある場合に備えて、連続した領域を使用できるように、レジスタ引数にはホーム アドレスが必要です。

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

于 2008-12-22T20:41:45.213 に答える
0

正直なところよくわかりませんが、デバッガーでアセンブリをステップ実行してみましたか? 内部ロジックに従えば、何が起こっているのかについての手がかりを発見できるかもしれません。WinDbgをお勧めします。

于 2008-12-22T20:11:21.263 に答える