【问题标题】:64 bit division in ARM Assembly SOSARM 汇编 SOS 中的 64 位除法
【发布时间】:2014-12-25 08:39:48
【问题描述】:

我正在计算 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

【问题讨论】:

  • 我知道我需要移动 hi 32 位然后保存它的 lo 位并使用逻辑指令将该数字移动到最后 32 位的 hi 位...我只是不不知道该怎么做...不知道这是否对任何人有帮助
  • 你是如何处理 64 位加法溢出的?如果我添加八位值128+129 会发生什么? 64位是有符号还是无符号? 'C' 操作 (i>>4) 做什么?这些东西是平等的吗? (a/2 + b/2) == (a+b)/2?我们必须做什么才能使他们平等?好消息,你的 ARM 代码很好。你需要先考虑数学。
  • 我稍微修改了我的代码,因为由于我如何构建循环,数学实际上是不正确的。我假设在这种情况下 64 位是无符号的。我也将 i>>4 更改为 i>>1 因为我试图到达内存中的下一个位置……这是正确的还是我什至不需要发布索引?我也相信在设置进位标志并将其添加到高位时会处理溢出...如果最终结果大于 64 位,我将忽略溢出@artlessnoise
  • 后增量值应该是#4,而不是#1。您也可以将 sub r8,r8,#1 移动到循环的末尾,如果循环完成,则使用 subs r8,r8,#1 设置 Z。
  • 在除以 16 之前,您可能需要将 8 加到 64 位总和上以进行舍入。

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


【解决方案1】:

鉴于 r0r1 中有一个 64 位有符号整数,可以使用以下说明将其除以 16:

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

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

要获得无符号除法,应该使用lsr 而不是asr

在这两种情况下,结果都将朝负无穷大四舍五入。要将结果四舍五入到最接近的整数,可以在除法前将整数加 8。此外,可以将 15 添加到正无穷大。

【讨论】:

    猜你喜欢
    • 2018-07-18
    • 1970-01-01
    • 1970-01-01
    • 2012-09-17
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    相关资源
    最近更新 更多