我的一个换档有问题。
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;
汇编:
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;
汇编:
;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。
一些