繁体   English   中英

如何在 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 位整数。

有关详细信息,请参阅GAS 手册

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM