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);
2条答案
按热度按时间t9eec4r01#
函数malloc()将分配一个
size
字节大小的内存块。如果可以分配所请求的内存,则返回一个指向内存块开头的指针。注意:接收到的内存块的内容未初始化。
malloc()的语法:
void *malloc(大小_t大小);
参数:
内存块的大小(以字节为单位)。
返回值:
如果请求成功,则返回一个指向内存块的指针。如果函数未能分配所请求的内存块,则返回NULL。如果成功调用大小为零的
malloc()
,也可能返回NULL。如this CS 301 lecture by Dr. Lawlor中所述:
从汇编语言调用Malloc
这是一个非常简单的函数:在rdi中传递你想要的 BYTES 的数目作为唯一的参数。“call malloc”。你将得到一个指向rax中返回的分配字节的指针。之后要清理空间,将指针复制到rdi,然后“call free”(我将省略下面的free,因为你需要堆栈来正确地做这件事)。
下面是一个完整的程序集内存访问的例子。我调用malloc来获得40字节的空间。malloc返回这个空间在rax(eax的64位版本)中的起始地址。也就是说,rax寄存器的作用就像一个指针。然后我可以使用通常的程序集括号语法从所指向的内存中读取和写入:
除了通过ecx寄存器进行复制外,您还可以在括号前使用“DWORD”指定要进行的32位内存读写操作,如下所示:
对于汇编语言中的malloc..请参见此链接malloc
z9smfwbn2#
我想强调的是,在另一个伟大的答案中没有提到的一些东西。
malloc
在内部是如何工作的?它在汇编中做了什么来创建所需的内存?根据this website,
malloc
和其他内存调用使用***操作系统API函数***来分配和释放堆上的内存。