我在TI MCU(msp430)上使用gnu彙編程序,並且想要在程序集中定義混合對齊的變量;一些是字節對齊的,另一些必須是字(16位)對齊。我還需要將某些變量保留爲彙編語言模塊的私有變量,以及其他常見變量(全局變量)。所以,我想給我們.lcomm - 作爲默認值,然後在適當的時候使用.global覆蓋它。如何在gnu彙編程序中獲得分段填充
但即使在應用字節對齊的指令,我是一個GCC編譯的程序的鏈接中獲得對齊錯誤後:
ssegLED.c:200:危險的搬遷:對齊地址
這行只是試圖訪問被認爲是字對齊的數據:
如果(旋鈕){...}
在彙編語言模塊引起的問題,我想有效地使數據包到內存;所以我想使用小節將各種數據組合在一起,以便在不同對齊的數據之間形成空洞。例如:我希望在默認子部分(0)中使用的所有字對齊的數據,但希望在第1部分使用。
下面是用於定義四個變量的組合/ .s代碼:keystroke,quadrature,keystate,和旋鈕。前三個字節對齊,最後一個字對齊。
.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,quadrature和keystate;以便整個小節以單詞邊界結尾;但由於違規分部的編號較小(0),第(1)小節的對齊方式應該沒有任何影響。其次,如果我將.lcomm全部更改爲.comm,則錯誤也會消失;但我不知道爲什麼。
這是怎麼回事?我做錯了什麼?
的確的確是......沒有證據的行爲。奇怪的是,填充甚至可以在拒絕數據的部分上工作。但是,它似乎起作用 - 總體而言,這看起來像是「as」設計或文檔中的錯誤。我不確定如何報告 - 但我認爲我現在只是製作一個宏來使用.fill,如果問題得到解決,可以輕鬆更改。謝謝。 :) – user2133679 2013-03-13 00:36:00
一切都記錄在案,我說。你可以使用'。如果您認爲這更具可讀性,請跳過'指令。除了有多個指令做同樣的事情之外,我在GAS中看不到任何問題。也許我沒有足夠清楚地解釋這種情況。 – Jester 2013-03-13 02:01:22