在discoboard(ARM7)上,我试图从https://en.wikipedia.org/wiki/Fletcher%27s_checksum中实现fletcher算法,输入是一个32位单词。
无法实现Fletcher的32位版本,因为它需要将大量数据加载到内存中,因此:
我把32位的单词分成2个16位的半单词,然后运行fletcher-16算法。
然而,输出总是数字的和,这在我看来是非常错误的。
如,

Input: 0x1b84ccc / 1101110000100110011001100

预期产量:
Checksum value

实际产出:
The sum of the 2 16 bit half words. Wut

如果这是实际的算法,或者我犯了错误,有人能帮忙吗?
@ Input:
@ r0: 32 bit message
@ Output:
@ r0: checksum value
fletchers_checksum:
    push {r1-r4,lr}
    mov r3, #0 @ store the sum
    mov r4, r0 @ store message

    @split to 2 16 bit messages:
    @@take frequency
    ldr r1, =#0xFFFF0000
    and r0, r1, r4
    lsr r0, #16
    bl compute_checksum_for_16_bit_number

    @@amplitude
    ldr r1, =#0xFFFF
    and r0, r1, r4
    bl compute_checksum_for_16_bit_number

    mov r0, r3
    pop {r1-r3,lr}
    bx lr

compute_checksum_for_16_bit_number:
    push {lr}
    ldr r1, =#65536
    add r0, r3 @add current sum to it.
    bl mod
    mov r3, r0 @store new sum
    pop {lr}
    bx lr

谢谢您!

最佳答案

从链接的维基百科页面:
通常,第二个和将乘以2^16并添加到
简单的校验和,有效地将和并排堆叠在
32位字,简单校验和至少有有效结尾。
您的代码似乎计算了两个16位校验和,但没有按要求将第二个校验和移动16位。

07-24 09:45
查看更多