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):如何在运行时为变量动态分配内存?的主要内容,如果未能解决你的问题,请参考以下文章
AT&T 语法中的 3 或 4 参数 x86 程序集[重复]
defuse.ca 在线 GAS 汇编器接受 movb 和 movw 的 AT&T 语法,但不接受 movl?