2

シフトの 1 つに問題があります。

unsigned char intern_key_L;
unsigned char intern_key_ML;
unsigned char intern_key_MH;
unsigned char intern_key_H;

unsigned long intern_key[KEY_MAX];
intern_key[channel] = 0xFFFFFFFF;
intern_key_L = intern_key[channel];
intern_key_ML = intern_key[channel] >> 8;
intern_key_MH = intern_key[channel] >> 16;
intern_key_H =  intern_key[channel] >> 24;

asm:

Encode.c: 191: intern_key_H = intern_key[channel] >> 24;
movf    ?a_key_compute+8,w
movwf   btemp
bcf     3,0
rlf     btemp
bcf     3,0
rlf     btemp,w
addlw   _intern_key
movwf   4
movf    0,w
movwf   btemp
incf    4
movf    0,w
movwf   btemp+1
incf    4
movf    0,w
movwf   btemp+2
incf    4
movf    0,w
movwf   btemp+3
movwf   btemp
clrf    btemp+2
clrf    btemp+1
clrf    btemp
movf    btemp,w
movwf   ?a_key_compute+4

intern_key_Hは 0 に等しく、0xFF ではありません。

しかし、もしそうなら:

unsigned char intern_key_L;
unsigned char intern_key_ML;
unsigned char intern_key_MH;
unsigned char intern_key_H;

unsigned long intern_key[KEY_MAX];
unsigned long tmp;

intern_key[channel] = 0xFFFFFFFF;

tmp = intern_key[channel];

intern_key_L = intern_key[channel];
intern_key_ML = intern_key[channel] >> 8;
intern_key_MH = intern_key[channel] >> 16;
intern_key_H =  tmp >> 24;

asm :

;Encode.c: 191: tmp = intern_key[channel];
movf    ?a_key_compute+8,w
movwf   btemp
bcf 3,0
rlf btemp
bcf 3,0
rlf btemp,w
addlw   _intern_key
movwf   4
movf    0,w
movwf   btemp
incf    4
movf    0,w
movwf   btemp+1
incf    4
movf    0,w
movwf   btemp+2
incf    4
movf    0,w
movwf   btemp+3
movf    btemp,w
movwf   ?a_key_compute+9
movf    btemp+1,w
movwf   ?a_key_compute+10
movf    btemp+2,w
movwf   ?a_key_compute+11
movf    btemp+3,w
movwf   ?a_key_compute+12
;Encode.c: 192: intern_key_H = tmp >> 24;
movwf   ?a_key_compute+4

このように、intern_key_H0xFF に等しくなります。

最初のスニペットで最後のシフトが機能しないのはなぜですか (最初の 3 バイトは問題ありません)。

これは PIC16F688 で、intern_key[KEY_MAX] は bank1 にあり、コンパイラは HI-TECH v8.05 です。

いくつか

4

1 に答える 1

1

コンパイラが壊れています。

clrf btemp, movf btemp,w結果を誤ってゼロにしているの は です。

clrf btemp+2, clrf btemp+1, clrf btemp
// should be
clrf btemp+3, clrf btemp+2, clrf btemp+1
// or eliminated.

バグレポートの提出を提案します。修正されるまで回避策を使用してください。
コンパイラーは、24 へのキャストとシフトを同時に行うと混乱unsigned longunsigned charました。アクセスと割り当てはOKです
intern_key[channel]intern_key_H =

OPは、不安定なコンパイラが正しいコードを生成するのを助けるために、次のことを試すことができます。

intern_key_H =  (unsigned char) (intern_key[channel] >> 24);
于 2013-11-08T16:41:02.433 に答える