_malloc 在汇编中到底做了啥?

Posted

技术标签:

【中文标题】_malloc 在汇编中到底做了啥?【英文标题】:What exactly does _malloc do in assembly?_malloc 在汇编中到底做了什么? 【发布时间】:2013-12-28 21:28:01 【问题描述】:
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 字节大的内存块。如果可以分配请求的内存,则返回指向内存块开头的指针。

注意:接收到的内存块的内容没有初始化。

ma​​lloc() 的语法:

void *malloc(size_t size);

参数:

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

返回值:

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

如this CS 301 lecture by Dr. Lawlor中所述:

从汇编语言调用 Malloc

这是一个非常简单的函数:将 BYTES 的数量传递给你 want 作为唯一的参数,在 rdi 中。 “调用malloc。”你会得到一个 指向在 rax 中返回的分配字节的指针。清理空间 之后,将指针复制到 rdi,然后“免费通话”(我要离开了 关闭下面的免费,因为您需要堆栈才能正确执行此操作)。

这是汇编内存访问的完整示例。我打电话给 malloc 获得 40 字节的空间。 malloc 返回 this 的起始地址 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

【讨论】:

x84_64 和 x86 在不同的操作系统上有不同的调用约定,所以这个答案只是切线相关的。例如,在 OP 的情况下,参数显然是在堆栈中传递的,而不是在寄存器中。 你为什么说 x86_64?【参考方案2】:

我想强调另一个很好的答案中没有提到的东西。

malloc 在内部是如何工作的?它在汇编中做了什么来创建所需的内存?

根据this website、malloc和其他内存调用使用操作系统API函数在堆上分配和释放内存。

【讨论】:

以上是关于_malloc 在汇编中到底做了啥?的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向arm 汇编 ( 使用 IDA 解析 arm 架构的动态库文件 | 分析 malloc 函数的 arm 汇编语言 )

Android 逆向arm 汇编 ( 使用 IDA 解析 arm 架构的动态库文件 | 分析 malloc 函数的 arm 汇编语言 )

汇编:没有 malloc 和系统调用的动态内存分配? [FreeDOS 应用程序]

谁能解释这段代码到底做了啥?

mvn install in maven 到底做了啥

在 Mapbox-GL-JS 中 minzoom 和 maxzoom 到底做了啥?