我曾尝试寻找答案,但找不到明确的原因。
我正在尝试优化一些 8051 C 代码以减少代码空间。我做了以下更改..
xdata unsigned char a, b;
至
data unsigned char a, b;
...并看到我的代码大小减少了 39 字节(感觉像圣诞节)。
来自:程序大小:data=9.0 ...code=10509
to:程序大小:数据=11.0 ...代码=10468
问题:为什么代码空间因如此微小的变化而减少了这么多?
我曾尝试寻找答案,但找不到明确的原因。
我正在尝试优化一些 8051 C 代码以减少代码空间。我做了以下更改..
xdata unsigned char a, b;
至
data unsigned char a, b;
...并看到我的代码大小减少了 39 字节(感觉像圣诞节)。
来自:程序大小:data=9.0 ...code=10509
to:程序大小:数据=11.0 ...代码=10468
问题:为什么代码空间因如此微小的变化而减少了这么多?
这取决于您如何使用(以及使用多少次)这些变量。xdata 需要 16 位寻址,这需要更多空间。举个例子,将一个固定地址的值加载到累加器中,xdata 占用的代码空间是 data 的两倍:
加载累加器,其值为 30h(数据):
MOV A, 30h ; 2 bytes
加载值为 1230h (xdata) 的累加器:
MOV DPTR, #1230h ; 3 bytes
MOVX A, @DPTR ; 1 byte
从 data 复制到 data 需要三个字节 ( MOV direct, direct
),从 xdata 复制到 xdata 可能需要八个字节 ( MOV DPTR, #addr1; MOVX; MOV DPTR #addr2; MOVX
)。如果您多次访问这些变量并且编译器无法优化它们与寄存器的使用,它可以快速加起来。