2

我的一个换档有问题。

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。

一些

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.

建议提交错误报告。使用你的工作直到修复。
编译器同时转换unsigned longunsigned char24 和转移到 24 时感到困惑。访问和分配都可以
intern_key[channel]intern_key_H =

OP可以尝试以下方法来帮助易碎的编译器生成正确的代码。

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