Почему malloc перезаписывает RSP и RSP + 8? - PullRequest
2 голосов
/ 22 декабря 2008

Вы можете прочитать о 64-битном соглашении о вызовах здесь . Предполагается, что функции x64 убираются после себя, но когда я вызываю malloc из .asm, он перезаписывает значение в 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

Ответы [ 2 ]

7 голосов
/ 22 декабря 2008

В соответствии с соглашением о вызовах x64, даже если параметры передаются в регистрах, вызывающая сторона должна сохранить для них место в стеке:

Обратите внимание, что место всегда выделяется для параметров регистра, даже если сами параметры никогда не бывают размещены в стек; вызываемый гарантировано, что пространство было выделяется по всем его параметрам. Главная адреса требуются для зарегистрировать аргументы так непрерывно область доступна в случае, если вызываемый функция должна принимать адрес список аргументов (va_list) или индивидуальный аргумент.

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

0 голосов
/ 22 декабря 2008

Честно говоря, я не уверен, но вы пробовали проходить сборку в отладчике? Если вы будете следовать внутренней логике, вы можете найти некоторые подсказки относительно того, что происходит. Я рекомендую WinDbg .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...