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

Assembly 如何在x86程序集中的数据段中写入常量,assembly,x86,x86-64,gnu-assembler,Assembly,X86,X86 64,Gnu Assembler,我正在写一个汇编程序(icc作为汇编程序)。我需要在数据部分写入一些常量,以便在主程序中进行rip相对加载,例如以下指令: vmovdqu msg(%rip),%ymm0 我现在将数据部分写为: .data msg: 0x00000000 0x01000000 0x02000000 0x03000000 0x04000000 0x05000000 0x06000000 0x07000000 然而,汇编程序给出了一个错误:test1.s:140725:error:junk在行尾

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

vmovdqu msg(%rip),%ymm0
我现在将数据部分写为:

        .data
msg: 0x00000000 0x01000000 0x02000000 0x03000000 0x04000000 0x05000000 0x06000000 0x07000000
然而,汇编程序给出了一个错误:test1.s:140725:error:junk在行尾,第一个无法识别的字符是“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
也可用于8位、16位和64位整数的
.byte
.word/.2byte
.quad/.8byte

有关更多详细信息,请参阅

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

由于这将作为向量加载,您可能希望确保它在32字节边界上对齐,这可以通过将
.balign 32
指令放在
msg:
标签前面来完成


如果这确实是一个常量,并且不需要在程序的其他地方写入,那么最好使用
.section.rodata>代替
.data
将其置于只读数据节中。如果多个进程同时运行您的程序,这将使您能够将其放入共享内存中,并且如果您试图错误地编写它,也将确保您得到异常。

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

多个值可以用逗号分隔

这样你就可以写作了

        .data
msg:    .int 0x00000000, 0x01000000, 0x02000000, 0x03000000 # and so on
也可用于8位、16位和64位整数的
.byte
.word/.2byte
.quad/.8byte

有关更多详细信息,请参阅

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

由于这将作为向量加载,您可能希望确保它在32字节边界上对齐,这可以通过将
.balign 32
指令放在
msg:
标签前面来完成


如果这确实是一个常量,并且不需要在程序的其他地方写入,那么最好使用
.section.rodata>代替
.data
将其置于只读数据节中。如果多个进程同时运行您的程序,这将使您能够将其放入共享内存中,并且如果您试图错误地编写它,也将确保您得到一个异常。

icc是否真的有一个内置的汇编程序,或者它只是将GNU称为?在GNU中组装32位值的语法类似于
.data;msg:.int 0x00000000,0x01000000,…
。这回答了问题,哈哈。Thanks@NateEldredge:如果您使用
-s
(或GNU.intel\u语法)请求,则ICC的asm输出为GAS语法。如果它像clang一样有一个内置的汇编程序,它会使用兼容的语法。如果你不需要修改这些常量,那么它们就不需要在
.data
段中。您可以将它们放在
.rodata
部分,与编译器的位置相同。RIP相对寻址可用于访问
.text
.data
。和
.rodata
以及程序中的大多数其他段。icc是否真的有内置汇编程序,或者只是将GNU称为?在GNU中组装32位值的语法类似于
.data;msg:.int 0x00000000,0x01000000,…
。这回答了问题,哈哈。Thanks@NateEldredge:如果您使用
-s
(或GNU.intel\u语法)请求,则ICC的asm输出为GAS语法。如果它像clang一样有一个内置的汇编程序,它会使用兼容的语法。如果你不需要修改这些常量,那么它们就不需要在
.data
段中。您可以将它们放在
.rodata
部分,与编译器的位置相同。RIP相对寻址可用于访问
.text
.data
。和
.rodata
以及程序中的大多数其他部分。如果你要写一个答案,我建议在标签之前使用
.balign 32
,这样向量加载肯定不会是缓存线或页面分割。正如@Ross在问题中指出的,常量应该放在
.rodata
中。如果你要写一个答案,我建议在标签前使用
.balign 32
,这样向量加载肯定不会是缓存线或页面分割。正如@Ross在这个问题上指出的那样,常量应该放在
.rodata
中。