Optimization 在8051汇编语言中,有哪些技术可用于内存优化?

Optimization 在8051汇编语言中,有哪些技术可用于内存优化?,optimization,assembly,embedded,intel,8051,Optimization,Assembly,Embedded,Intel,8051,我需要优化代码,为一些新代码腾出空间。我没有空间进行所有更改。我不能使用代码组切换(带64k的80c31) 使用汇编语言,您必须手动进行优化。以下是一些技巧: 注:IANA8051P(我不是8501程序员,但我在其他8位芯片上做过大量组装) 仔细检查代码,寻找任何重复的位,不管它有多小,并使它们正常工作 学习一些更不寻常的指令,看看是否可以使用它们进行优化,例如,一个很好的技巧是使用XOR A来清除累加器,而不是MOV A,0-它保存一个字节 另一个巧妙的技巧是,如果在返回之前调用函数,只需跳转

我需要优化代码,为一些新代码腾出空间。我没有空间进行所有更改。我不能使用代码组切换(带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,我想您知道它不适合,因为您编写/遵守了并出现了“内存不足”错误。:)看来答案相当准确地回答了你的问题;缺少代码示例

然而,我想提出一些额外的想法

  • 确保所有代码都是真实的 正在使用——代码覆盖率测试?一 未使用的潜艇是一个巨大的胜利——这是一个巨大的挑战 艰难的一步——如果你是原创的 作者,这可能更容易——(嗯,也许吧):)
  • 确保“验证”的级别 初始化——有时我们 有过分热心的倾向 在保险方面,我们已初始化 变量/内存,果然 没错,我们有过多少次 被它咬了。不是说不要 初始化(duh),但如果我们正在初始化 记忆的移动,目的地 不需要先为零-- 这与 一,--
  • 评估新功能--是否可以 现有子系统将得到增强,以覆盖 这两种功能或可能是 替换现有功能
  • 如果一段代码 大代码可以节省创建新代码的时间 小代码
  • 或者,现在可能有一个关于硬件版本2.0的争论…:)


    关于

    除了已经提到的(或多或少)明显的优化之外,还有一个非常奇怪(几乎不可能实现)的优化:代码重用。对于代码重用,我不是指正常的重用,而是a)将代码作为数据重用,或者b)将代码作为其他代码重用。也许您可以创建一个lut(或任何静态数据),它可以由asm十六进制操作码表示(这里您必须查看哈佛vs von neumann体系结构)

    另一种方法是重用代码,在处理不同的代码时赋予代码不同的含义。这里有一个例子来说明我的意思。如果代码的字节如下所示:地址X处的AABCCCDDEEFFGGHH,其中每个字母代表一个操作码,想象一下您现在跳到X+1。也许你会得到一个完全不同的功能,现在由空格分隔的字节组成新的操作码:ABC CCD DE EF GH


    但要注意:这不仅是很难实现的(也许是不可能的),而且是很难维持的。因此,如果你不是一个演示代码(或者类似的异类),我建议使用已经提到的其他方法来保存MEM。

    < P>在被淘汰的部门中,你也可以考虑压缩你的代码的一部分,并且只保留一些活跃使用的部分在任何特定时间点被解压。我很难相信压缩/解压系统所需的代码在8051的微小内存中所占的比例足够小,因此值得这么做,但在稍大的系统上却产生了奇迹

    另一种方法是使用字节码格式或某些状态机输出的表驱动代码——让机器了解应用程序正在做什么,并生成完全不可理解的实现是节省空间的好方法:)


    最后,如果代码确实是用C编译的,我建议使用一系列不同的选项进行编译,看看会发生什么。另外,请参阅该文本,了解小型机器的其他窍门。

    很抱歉,我来晚了,但我曾经遇到过完全相同的问题,并且它变成了一个反复出现的问题,一直困扰着我。在我的例子中,这个项目是一部电话,在8051系列处理器上,我已经完全耗尽了ROM(代码)内存。因为管理层一直在要求新功能,所以我一直在想这个问题,所以每个新功能都变成了一个分为两步的过程。1) 优化旧的东西以腾出空间2)实现新的功能,用完