_malloc在汇编中到底做什么?

woobm2wo  于 2022-12-02  发布在  其他
关注(0)|答案(2)|浏览(328)
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);
t9eec4r0

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寄存器的作用就像一个指针。然后我可以使用通常的程序集括号语法从所指向的内存中读取和写入:

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寄存器进行复制外,您还可以在括号前使用“DWORD”指定要进行的32位内存读写操作,如下所示:

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

z9smfwbn

z9smfwbn2#

我想强调的是,在另一个伟大的答案中没有提到的一些东西。
malloc在内部是如何工作的?它在汇编中做了什么来创建所需的内存?
根据this websitemalloc和其他内存调用使用***操作系统API函数***来分配和释放堆上的内存。

相关问题