你关心的是空间,而不是时间,对吧?你有四个函数调用,每个函数都传递一个整数参数,然后是乘以一个常数,然后是加法。就像第一个猜测一样,这可能是
- 将整数常量加载到寄存器中(6 个字节)
- 推送寄存器(2字节,
- 调用
eeprom_read
(6 个字节)
- 调整堆栈(4 字节)
- 将整数乘数加载到寄存器中(6 个字节)
- 推送两个寄存器(4 个字节),
- 调用乘法例程(6 个字节)
- 调整堆栈(4 字节)
- 将临时总和加载到寄存器中(6 个字节)
- 将乘法的结果(2 个字节)添加到该寄存器
- 存储回临时总和(6 个字节)。
让我们看看,每次调用 6+2+6+4+6+4+6+4+6+2+6= 大约 52 个字节eeprom_read
。最后一次调用会更短,因为它不进行乘法运算。
我会尝试eeprom_read
不使用参数调用,146
而是使用(unsigned char)146
,而不是乘以,1000
而是乘以(unsigned short)1000
。这样,您也许可以让编译器使用更短的指令,并且可能使用乘法指令而不是乘法函数调用。此外,调用eeprom_read
可能会被宏化为直接内存获取,从而保存参数的推送、函数的调用和堆栈调整。
另一个技巧可能是将四个产品中的每一个存储在一个局部变量中,并在最后将它们加在一起。这可以生成更少的代码。所有这些可能性也会使其更快,更小,尽管您可能不需要关心这一点。
节省空间的另一种可能性是使用循环,如下所示:
static unsigned short powerOf10[] = {1000, 100, 10, 1};
unsigned short i;
romAddr = 0;
for (i = 146; i < 150; i++){
romAddr += powerOf10[i-146] * eeprom_read(i);
}
这应该通过只调用和乘法一次以及循环指令而不是四个副本来节省空间。
无论如何,请使用编译器生成的汇编语言。