我正在编写一个汇编程序(使用 icc 作为汇编器)。我需要在数据部分编写一些常量,以便在主程序中进行相对加载,例如以下指令:
vmovdqu msg(%rip),%ymm0
我现在将数据部分写成这样:
.data
msg: 0x00000000 0x01000000 0x02000000 0x03000000 0x04000000 0x05000000 0x06000000 0x07000000
然而,汇编器给出了一个错误: test1.s:140725: Error: junk at end of line, first unrecognized character is ‘0’。
有人能给我一个如何正确格式化此数据部分的示例吗?
这看起来像 GNU 汇编器 (GAS) 使用的语法。在 x86-64 上,用于组装 32 位整数数据的指令是以下任意一个:.int
, .long
or .4byte
(它们是同义词)。 (笔记.long
即使 C 类型也意味着 4 个字节long int
在这个平台上是8字节。)
多个值可以用逗号分隔。
所以你可以写
.data
msg: .int 0x00000000, 0x01000000, 0x02000000, 0x03000000 # and so on
还可以使用的是.byte
, .word / .2byte
, and .quad / .8byte
对于 8 位、16 位和 64 位整数。
See 气体手册 https://sourceware.org/binutils/docs/as/更多细节。
Peter Cordes 建议的其他评论(谢谢!):
由于这将作为向量加载,您可能希望确保它在 32 字节边界上对齐,这可以通过放置.balign 32
紧接在指令之前msg:
label.
如果这确实是一个常量并且不需要在程序中的其他位置写入,那么最好将其放置在只读数据部分中,方法是使用.section .rodata
代替.data
。如果多个进程同时运行您的程序,这将使得可以将其放置在共享内存中,并且如果您尝试错误地编写它,还可以确保您得到异常。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)