2013-03-05 101 views
2

我在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,則錯誤也會消失;但我不知道爲什麼。

這是怎麼回事?我做錯了什麼?

回答

0

.lcomm隱含地將您的符號放入.bss部分(第0小節),不管當前部分或子部分是什麼。因此,您的符號只是按照它們出現在源代碼中的順序排列,這就是爲什麼在單字節變量之後出現knob。這也是爲什麼.balign沒有什麼區別,因爲它適用於當前(子)部分。

嘗試使用.fill代替。根據我的測試,似乎工作。

+0

的確的確是......沒有證據的行爲。奇怪的是,填充甚至可以在拒絕數據的部分上工作。但是,它似乎起作用 - 總體而言,這看起來像是「as」設計或文檔中的錯誤。我不確定如何報告 - 但我認爲我現在只是製作一個宏來使用.fill,如果問題得到解決,可以輕鬆更改。謝謝。 :) – user2133679 2013-03-13 00:36:00

+0

一切都記錄在案,我說。你可以使用'。如果您認爲這更具可讀性,請跳過'指令。除了有多個指令做同樣的事情之外,我在GAS中看不到任何問題。也許我沒有足夠清楚地解釋這種情況。 – Jester 2013-03-13 02:01:22