2014-01-31 124 views
5

我试过寻找这个答案,但找不到明确的原因。为什么使用数据而不是xdata显着减少代码空间

我想优化一些8051 C代码以减少代码空间。我做了如下改变..

xdata unsigned char a, b; 

data unsigned char a, b; 

...看到我的代码大小由39Bytes(感觉像圣诞节)减少。

来源:程序大小:数据= 9.0 ...码= 10509

到:程序大小:数据= 11.0 ...码= 10468

问:为什么在代码空间减少了这么多对于这样的小改变?

+0

我知道使用数据可以通过不必使用DPTR访问内存来保存指令。但是39Bytes比预期的要多。 – user968722

+0

这取决于您使用该变量的程度。它重载值越大,代码越大 –

+0

这看起来很像汇编器,而不是C ... – RedX

回答

4

这取决于你如何使用(以及你使用多少次)这些变量。 xdata需要16位寻址,并占用更多空间。只是作为一个例子,在一个固定的地址加载到储液器的值取与XDATA两倍代码空间,因为它与数据的作用:

负载累加器与30H值(数据):

MOV A, 30h  ; 2 bytes 

与负载值累加器在1230h(XDATA):从数据到数据

MOV DPTR, #1230h ; 3 bytes 
MOVX A, @DPTR ; 1 byte 

复制有三个字节(MOV direct, direct),从XDATA复制到XDATA可能需要八个字节(MOV DPTR, #addr1; MOVX; MOV DPTR #addr2; MOVX)。如果您多次访问这些变量并且编译器无法优化其与寄存器的使用,则它可以快速加起来。

+0

谢谢。这可以解释为什么当我使用数据而不是xdata时,编译器并不总是优化代码。所以我想这取决于编译器已经优化了多少(Keil Level 9非常高效)以及变量被访问多少。 – user968722

+1

再一次,它真的取决于你的算法对这些变量做什么。快速用完寄存器后,编译器无法做更多的事情来加快内存访问速度。我们也使用Keil,并且我们总是看到像这样的大跳跃。总是使用小型模型,并根据需要将少用或大变量移至xdata以腾出空间。你会以更快,更紧凑的代码结束。 –

+0

谢谢。是的,我已经看到了Keil的随机跳跃。我希望我知道如何每次击败编译器。但它似乎太随意了。 – user968722

相关问题