有哪些技术可用于8051汇编语言的内存优化?
我需要优化代码以获得一些新代码的空间。 我没有所有变化的空间。 我不能使用代码库切换(80c31与64k)。
在这里你并没有真正付出很多努力,但是你可以考虑两个主要的优化级别:
微优化:例如。 XOR A而不是MOV A,0亚当早就很好地描述了其中的一些。
宏优化:查看程序的结构,使用的数据结构和算法,执行的任务,以及如何重新排列或删除这些任务。 是否有实际不使用的完整代码块? 您的代码是否充满了用户从不会看到的调试输出语句? 是否有专门针对单个客户的功能,您可以忽略一般的版本?
为了解决这个问题,你需要弄清楚你的内存已经用完了。 链接器地图是一个很好的开始。 宏优化是BIG获胜的地方。
顺便说一句,您可以 - 认真 - 尝试用优秀的C编译器重写代码的一部分。 您可能会惊讶于代码的严密程度。 一个真正的汇编程序能够改进它,但它可能比大多数编程人员更好。 大约20年前,我使用了IAR,它吹掉了我的袜子。
使用汇编语言,您必须手动优化。 这里有一些技巧:
注意:IANA8051P(我不是8501编程器,但是我在其他8位芯片上做了很多汇编)。
通过代码寻找任何重复的位,无论多小,并使其功能。
学习一些更加不寻常的说明,看看你是否可以使用它们进行优化,例如。 一个很好的窍门是使用XOR A清除累加器而不是MOV A,0 - 它节省了一个字节。
另一个巧妙的窍门是,如果你在返回之前调用一个函数,就跳转到它,而不是:
CALL otherfunc
RET
做就是了:
JMP otherfunc
一定要确保你在做相对跳转和分支,他们使用的内存少于绝对跳转。
这就是我现在能想到的一切。
对不起,我迟到了,但我曾经遇到过完全相同的问题,而这成为一个不断重复出现的问题。 在我的情况下,该项目是一个电话,在一个8051系列处理器上,并且我已经完全刷出了ROM(代码)内存。 它不断回到我身边,因为管理层不断要求新功能,所以每个新功能都成了一个两步过程。 1)优化旧东西以腾出空间2)实现新功能,使用我刚刚创建的房间。
有两种方法可以优化。 战术和战略。 通过微观优化理念,战术优化可一次节省几个字节。 我认为你需要进行战略优化,这需要对你如何做事情有一个更激进的反思。
我记得的东西为我工作,可以为你工作;
看看你的代码必须做的本质,并试图提炼出一些非常强大的灵活的基本操作。 然后重建你的顶级代码,以便它除了调用原语之外什么也不做低级别。 理想情况下使用基于表格的方法,您的表格包含类似的东西; 输入状态,事件,输出状态,原语......换句话说,当事件发生时,在当前状态下在表格中查找该事件的单元格。 该单元告诉你要更改的新状态(可选)和要执行的基元(如果有)。 对于不同的层/子系统,您可能需要多组状态/事件/表/基元。
这种方法的许多好处之一是,您可以将其视为为特定问题构建自定义语言,您可以非常高效地(即以最少的额外代码)仅通过修改表创建新功能。
对不起,我迟了几个月,你可能没有时间做这个激进的事情。 就我所知,你已经在使用类似的方法! 但我的回答可能有助于别人知道。
链接地址: http://www.djcxy.com/p/80517.html上一篇: What techniques are available for memory optimizing in 8051 assembly language?
下一篇: Should I avoid tail recursion in Prolog and in general?