Assembly 防止产生;BX LR“;在基尔

Assembly 防止产生;BX LR“;在基尔,assembly,compiler-construction,arm,arm7,Assembly,Compiler Construction,Arm,Arm7,如何强制编译器不为返回函数生成“BX LR”。 我还设置了选项--ARM_only(在compiler+assembler+linker中),但这并不有用,我终于在axf文件中找到了这段代码。 我在Keil中的目标设置为ARM7TDMI(我无法将我的目标设置为ARM7或任何其他没有拇指的目标) 那么,我们该如何防止生成“BX LR”?如果目标地址的最低有效位为0,BX将不会切换到Thumb模式。换句话说,它也可以用作常规分支 在ARM7TDMI上,BX LR和例如MOV PC、LR的指令周期时间

如何强制编译器不为返回函数生成“BX LR”。 我还设置了选项--ARM_only(在compiler+assembler+linker中),但这并不有用,我终于在axf文件中找到了这段代码。 我在Keil中的目标设置为ARM7TDMI(我无法将我的目标设置为ARM7或任何其他没有拇指的目标)
那么,我们该如何防止生成“BX LR”?如果目标地址的最低有效位为0,BX将不会切换到Thumb模式。换句话说,它也可以用作常规分支


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

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


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

但如果我们想让编译器生成MOV-PC,Lr,我们该怎么办呢?似乎所有的新编译器都会为函数的返回生成BX LR(在这种情况下,我们可以使用链接器选项将“BX LR”替换为“MOV PC,LR”?选项是什么?我想要一个没有“BX LR”的代码!您发布的链接总结得很好;使用
BX
从函数返回是标准的。(在ARMv4T上)“返回序列必须还原所有保存的寄存器,然后使用bx指令返回调用者”,请参阅)。如果您告诉编译器为ARMv4生成代码,则可能会得到
MOV PC,LR
返回指令(即no
T
)。但问题是,为什么你不想首先使用
BX
?它工作正常,并且大小和速度与
MOV
版本相同。你需要使用开源编译器并修改后端。BX-lr是适用于包括ARMv4T在内的所有内容的正确指令。它将是一个损坏的编译器后端要生成mov pc,lr,如果mov pc,lr正常,则可以节省成本,也就是说,当您在pc上使用ldmia时,您可以保存一条指令。如果您需要bx,则无法使用ldmia和它(can)但如果我们想让编译器生成MOV PC,Lr,我们该怎么办?似乎所有的新编译器都会生成BX Lr以返回函数(这种情况下,我们可以使用链接器选项将“BX Lr”替换为“MOV PC,Lr”?选项是什么?我想要一个没有“BX Lr”的代码“!您发布的链接总结得很好;使用
BX
从函数返回是标准的。(在ARMv4T上,“返回序列必须还原所有保存的寄存器,然后使用BX指令返回调用方”,请参阅)。如果您告诉编译器为ARMv4生成代码(即no
T
),则可能会得到
MOV PC,LR
返回指令。但问题是,为什么你不想首先使用
BX
?它工作正常,并且大小和速度与
MOV
版本相同。你需要使用开源编译器并修改后端。BX-lr是适用于包括ARMv4T在内的所有内容的正确指令。它将是一个损坏的编译器后端要生成mov pc,lr,如果mov pc,lr是可以的,那么您确实可以节省成本,也就是说,当您在pc上使用ldmia时,您可以保存一条指令。如果您需要bx,那么您不能使用ldmia,并且它(可能)会消耗您的额外指令。
bx lr
有什么问题吗?如果这只是一个函数,您可以使用嵌入式汇编(搜索裸函数).BX LR有什么问题?如果这只是一个函数,您可以使用嵌入式程序集(搜索裸函数)。