【问题标题】:Declaring Arrays In x86 Assembly在 x86 程序集中声明数组
【发布时间】:2015-06-15 05:50:57
【问题描述】:

我正在学习组装,我需要制作一个大数组。我查看了如何声明数组,并且遇到了这个问题。

array db 10 dup(?)

声明了 10 个未初始化字节的数组。我试过这个并试图组装它并得到“错误:操作数1之后的逗号”。我意识到'? x86 不支持,所以我将其设为常量并得到相同的错误。我最终这样做了。

array db 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

这行得通!但问题是,我需要大型数组(约 100-400 个整数),而且它们的值并不总是已知的。我可以写出 400 个 0,但我想一定有更简单的方法。那么有没有更好的方式来声明大数组呢?

我正在使用 AT&T 语法的基于 Intel 的 Macbook Pro 上使用 x86_64 程序集。

【问题讨论】:

  • 根据为您工作的array TIMES... 答案,我假设您使用的是nasm(英特尔语法)而不是AT&T 语法?
  • 如果你使用的是 NASM 汇编器,那么 "array db 10 dup(?)" 应该可以正常工作,因为它是完全合法的。
  • @考斯塔夫。不,不是,也许您正在考虑 MASM。 This errors on NASM.

标签: arrays assembly x86 nasm att


【解决方案1】:

the GNU assembler 使用 AT&T 语法。您正在寻找的指令是.fill <count>\[, <data-size>\[, <value>\]\]。 400字节的具体情况:

array:  .fill  400

data-size 默认为1(字节)。我相信填充 400 个字节的 value 默认为零。


如果您实际使用的是 nasm 汇编器(这是 Intel 格式,而不是 AT&T),那么 times 指令将起作用,如 avinash 所示,只要您希望 预定义 中的数据.text.data 部分。但是,如果您需要在.bss 部分(在nasm)中保留字节,您可以使用resb(保留字节)指令:
       setion .bss
       ...
arr1   resb  400             ; Reserve 400 bytes (uninitialized)
arr2   times 400 resb 1      ;  Same thing, using times

【讨论】:

    【解决方案2】:

    您是否尝试过TIMES directive。使用此代码声明给定大小的数组。

    array TIMES 8 DB 0
    

    这将创建一个大小为 8 的数组

    请参阅此link 了解更多信息。

    【讨论】:

    • 是的,dup 是 MASM。
    【解决方案3】:

    这实际上取决于您使用的汇编程序。我使用的是 Netwide 汇编器,以下语法对我来说非常适合

    arr DD 100 DUP(?) ;声明 100 个未初始化的 4 字节字

    【讨论】:

    • 这是 MASM 语法。在 NASM 版本 2.14.02 中测试,正如预期的那样,我得到一个错误:error: comma expected after operand 1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多