2

我在 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 错误也会消失;但我不知道为什么。

这是怎么回事?我做错了什么?

4

1 回答 1

0

.lcomm将您的符号隐式放入.bss部分(第 0 小节),无论当前部分或小节是什么。因此,您的符号只是按照它们在源中出现的顺序,这就是为什么knob在单字节变量之后。这也是为什么.balign没有区别,因为这适用于当前(子)部分。

尝试.fill改用。根据我的测试,这似乎有效。

于 2013-03-05T15:41:51.403 回答