在此之前,我询问了该算法中使用的一段代码(这里)。现在我对算法的其余部分有点问题。所以我必须详细描述这一点。对不起,如果我浪费你的时间来阅读它。
我在下面展示了一个算法。好像是CRC16算法。
CRC_16_Calculate:
mov [-r0], r9
mov [-r0], r8
mov [-r0], r7
mov [-r0], r6
mov r9, r12
mov r8, r15
jmpr cc_UC, loc_29D6
; ---------------------------------------------------------------------------
loc_29A4:
mov r4, r13
mov r5, r14
add r13, #1
addc r14, #0
exts r5, #1
movb rl3, [r4]
movbz r7, rl3
movb rl6, #0
loc_29B4:
mov r4, r9
xor r4, r7
and r4, #1
jmpr cc_Z, loc_29C8
mov r4, r9
shr r4, #1
xor r4, #0A001h
mov r9, r4
jmpr cc_UC, loc_29CA
; ---------------------------------------------------------------------------
loc_29C8:
shr r9, #1
loc_29CA:
shr r7, #1
addb rl6, #1
cmpb rl6, #8
jmpr cc_C, loc_29B4
sub r8, #1
loc_29D6:
cmp r8, #0
jmpr cc_UGT, loc_29A4
mov r4, r9
mov r6, [r0+]
mov r7, [r0+]
mov r8, [r0+]
mov r9, [r0+]
rets
正如您在下面看到的,我将其转换为 C++ 代码:
static uint16_t intCrc16(uint8_t* cBuffer)
{
uint16_t wPreset = 0xFFFF;
uint16_t iBufLen = 6;
uint16_t temp = 0;
while (iBufLen--)
{
temp = *cBuffer++;
for (uint8_t j = 0; j < 8; ++j)
{
if ((wPreset ^ temp) & 0x01) wPreset = (wPreset >> 1) ^ 0xA001;
else wPreset >>= 1;
temp >>= 1;
}
}
return wPreset;
}
似乎一切都很好,但问题就出现在这里。该函数的主循环运行了 6 次 ( iBufLen
) 但输入参数 ( cBuffer
) 长度始终为 4 字节。为了证明这一点,我们检查该算法调用的位置。看看下面:
mov r13, r4
mov r14, r5
mov r15, #6
calls 0, CRC_16_Calculate
如您所见,r13
andr14
是输入参数 ascBuffer
并r15
等效于iBufLen
. 那么,我的错误是什么?顺便说一下,r4
和r5
是我指出的函数的返回值(这里)。