x86 程序集 (AT&T):如何在运行时为变量动态分配内存?
x86 Assembly (AT&T): How do I dynamically allocate memory to a variable at runtime?
我试图在运行时将一定数量的 space 分配给一个变量。我知道我可以在编译时将恒定数量的 space 分配给一个变量,例如:
.data
variable: # Allocate 100 bytes for data
.space 100
但是,如何在运行时将可变数量的 space 分配给变量?例如,在运行时将 space 的 %eax
字节分配给变量?
您不能动态分配静态存储。您需要使用堆栈或 malloc / mmap / 其他(有时称为“堆”)。 (除非你只是在 .bss
中创建一个巨大的数组,你应该把它而不是 .data
放在那里,并且只使用你需要的数量。内核的惰性内存分配可以做到这一点。)
你可以在静态存储中保留一个指针,就像Cstatic int *p;
一样,但是你每次访问它时都需要经过额外的间接层。
堆栈上的 variable-sized 分配是编译器为 alloca
或 C99 variable-length 数组所做的。查看编译器输出,了解它们如何将分配大小四舍五入到 16 的倍数以保持堆栈对齐。 (以及他们如何相对于堆栈指针的新值寻址该存储。)
我试图在运行时将一定数量的 space 分配给一个变量。我知道我可以在编译时将恒定数量的 space 分配给一个变量,例如:
.data
variable: # Allocate 100 bytes for data
.space 100
但是,如何在运行时将可变数量的 space 分配给变量?例如,在运行时将 space 的 %eax
字节分配给变量?
您不能动态分配静态存储。您需要使用堆栈或 malloc / mmap / 其他(有时称为“堆”)。 (除非你只是在 .bss
中创建一个巨大的数组,你应该把它而不是 .data
放在那里,并且只使用你需要的数量。内核的惰性内存分配可以做到这一点。)
你可以在静态存储中保留一个指针,就像Cstatic int *p;
一样,但是你每次访问它时都需要经过额外的间接层。
堆栈上的 variable-sized 分配是编译器为 alloca
或 C99 variable-length 数组所做的。查看编译器输出,了解它们如何将分配大小四舍五入到 16 的倍数以保持堆栈对齐。 (以及他们如何相对于堆栈指针的新值寻址该存储。)