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