5

これに対する答えを探してみましたが、決定的な理由が見つかりません。

コードスペースを削減するために、いくつかの 8051 C コードを最適化しようとしています。私は次の変更を加えました..

xdata unsigned char a, b;

data unsigned char a, b;

...そして、コードのサイズが 39 バイト減少するのを見ました (クリスマスのように感じます)。

From: プログラムサイズ: data=9.0 ...code=10509

to: プログラムサイズ: data=11.0 ... code=10468

質問: このようなマイナーな変更でコードスペースが大幅に縮小されたのはなぜですか?

4

1 に答える 1

4

これらの変数の使用方法 (および使用回数) によって異なります。xdata には 16 ビットのアドレス指定が必要であり、より多くのスペースを必要とします。例として、固定アドレスの値をアキュムレータにロードすると、データの場合よりも xdata の方が 2 倍のコード空間が必要になります。

アキュムレータに 30h の値 (データ) をロードします。

MOV A, 30h       ; 2 bytes

アキュムレータに 1230h (xdata) の値をロードします。

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

データからデータへのコピーには 3 バイト ( MOV direct, direct)、xdata から xdata へのコピーには 8 バイト ( MOV DPTR, #addr1; MOVX; MOV DPTR #addr2; MOVX) かかります。これらの変数に何度もアクセスしていて、コンパイラーがレジスターでの使用を最適化できなかった場合、すぐに加算されます。

于 2014-01-31T12:12:30.713 に答える