_malloc在assembly中到底做了什么?

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); 

函数malloc()将分配一个size字节大的内存块。 如果可以分配所请求的存储器,则将指针返回到存储器块的开头。

注意:未初始化接收的内存块的内容。

malloc()的语法:

void * malloc(size_t size);

参数:

内存块的大小(以字节为单位)。

返回值:

如果请求成功,则返回指向内存块的指针。 如果函数未能分配所请求的内存块,则返回NULL,也可以通过成功调用大小为零的malloc()返回NULL。

正如Lawlor博士在CS 301讲座中所述 :

从汇编语言调用Malloc

这是一个非常简单的function:在rdi中传递你想要的BYTES数量作为唯一参数。 “打电话给malloc。” 您将获得指向rax中返回的已分配字节的指针。 要事后清理空间,将指针复制到rdi,然后“免费调用”(我在下面留下免费的,因为你需要堆栈才能正确完成)。

这是汇编内存访问的完整示例。 我调用malloc来获取40个字节的空间。 malloc在rax(64位版本的eax)中返回此空间的起始地址。 也就是说,rax寄存器就像一个指针。 然后我可以使用通常的汇编括号语法从指向内存中读取和写入:

 mov edi, 40; malloc's 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 

您可以指定要使用括号前面的“DWORD”进行32位内存写入和读取,而不是通过ecx寄存器进行复制,如下所示:

 mov edi, 40; malloc's 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