Что именно делает _malloc в сборке?

public main
main proc near
push    ebp
mov     ebp, esp
and     esp, 0FFFFFFF0h
sub     esp, 30h
mov     dword ptr [esp], 8 ; size
call    _malloc
mov     [esp+2Ch], eax
mov     dword ptr [esp+4], 4
mov     eax, [esp+2Ch]
mov     [esp], eax
call    __start

Приведенный выше код представляет собой часть большого проекта, над которым я работаю. Я пытаюсь изменить этот код на эквивалент C, но мне трудно понять, как работает malloc.

Я считаю, что 8 байтов будут размером выделенной памяти; однако я не уверен в этой строке.

mov      eax, [esp+2ch] 

Что делает malloc для eax?

Кроме того, это будет эквивалентный C-код?

int main(void)
{
int *ptr1;
ptr1 = (int *)malloc(sizeof(8));
*ptr1 = 4;
__start(*ptr1);

Ответ 1

Функция malloc() будет выделять блок памяти размером size bytes. Если запрошенная память может быть выделена, то указатель возвращается в начало блока памяти.

Примечание: содержимое принятого блока памяти не инициализируется.

Синтаксис malloc():

void * malloc (size_t size);

Параметры:

Размер блока памяти в байтах.

Возвращаемое значение:

Если запрос успешный, возвращается указатель на блок памяти. Если функции не удалось выделить запрошенный блок памяти, возвращается NULL, NULL также может быть возвращен успешным вызовом malloc() с размером нуля.

Как указано в эта лекция CS 301 доктора Лоурола:

Вызов Malloc с языка сборки

Это довольно простая функция: передайте количество BYTES вы хотите как единственный параметр, в rdi. msgstr "вызвать malloc." Вы вернетесь указатель на выделенные байты, возвращенные в rax. Очистить пространство затем скопируйте указатель на rdi и "позвоните бесплатно" (я ухожу от бесплатного ниже, потому что вам нужен стек, чтобы сделать это правильно).

Здесь приведен полный пример доступа к сборке. Я называю malloc получить 40 байт пространства. malloc возвращает начальный адрес этого пространство в rax (64-разрядная версия eax). То есть, регистратор rax действует как указатель. Затем я могу читать и писать с указана на память с использованием обычного синтаксиса монтажной скобы:

mov edi, 40; malloc first (and only) parameter: number of bytes to allocate
extern malloc
call malloc
; on return, rax points to our newly-allocated memory
mov ecx,7; set up a constant
mov [rax],ecx; write it into memory
mov edx,[rax]; read it back from memory
mov eax,edx; copy into return value register
ret

Вместо копирования через регистр ecx вы можете указать, что вы хотите 32-разрядная память записывает и считывает с помощью "DWORD" перед скобками, например:

mov edi, 40; malloc first (and only) parameter: number of bytes to allocate
extern malloc
call malloc
; on return, rax points to our newly-allocated memory
mov DWORD [rax],7; write constant into memory
mov eax,DWORD [rax]; read it back from memory
ret

для malloc в языке ассемблера.. вот эта ссылка malloc