gpt4 book ai didi

c - PIC16F 上的 24 位移位

转载 作者:太空宇宙 更新时间:2023-11-04 00:06:59 25 4
gpt4 key购买 nike

我的其中一个换档有问题。

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。

一些

最佳答案

编译器坏了。

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 可以尝试以下方法来帮助 flaky 编译器生成正确的代码。

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

关于c - PIC16F 上的 24 位移位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19787550/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com