自动对每510条指令进行LTORG

时间:2018-04-08 06:22:04

标签: gcc arm gas armv6

我有一个强大的代码段,可以充分利用常量池。我知道通过这样做,我必须LTORG至少每511条指令(PC相对寻址限制为4k,指令为4字节,并且寻址被签名,因此绝对距离小于一半)以确保常数池足够接近它们的用途。

当然,我可以自己跟踪这个,但这是手动的,有点痛苦(特别是在存在宏的情况下)。 gcc / gas(或宏技巧等)的特殊功能是否会自动LTORG每511条指令对我来说?理想情况下,我希望它插入:

b lxxx
    .ltorg
lxxx:

(其中lxxx是一些独特的标签)

如果在使用表达式文字的最后一条指令(不在常量池中)之后的510条指令之后仅LTORG s,则加分。例如,如果有1024个不使用表达式文字的顺序指令,则不应在其后放置LTORG。但是如果紧接着之后有一条指令使用表达式文字,那么它将在510条指令后LTORG(之后计数器复位,直到达到使用表达式文字的下一条指令)。

奖励奖励积分如果以上但它没有重置计数器,除非实际使用常量池(即=1不使用它,所以它不会重置计数器,但是{{ 1}}这样做使用该表达式文字的指令将从510开始/继续倒计时。

编辑:我最初的想法是,如果你将宏中的每条指令都包装起来,从全局算术变量中减去一条指令(从510开始)。一旦它达到0,就省略=1234567689(不清楚你是否可以让汇编程序给你一个独特的标签来围绕LTORG分支)。您可以通过特殊套管LTORG的包装来获得此解决方案的“奖励积分”,这样只有它可以重新启动计数器(如果它是负数)。如果有一种检查表达式文字的方法(看看它们是否需要常量池),那么你可以特别重置只在使用常量池时应用。

编辑:编辑目前还不清楚你是否可以做我一般提出的建议,因为LDR可以在链接时解析(在汇编程序运行完所有宏之后) 。但是,我仍然对一个适用于表达式的解决方案感兴趣(例如。label-expression)。

0 个答案:

没有答案