Assembly 如何在x86程序集中的数据段中写入常量
我正在写一个汇编程序(icc作为汇编程序)。我需要在数据部分写入一些常量,以便在主程序中进行rip相对加载,例如以下指令: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在行尾
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
中。