在ARMv7上,它的拇指能力,它是正确的,我们可以避免所有的贴面使用BX指令?
既然这个指令需要32位寄存器,那么我们还好吗?
如果是的话,当我在生成的代码中看到贴面时,我应该为我的机器专门化输出,对吗?
谢谢
发布于 2016-09-14 00:20:44
是的,因为BX采用32位寄存器,所以不需要使用veener,因为您可以覆盖整个寻址空间。
当然,您需要将32位值加载到寄存器中,这通常意味着常量池,所以如果您希望从寄存器中挤出每一个周期,并且您的程序不太大,那么使用相对分支会更好。正如@ notes所指出的,如果您在寄存器中还没有地址,那么在只使用BX (除非您需要支持ARMv4T互操作)的情况下,使用ARMv4T是没有意义的。
相对的,非条件的,32位的拇指分支有一个24位的寻址空间,所以你可以达到+/- 16 32(其他人见这里)。如果你在做ELF,要小心使用16位的相对拇指分支。32位分支将生成24位重定位,如果目标不能用24位进行寻址,链接器将插入一个veener。一个16位的分支会生成一个11位的重定位,小精灵换手臂指定链接器是而不是来为这些分支生成veener,所以您可能会冒出链接超时分支的风险。
https://stackoverflow.com/questions/39477993
复制相似问题