assembly - ARM 汇编 SOS 中的 64 位除法

标签 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

最佳答案

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

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

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

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

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

关于assembly - ARM 汇编 SOS 中的 64 位除法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26633800/

相关文章:

c++ - 如果计数大于类型的宽度,是否右移未定义行为?

c - 该程序集的等效 C 代码是什么?

gcc - 为什么 GCC (ARM Cortex-M0) 在应该知道数据已经是 uint8 的情况下生成 UXTB 指令

c - strtok_s 在 Windbg 中返回不正确的数据

visual-studio-2010 - 从 Visual Studio 2010 启动 64 位命令提示符

assembly - 在 MASM 的宏中使用本地标签的问题

linux - 为 ARM 交叉编译 Node.js contextify

c++ - 如何在 mac arm 上构建 libtorch?

C# 如何获得操作系统架构(x86 或 x64)?

assembly - 为什么在从引导加载程序跳转到应用程序之前需要更新堆栈指针