在 x86 程序集中声明数组

Declaring Arrays In x86 Assembly

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

array db 10 dup(?)

其中声明了一个包含 10 个未初始化字节的数组。我尝试了这个并尝试 assemble 它并得到 "error: comma expected after operand 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 程序集。

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

array TIMES 8 DB 0

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

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

the GNU assembler. The directive you're looking for is .fill <count>\[, <data-size>\[, <value>\]\] 使用 AT&T 语法。在 400 字节的特定情况下:

array:  .fill  400

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


如果您实际上使用的是 nasm 汇编程序(Intel 格式,而不是 AT&T),那么 times 指令将起作用,正如 avinash 指出的那样,只要您想要 predefine .text.data 部分中的数据。但是,如果需要在.bss段(在nasm中)保留字节,可以使用resb(保留字节)指令:

       setion .bss
       ...
arr1   resb  400             ; Reserve 400 bytes (uninitialized)
arr2   times 400 resb 1      ;  Same thing, using times

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

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