【问题标题】:Declaring variable-sized arrays in assembly在汇编中声明可变大小的数组
【发布时间】:2012-01-20 04:55:03
【问题描述】:

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

x = 100;
y = int[x]

例如y 的大小取决于 x 的值。

注意:我在 64 位 Ubuntu 系统上使用 NASM 指令集。

在汇编中我知道数组的大小需要在文件的数据部分中声明,例如

myvariable resq 1000

问题是在我完成之前的计算之前,我不知道它有多大。 我真正想要的是:

mov rax, 100
myvariable resq rax

但这是不允许的,对吧?只是对汇编中的数组访问/声明有些困惑。

任何指针表示赞赏!

【问题讨论】:

标签: arrays assembly x86-64 nasm


【解决方案1】:

只有当您在堆栈上声明数组或使用 malloc 或类似方法从堆中提取内存时,您的 C 示例才有可能。对于较小的值,使用堆栈非常好(而且更快):

mov rax, 100   # 100 elemtents
shl rax, 3     # muliply with 8, the size of an element
sub rsp, rax   # rsp points now 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 point to the return address again

【讨论】:

  • 为什么堆栈更快?你是指“分配”还是“使用”?
  • 分配。 malloc 是一个系统调用,它有一些开销,这可能是不可忽视的(尤其是在多线程的情况下)。使用堆栈需要对寄存器进行两次算术运算,如果使用 红色区域,甚至不需要。
  • 好吧,我以为你的意思是用法。但是,如果分配只发生一次,那么您可能感觉不到差异,因此最好使用malloc,因为如果您不知道rax 的可能值,它会更安全
  • 是的,视情况而定。像问题中的int[x] 这样的东西只能在堆栈上使用,并且 OP 给出了一个值 100 作为示例。
  • 您能澄清一下shl rax, 3line 的作用吗?
猜你喜欢
  • 2012-03-12
  • 2021-09-18
  • 1970-01-01
  • 1970-01-01
  • 2016-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-14
相关资源
最近更新 更多