x86汇编中如何在数据段写入常量

How to write constants in the data segment in x86 assembly

我正在编写一个汇编程序(使用 icc 作为汇编器)。我需要在主程序中的 rip 相对加载的数据部分写一些常量,例如下面的指令:

vmovdqu msg(%rip),%ymm0

我现在数据部分是这样写的:

        .data
msg: 0x00000000 0x01000000 0x02000000 0x03000000 0x04000000 0x05000000 0x06000000 0x07000000

然而,汇编器报错:test1.s:140725: 错误:行尾垃圾,第一个无法识别的字符是'0'。

任何人都可以举例说明如何正确格式化此数据部分吗?

这看起来像 GNU 汇编程序 (GAS) 使用的语法。在 x86-64 上,用于组装 32 位整数数据的指令是 .int.long.4byte 中的任何一个(它们是同义词)。 (注意 .long 确实意味着 4 个字节,即使 C 类型 long int 在这个平台上是 8 个字节。)

多个值可以用逗号分隔。

所以你可以这样写

        .data
msg:    .int 0x00000000, 0x01000000, 0x02000000, 0x03000000 # and so on

还可以使用 .byte.word / .2byte.quad / .8byte,用于 8 位、16 位和 64 位整数。

有关详细信息,请参阅 the GAS manual

Peter Cordes 建议的补充评论(谢谢!):

由于这将作为向量加载,您可能希望确保它在 32 字节边界上对齐,这可以通过在 [= 之前​​立即放置 .balign 32 指令来完成20=]标签。

如果这确实是一个常量,不需要在程序的其他地方写,那么最好将它放在 read-only 数据部分,用 .section .rodata 代替.data。如果多个进程同时是您的程序,这将可以将它放在共享内存中 运行,并且如果您尝试错误地编写它,还将确保您得到一个异常。