有哪些技术可用于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?