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
。如果多个进程同时是您的程序,这将可以将它放在共享内存中 运行,并且如果您尝试错误地编写它,还将确保您得到一个异常。
我正在编写一个汇编程序(使用 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
。如果多个进程同时是您的程序,这将可以将它放在共享内存中 运行,并且如果您尝试错误地编写它,还将确保您得到一个异常。