2012-07-17 114 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