[英]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 位整数。
有关详细信息,请参阅GAS 手册。
Peter Cordes 建议的其他评论(谢谢!):
由于这将作为向量加载,您可能希望确保它在 32 字节边界上对齐,这可以通过在msg:
标签之前放置一个.balign 32
指令来完成。
如果这确实是一个常量并且不需要在程序的其他地方写入,那么最好将它放在只读数据部分,使用.section .rodata
代替.data
。 如果多个进程同时运行您的程序,这将使它可以将它放在共享内存中,并且如果您尝试错误地编写它,也将确保您得到一个异常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.