シフトの 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_H
0xFF に等しくなります。
最初のスニペットで最後のシフトが機能しないのはなぜですか (最初の 3 バイトは問題ありません)。
これは PIC16F688 で、intern_key[KEY_MAX] は bank1 にあり、コンパイラは HI-TECH v8.05 です。
いくつか