PIC16F上的24位移位

时间:2013-11-05 11:08:06

标签: c pic

我的一个转移问题。

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。

为什么最后一次转换不适用于fisrt片段(前3个字节都可以)?

它是PIC16F688,intern_key [KEY_MAX]在bank1中,编译器是HI-TECH v8.05。

一些

1 个答案:

答案 0 :(得分:0)

编译器坏了。

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 long投射到unsigned char并同时转移24 intern_key[channel]访问权限和intern_key_H =分配均可。

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

intern_key_H =  (unsigned char) (intern_key[channel] >> 24);