x86 汇编 (AT&T):如何在运行时为变量动态分配内存?

Posted

技术标签:

【中文标题】x86 汇编 (AT&T):如何在运行时为变量动态分配内存?【英文标题】:x86 Assembly (AT&T): How do I dynamically allocate memory to a variable at runtime? 【发布时间】:2021-02-19 18:43:24 【问题描述】:

我试图在运行时为变量分配一定量的空间。我知道我可以在编译时为变量分配恒定数量的空间,例如:

.data
    variable: # Allocate 100 bytes for data
        .space 100

但是,如何在运行时为变量分配可变数量的空间?比如在运行时给变量分配%eax字节空间?

【问题讨论】:

不能动态分配静态存储。您需要使用堆栈或 malloc / mmap / 其他。 (除非你只是在.bss 中创建一个巨大的数组,否则你应该把它而不是.data 放在那里,并且只使用你需要的任何数量。内核的延迟内存分配可以做到这一点。) @PeterCordes 换句话说,将堆栈指针向下推我要分配给变量的数据量?我如何将数据插入堆栈中新分配的空间,然后知道如何检索它以供以后使用? 【参考方案1】:

您不能动态分配静态存储。您需要使用堆栈,或 malloc / mmap / 任何东西(有时称为“堆”)。 (除非您只是在 .bss 中创建一个巨大的数组,否则您应该将其放置在其中而不是 .data,并且只使用您需要的数量。内核的延迟内存分配可以做到这一点。)

您可以在静态存储中保留一个指针,例如 C static int *p;,但是每次访问它时都需要经过额外的间接层。

堆栈上的可变大小分配是编译器为alloca 或C99 可变长度数组所做的。查看编译器输出,了解它们如何将分配大小四舍五入到 16 的倍数以保持堆栈对齐。 (以及他们如何处理相对于堆栈指针的新值的存储。)

【讨论】:

以上是关于x86 汇编 (AT&T):如何在运行时为变量动态分配内存?的主要内容,如果未能解决你的问题,请参考以下文章

x86汇编程序基础(AT&T语法)

AT&T 语法中的 3 或 4 参数 x86 程序集[重复]

内核基础---AT&T汇编与x86汇编的区别

defuse.ca 在线 GAS 汇编器接受 movb 和 movw 的 AT&T 语法,但不接受 movl?

x86 程序集:“subl”命令如何在 AT&T 语法中工作

AT&T汇编学习笔记