gpt4 book ai didi

assembly - 如何在 64 位 NASM 中使用 malloc 和 free?

转载 作者:行者123 更新时间:2023-12-03 22:44:16 25 4
gpt4 key购买 nike

在 64 位 NASM 中,我使用 C 库中的 malloc() 分配了一个 8000 字节的内存块,当我完成它时,我通过调用 free() 来释放它。

我的研究提出了很多关于如何在 64 位 NASM 中执行此操作的相互矛盾的信息,并且大部分信息是 32 位的,其中调用约定不同,或者是 C 或 C++,而不是 NASM。

我认为我的 malloc 部分是正确的,但我不确定免费部分。我发布这个问题是因为我不想测试它并且分配了一个内存块但没有释放。

所以我的两个问题很简单:
(1) 我对 64 位 NASM 有这个权利吗?
(2) Windows 和 Linux 的语法是否相同?

我只展示了我的程序的 malloc 和 free 部分:

extern malloc
extern free

push rdi

; Allocate the memory buffer
mov rdi,8000
call malloc
mov [array_pointer],rax ;array_pointer is initialized in .data

; Code that uses the buffer goes here.

; Free the memory buffer
push rdi
call free
add rsp,8

pop rdi
ret

最佳答案

让我们从 Windows x64 开始。在 malloc 中传递单个整数大小的参数(给 freercx )寄存器并将一个整数返回值放入 rax登记。
基本规则是使用 rcx , rdx , r8 , 和 r9前四个整数参数和任何其他参数的堆栈。非整数参数会使事情稍微复杂一些,但是因为 malloc 中没有这些参数。或 free电话,我不会在这里介绍。如果您需要更多信息,Microsoft 在 X64 Calling Convention 上有一篇很好的文章。 .
因此,用于分配和立即释放 block 的简单代码类似于注释后括号中给出的 AT&T 语法(如果不同):

mov  rcx, 1000          ; Allocate a block (mov $1000, %rcx).
call malloc ; Allocate, address returned in rax.

mov rcx, rax ; Address needed in rcx (mov %rax, %rcx).
call free ; And free it.
请注意,此示例和下面的示例仅说明了寄存器的用法,您还需要考虑其他事项,例如阴影空间和对齐要求。

Linux 使用不同的方法(尽管仍然使用寄存器来提高效率)。它使用 System V AMD64 ABI,在这种情况下,您会发现 rax仍然用于返回值,但 rdi用于论证。
此 ABI 从 { rdi, rsi, rdx, rcx, r8, r9 } 中提取其整数寄存器集。堆栈上传递的任何额外参数。
因此,Linux 的代码更改将相当简单,使用 rdi代替 rcx :
mov  rdi, 1000          ; Allocate a block (mov $1000, %rdi).
call malloc ; Allocate, address returned in rax.

mov rdi, rax ; Address needed in rdi (mov %rax, %rdi).
call free ; And free it.

Raymond Chen( The Old New Thing 名人)有一系列关于调用约定的系列,您可能会觉得有趣,从 here 开始.

关于assembly - 如何在 64 位 NASM 中使用 malloc 和 free?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48672864/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com