在汇编语言中声明可变大小的数组

5

我正在编写一个汇编程序,希望它能够执行以下(基本)操作:

x = 100;
y = int[x]

例如,y的大小取决于x的值。
注意:我在64位Ubuntu系统上使用NASM指令集。
在汇编语言中,我知道数组的大小需要在文件的数据部分声明,例如:
myvariable resq 1000

问题是在进行前面的计算之前,我不知道要设置多大。 我真正想要的是像这样的东西:
mov rax, 100
myvariable resq rax

但这是不允许的,对于在汇编语言中使用数组访问/声明有些困惑。

任何指针都将不胜感激!


http://stackoverflow.com/questions/8496633/assembly-reserve-array-space-during-program - n0p
1个回答

3

如果您在堆栈上声明数组或使用malloc或类似方法从堆中提取内存,则可以使用您的C示例。对于小值,使用堆栈是完全可以的(而且更快):

mov rax, 100   # 100 elements
shl rax, 3     # multiply with 8, the size of an element
sub rsp, rax   # rsp now points to your array

# do something with the array
mov rbx, [rsp]    # load array[0] to rbx
mov [rsp+8], rbx  # store to array[1]

add rsp, rax   # rsp points to the return address again

2
分配内存。malloc 是一个系统调用,它有一定的开销,这可能是不可忽略的(特别是在多线程情况下)。使用栈需要对寄存器进行两次算术运算,或者甚至不需要进行运算,如果你利用了“red zone”的话。 - Gunther Piez
是的,像往常一样,这取决于情况。问题中的 int[x] 只能在堆栈上实现,并且 OP 给出了 100 的值作为示例。 - Gunther Piez
你能解释一下shl rax, 3这行代码的作用吗? - Pete Hamilton
谢谢。我需要能够记录多个数组的记录,这可能会使我的堆栈变得非常大,对吗?我想我可能会使用malloc。 - Pete Hamilton
1
通常在使用 alloca/VLA 的函数中,您会将 RBP 设置为框架指针,并通过 mov rsp, rbp(或 leave)恢复堆栈,而不是必须保持 VLA 大小。 - Peter Cordes
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接