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);
答案 0 :(得分:17)
函数malloc()将分配一个size
字节大的内存块。如果可以分配所请求的内存,则将指针返回到内存块的开头。
注意:未初始化收到的内存块的内容。
malloc()的语法:
void * malloc(size_t size);
<强>参数:强>
内存块的大小(以字节为单位)。
返回值
如果请求成功,则返回指向内存块的指针。
如果函数未能分配请求的内存块,则返回NULL,成功调用大小为malloc()
时也可返回NULL。
如this CS 301 lecture by Dr. Lawlor中所述:
从汇编语言调用Malloc
这是一个非常简单的功能:传递 BYTES 的数量 想要作为唯一的参数,在rdi中。 “打电话给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
您可以指定您想要的,而不是通过ecx寄存器进行复制 32位存储器使用括号前面的“DWORD”进行写入和读取, 像这样:
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
答案 1 :(得分:0)
我想强调其他好答案中未提及的内容。
malloc
在内部如何工作?在组装中如何创建所需的内存?
根据this website,malloc
和其他内存调用,使用 操作系统API函数 在堆上分配和释放内存。 / p>