在x86程序集中声明数组

CMi*_*lby 6 arrays x86 assembly

我正在学习装配,我需要制作一个大型阵列.我已经看过如何声明数组,我遇到过这个问题.

array db 10 dup(?)
Run Code Online (Sandbox Code Playgroud)

声明了10个未初始化字节的数组.我尝试了这个并尝试组装它并获得"错误:操作数1后预期的逗号".我意识到'?' 在x86中不支持,因此我将其设为常量并得到了相同的错误.我最终这样做了.

array db 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Run Code Online (Sandbox Code Playgroud)

这有效!但问题是,我需要大型数组(~100-400整数),并且它们的值并不总是已知.我可以写出400 0,但我认为必须有一个更简单的方法.那么有更好的方法来声明大型数组吗?

我在具有AT&T语法的基于Intel的Macbook Pro上使用x86_64汇编.

lur*_*ker 8

GNU汇编程序使用AT&T语法.你正在寻找的指令是.fill <count>\[, <data-size>\[, <value>\]\].在400字节的特定情况下:

array:  .fill  400
Run Code Online (Sandbox Code Playgroud)

data-size默认为1(字节).我相信value这会将400字节的默认值填充为零.


如果您实际使用的是nasm汇编程序(英特尔格式,而不是AT&T),那么times只要您想要在或部分中预定义数据,该指令就可以正常工作.但是,如果您需要在(in )部分中保留字节,则可以使用(保留字节)指令:.text.data.bssnasmresb

       setion .bss
       ...
arr1   resb  400             ; Reserve 400 bytes (uninitialized)
arr2   times 400 resb 1      ;  Same thing, using times
Run Code Online (Sandbox Code Playgroud)


avi*_*dey 6

你试过吗.使用TIMES directive这段代码来声明一个大小为10的数组

array TIMES 8 DB 0
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅此链接.