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

use*_*722 5 c optimization 8051 c51

我试图寻找答案,但找不到明确的理由.

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

xdata unsigned char a, b;
Run Code Online (Sandbox Code Playgroud)

data unsigned char a, b;
Run Code Online (Sandbox Code Playgroud)

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

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

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

问题:为什么代码空间减少了这么小的变化?

Phi*_*zel 4

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

将 30h 处的值加载到累加器(数据):

MOV A, 30h       ; 2 bytes
Run Code Online (Sandbox Code Playgroud)

加载累加器的值为 1230h(xdata):

MOV DPTR, #1230h ; 3 bytes
MOVX A, @DPTR    ; 1 byte
Run Code Online (Sandbox Code Playgroud)

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