我的一个转移问题。
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。
一些
答案 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);