ARM组件SOS中的64位除法

时间:2014-10-29 15:03:28

标签: assembly arm 64-bit 32bit-64bit division

我正在计算加在一起的16个64位数的平均值,我认为我已经正确地完成了所有添加,但是现在我需要弄清楚如何将64位数除以16并且我被卡住了!任何帮助都会非常感谢你。到目前为止,这是我的代码。

tableSize       EQU     16
sum             EQU     0x40000000
average         EQU     0x40000008
                MOV r8, #14

                ADR r0, table
                LDR r9, =sum
                LDR r10,=average

                LDR r1, [r0], #1    ;hi #1
                LDR r2, [r0], #1    ;lo #1
SUM
                SUB r8, r8, #1
                LDR r3, [r0], #1    ;hi #2
                LDR r4, [r0], #1    ;lo #2
                ADDS    r5, r2, r4  ;lo 1 + lo 2 set flags
                ADC r6, r1, r3  ;hi 1 + hi 2 + carry
                MOV r1, r6
                MOV r2, r5
                CMP r8, 0   
                BNE SUM

                STR r1, [r9], #8
                STR r2, [r9]
 average
                ;stuck here 


table           DCQ     0x0200200AD00236DD
                DCQ     0x00003401AAC4D097
                DCQ     0x000001102ACFF200
                DCQ     0x00010AA0AD3C66DF
                DCQ     0x0000FC3D76400CCB
                DCQ     0x000090045ACDD097
                DCQ     0x00000FF000004551
                DCQ     0x00000000003C66DF
                DCQ     0x1000200AD00236DD
                DCQ     0x00003401AAC4D097
                DCQ     0x000001102ACFF200
                DCQ     0x00010AA0AD3C66DF
                DCQ     0x1000FC3D76400CCB
                DCQ     0x000090045ACDD097
                DCQ     0x00000FF000004551
                DCQ     0x00000000003C66DF

1 个答案:

答案 0 :(得分:2)

鉴于r0r1中有64位有符号整数,可以按照以下说明将其除以16:

    lsl     r2, r0, #28
    asr     r0, r0, #4
    orr     r1, r2, r1, lsr #4

简而言之,我们需要做的就是将两半移位四,并将r0的低四位放入r1的四个高位。

要获得无符号分割,应使用lsr代替asr

在这两种情况下,结果将四舍五入为无穷大。要将结果舍入到最接近的整数,可以在除法之前将整数加8。此外,人们可以添加15到圆形加无限。