2013-01-13 34 views
0

如何强制编译器不为返回函数生成“BX LR”。 我也设置了选项--ARM_only(在编译器+汇编+链接器),但这是没有用的,我最后在axf文件中有这个代码。 我在Keil中的目标设置为ARM7TDMI(我无法将目标设置为ARM7或没有Thumb的任何其他目标) 因此,我们可以做些什么来防止生成“BX LR”?防止在Keil中生成“BX LR”

+2

“BX LR”有什么问题? – starblue

+0

如果这只适用于一种功能,则可以使用嵌入式装配(搜索裸露功能)。 – auselen

回答

4

BX如果目标地址的最低有效位为0,则不会切换到Thumb模式。换句话说,它也可以用作常规分支。

指令循环时间为BX LR和例如MOV PC,LR在ARM7TDMI上也是相同的(2S + 1N个周期),所以在使用其中一个或另一个的性能方面没有任何优势。

+0

但是,如果想要编译器生成MOV PC,Lr,我们该怎么办?看来所有新的编译器都会生成BX LR来返回函数(http://newsgroups.derkeiler.com/Archive/Comp/comp.sys.arm/2006-04/msg00031.html)。在这种情况下,我们可以使用链接器选项将“BX LR”替换为“MOV PC,LR”?有什么选择?我想要一个没有“BX LR”的代码! – user1973744

+1

你发布的链接总结得非常好;使用'BX'从函数返回是标准的。 (在ARMv4T上“返回序列必须恢复任何保存的寄存器,然后**使用bx指令返回调用者**”,请参阅http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042e /IHI0042E_aapcs.pdf)。如果你告诉编译器为ARMv4生成代码(即没有'T'),你可能会得到一个'MOV PC,LR'返回指令。但问题是,你为什么不首先要“BX”?它工作正常,与'MOV'版本的大小和速度相同。 – Michael

+0

您需要使用开源编译器并修改后端。 bx lr是包含ARMv4T之后的所有内容的正确指令。这将是一个破碎的编译器后端生成mov pc,lr –