我正在使用gas并试图将.lcomm缓冲区对齐16个字节。
代码:
.align 16
.lcomm Buffer, size
但是当使用leal指令检查Buffer的地址时。它似乎没有对齐。我认为.align指令不能正常工作。
你有什么想法吗?
答案 0 :(得分:4)
当然它工作正常,但你错了。 manual says:
某些目标允许第三个参数与.lcomm一起使用。这个 参数指定bss中符号的所需对齐方式 部分。
所以正确的代码是.lcomm Buffer, size, 16
。
请注意,.align
不会影响.lcomm
,尤其是如果您不在.bss
部分。如果您想手动分配内容,请切换到.bss
,然后使用.align
,然后使用.space
而不是.lcomm
进行分配。
此外,manual gives a workaround suggestion为:
对于.lcomm指令(请参阅Lcomm)不接受的目标 alignment参数,大多数ELF目标的情况,.local 指令可以与.comm(请参阅Comm)结合使用来定义 对齐当地的共同数据。
实际上,对于x86 ELF,不支持alignment参数,因此实现此解决方案将如下所示:
.local Buffer
.comm Buffer, size, 16
(感谢@wumpus-q-wumbley指出这一点。)