GNU彙編器——.syntax

1 從一個彙編錯誤說起

從u-boot移植了一些代碼,在編譯時GNU彙編器報告了一些錯誤:

Error: bad instruction `movsne r3,r3,lsr#4'
Error: bad instruction `subsge r2,r2,#4'
Error: bad instruction `movsne r2,r2,lsr#4'
Error: bad instruction `subsge r2,r2,#4'

錯誤本身並不難懂,說的是彙編器不認識上述指令。然而,讓人不解的是,上述的幾條指令完全是合法的ARM指令,彙編器怎麼不認識呢?折騰了好一會兒才知道這和GNU彙編器的.syntax命令有關,下文就簡單介紹一下這個命令。

2 .syntax的用法

.syntax命令是ARM架構獨有的命令,用法很簡單.syntax [unified | divided]。作用是在彙編ARM彙編源時,指定按照怎樣的語法規則進行彙編。如果在編寫彙編語言時不使用該命令指定語法規則,那麼默認採用.syntax divided,此時使用舊的彙編風格,ARM和THUMB指令有着各自的語法。正是在這種情況下,彙編器報了第1節中所說的錯誤,可能是指令採用了新的彙編風格,和舊的不兼容。

使用.syntax unified時,ARM和THUMB指令使用統一的語法,有着以下的主要特性:

  • 立即數不需要#前綴
  • 可能會出現IT指令,如果出現,則根據後面的條件碼進行驗證。在ARM模式下,它不會生成機器碼,而在THUMB模式下則會生成機器碼
  • 對於ARM指令,條件碼總是出現在指令的最後;對於THUMB指令,條件碼可以被使用,但僅限於IT指令的範圍內
  • V6T2架構(及更高版本)的所有新指令都可用(這些指令中,divided語法僅支持少部分)
  • 支持.N和.W後綴

在添加了.syntax unified後,彙編器不再報錯。

參考文獻

[1] GNU的官方文檔

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章