c - 为什么使用数据而不是 xdata 会显着减少代码空间

标签 c optimization 8051 c51

我曾尝试寻找这个问题的答案,但找不到明确的原因。

我正在尝试优化一些 8051 C 代码以减少代码空间。我做了以下更改..

xdata unsigned char a, b;

data unsigned char a, b;

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

来自:程序大小:data=9.0 ...code=10509

至:程序大小:data=11.0 ... code=10468

问题:为什么这么小的改动代码空间就减少了这么多?

最佳答案

这取决于您如何使用(以及使用了多少次)这些变量。 xdata 需要 16 位寻址,这会占用更多空间。举个例子,将固定地址处的值加载到累加器中,xdata 占用的代码空间是 data 的两倍:

在 30h 加载累加器的值(数据):

MOV A, 30h       ; 2 bytes

用 1230h 处的值加载累加器(扩展数据):

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

从数据到数据的复制需要三个字节(MOV direct, direct),从 xdata 到 xdata 的复制可能需要八个字节(MOV DPTR, #addr1; MOVX; MOV DPTR #addr2 ; MOVX).如果您多次访问这些变量并且编译器无法优化它们对寄存器的使用,那么它会很快加起来。

关于c - 为什么使用数据而不是 xdata 会显着减少代码空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21478304/

相关文章:

C:如何将双指针传递给函数

Javascript 数组操作 : Is there a better way to do the following?

algorithm - 有没有一种有效的方法来确定叶节点是否可以从有向无环图中的另一个任意节点到达?

Python 的 scipy.optimize.minimize 与 SLSQP 失败并显示 "Positive directional derivative for linesearch"

c - 如何在 sdcc 内联汇编中推送变量?

c - 执行 fgets/fputs 时最后一行重复

c - 解析二进制数据时使用属性打包的结构

c - C语言中如何检查除法的结果是否为整数?

c - 哪个更好? 32 位 MCU 中的 int8_t 与 int32_t