Optimization 在8051汇编语言中,有哪些技术可用于内存优化?
我需要优化代码,为一些新代码腾出空间。我没有空间进行所有更改。我不能使用代码组切换(带64k的80c31) 使用汇编语言,您必须手动进行优化。以下是一些技巧: 注:IANA8051P(我不是8501程序员,但我在其他8位芯片上做过大量组装) 仔细检查代码,寻找任何重复的位,不管它有多小,并使它们正常工作 学习一些更不寻常的指令,看看是否可以使用它们进行优化,例如,一个很好的技巧是使用XOR A来清除累加器,而不是MOV A,0-它保存一个字节 另一个巧妙的技巧是,如果在返回之前调用函数,只需跳转到它,例如,而不是:Optimization 在8051汇编语言中,有哪些技术可用于内存优化?,optimization,assembly,embedded,intel,8051,Optimization,Assembly,Embedded,Intel,8051,我需要优化代码,为一些新代码腾出空间。我没有空间进行所有更改。我不能使用代码组切换(带64k的80c31) 使用汇编语言,您必须手动进行优化。以下是一些技巧: 注:IANA8051P(我不是8501程序员,但我在其他8位芯片上做过大量组装) 仔细检查代码,寻找任何重复的位,不管它有多小,并使它们正常工作 学习一些更不寻常的指令,看看是否可以使用它们进行优化,例如,一个很好的技巧是使用XOR A来清除累加器,而不是MOV A,0-它保存一个字节 另一个巧妙的技巧是,如果在返回之前调用函数,只需跳转
CALL otherfunc
RET
只要做:
JMP otherfunc
始终确保尽可能进行相对跳跃和分支,它们使用的内存比绝对跳跃少
这就是我目前所能想到的一切。您在这方面并没有做很多工作,但您可以考虑两个主要的优化级别: 微观优化: 例如,XOR A代替MOV A,0 亚当早些时候已经很好地讲述了其中的一些 宏优化: 查看您的程序结构、使用的数据结构和算法、执行的任务,并仔细思考如何重新安排甚至删除这些任务。是否有整段代码实际上没有被使用?您的代码是否充满了用户从未见过的调试输出语句?是否有特定于单个客户的功能可以在常规版本中省略 为了更好地处理这个问题,你需要找出你的内存在哪里被用完了。链接器映射是一个很好的起点。宏观优化是取得重大胜利的地方 另一方面,您可以认真地尝试用一个好的优化C编译器重写部分代码。您可能会惊讶于代码的紧凑程度。一个真正的汇编高手也许能够改进它,但它很容易比大多数程序员做得更好。我大约在20年前使用了它,它让我大吃一惊。1)尽可能将变量保存在Idata中,而不是扩展数据中
2) 查看您的Jmp语句–使用SJmp和AJmp,我想您知道它不适合,因为您编写/遵守了并出现了“内存不足”错误。:)看来答案相当准确地回答了你的问题;缺少代码示例 然而,我想提出一些额外的想法
关于除了已经提到的(或多或少)明显的优化之外,还有一个非常奇怪(几乎不可能实现)的优化:代码重用。对于代码重用,我不是指正常的重用,而是a)将代码作为数据重用,或者b)将代码作为其他代码重用。也许您可以创建一个lut(或任何静态数据),它可以由asm十六进制操作码表示(这里您必须查看哈佛vs von neumann体系结构) 另一种方法是重用代码,在处理不同的代码时赋予代码不同的含义。这里有一个例子来说明我的意思。如果代码的字节如下所示:地址X处的AABCCCDDEEFFGGHH,其中每个字母代表一个操作码,想象一下您现在跳到X+1。也许你会得到一个完全不同的功能,现在由空格分隔的字节组成新的操作码:ABC CCD DE EF GH
但要注意:这不仅是很难实现的(也许是不可能的),而且是很难维持的。因此,如果你不是一个演示代码(或者类似的异类),我建议使用已经提到的其他方法来保存MEM。< P>在被淘汰的部门中,你也可以考虑压缩你的代码的一部分,并且只保留一些活跃使用的部分在任何特定时间点被解压。我很难相信压缩/解压系统所需的代码在8051的微小内存中所占的比例足够小,因此值得这么做,但在稍大的系统上却产生了奇迹 另一种方法是使用字节码格式或某些状态机输出的表驱动代码——让机器了解应用程序正在做什么,并生成完全不可理解的实现是节省空间的好方法:)
最后,如果代码确实是用C编译的,我建议使用一系列不同的选项进行编译,看看会发生什么。另外,请参阅该文本,了解小型机器的其他窍门。很抱歉,我来晚了,但我曾经遇到过完全相同的问题,并且它变成了一个反复出现的问题,一直困扰着我。在我的例子中,这个项目是一部电话,在8051系列处理器上,我已经完全耗尽了ROM(代码)内存。因为管理层一直在要求新功能,所以我一直在想这个问题,所以每个新功能都变成了一个分为两步的过程。1) 优化旧的东西以腾出空间2)实现新的功能,用完