我在 TI MCU (msp430) 上使用 gnu 汇编器,想在汇编中定义混合对齐的变量;有些是字节对齐的,有些则必须是字(16 位)对齐的。我还需要将一些变量保留为汇编语言模块的私有变量,而其他变量则是通用的(全局变量)。所以,我希望我们 .lcomm 作为默认值,然后在适当的时候使用 .global 覆盖它。
但即使在应用了字节对齐指令之后,在链接 GCC 编译程序期间我也会遇到对齐错误:
ssegLED.c:200:危险重定位:未对齐的地址
而那行只是试图访问应该是字对齐的数据:
如果(旋钮){ ... }
在导致问题的汇编语言模块中,我试图将数据有效地打包到内存中;所以我想使用小节将类似类型的数据分组在一起,这样就不会在不同对齐的数据之间形成漏洞。例如:我想要在默认小节 (0) 中的所有字对齐数据,但未对齐的数据,我想要在小节 1 中。
这是用于定义四个变量的程序集/.s 代码:击键、正交、键状态和旋钮。前三个是字节对齐的,最后一个是字对齐的。
.section .bss ;; doesn't matter if .bss or .section .bss -- same err.
.subsection 1
.balign 1 ;; can add a ,0 -- but it changes nothing
.global keystroke
.type keystroke,@object
.size keystroke,1 ;; Tried with and without this line, no change...
.lcomm keystroke,1
.lcomm quadrature,1
.lcomm keystate,1
.section .bss
.subsection 0
.balign 2 ;; tried adding ,0 -- but it fixes nothing
.global knob ;; Present knob value
.type knob, @object
.size knob, 2 ;; doesn't affect error whether commented out/not
.lcomm knob, 2
现在,我正在做两件事来防止错位问题;根据 GNU AS 手册,第 0 小节应该放在第 1 小节之前的内存中;因此第 0 节自动开始单词对齐作为默认节;其次,我明确地使用了 .balign 指令。
但它不起作用......并且更改为 .b2align 并不能解决它,等等。
我可以通过将另一个字节对齐变量显式添加到第 1 小节变量 keystroke、quadature 和 keystate 来消除错误;使整个小节以单词边界结束;但是由于违规小节的数字较小(0),因此小节(1)的对齐应该没有任何效果....
其次,如果我将所有 .lcomm 更改为 .comm 错误也会消失;但我不知道为什么。
这是怎么回事?我做错了什么?