2012-07-17 115 views
3

我想在我的彙編代碼中混合使用ARM和THUMB指令。例如,在下面的代碼我嘗試使用這兩種模式:當我編譯這個代碼混合ARM和THUMB指令

.thumb @ .code 16 
.section __TEXT,__text 
.globl mySymbol1 
mySymbol1: 
.... 
.arm @ .code 32 
.section __TEXT,__text 
.globl mySymbol2 
mySymbol2: 
... 

現在,按我的理解到庫中,並通過納米運行它,mysymbol1應該顯示爲手臂和mysymbol2應顯示爲拇指,即,

0000xxxx (__TEXT,__text) external mySymbol1 
0000yyyy (__TEXT,__text) external [Thumb] mySymbol2 

但都顯示爲手臂。我在這裏錯過了什麼?我的彙編指令是:

as -arch armv7 -o a.o a.s 

回答

3

需要.thumb_func拇指標籤之前,他們是拇指的目標,否則GNU工具將把它作爲一個手臂的目標。 (是的,你需要.thumb一次和.thumb_func爲你想用作拇指目標的每個標籤)。很多例子http://github.com/dwelch67

+0

謝謝,這是做到了。你知道這是爲什麼嗎?也可以拇指目標不是一個功能?那麼會發生什麼? – user1165084 2012-07-20 08:54:49

+3

是的,分支交換(BX)用於切換模式,在其他一些地方,地址的lsbit指示邏輯該地址是拇指地址還是手臂地址,指示模式切換或保持不變。爲了讓gnu彙編程序產生正確的地址,allthough愚蠢,因爲氣體已經知道模式,你必須使用thumb_func。我把它稱爲一個錯誤,但無論它是什麼。其他工具無疑有其自身的細微差別。 (氣體喜歡把彙編語言搞亂,只要它不能只是武裝) – 2012-07-20 13:48:30

+0

讓gnu工具走兩條路是可能的,一種方法比另一種方式更容易,我給這個主題的其他人一個很長的回答,加上一些例子,必須爲此搜索。有一個命令行開關告訴gnu工具準備在模式之間來回切換。儘管幾乎不斷的手臂編程我很少需要它,所以我沒有記住它。 – 2012-07-20 13:50:07