如何在x86程序集中的数据段中写入常量

问题描述

我正在编写一个汇编程序(以icc作为汇编程序)。我需要在数据部分中编写一些常量,以便在主程序中进行相对加载,例如以下指令:

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中的任何一个(它们是同义词)。 (请注意,即使C类型.long在此平台上为8个字节,long int也确实意味着4个字节。)

多个值可以用逗号分隔。

所以你可以写

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

对于8位,16位和64位整数,.byte.word / .2byte.quad / .8byte也可用。

有关更多详细信息,请参见the GAS manual

Peter Cordes建议的其他评论(谢谢!):

由于此代码将作为向量加载,因此您可能要确保它在32字节的边界上对齐,这可以通过在{{1}之前紧跟着放置.balign 32指令来完成。 }标签。

如果这确实是一个常量,不需要在程序中的其他位置编写,那么最好使用msg:代替{{1}将其放置在只读数据部分中。 }。如果多个进程同时运行您的程序,则可以将其放置在共享内存中,如果尝试错误编写它,还可以确保获得异常。