如何在ARM cortex M3设备中进行64位除法

如何在ARM cortex M3设备中进行64位除法,arm,inline-assembly,cortex-m,integer-division,cortex-m3,Arm,Inline Assembly,Cortex M,Integer Division,Cortex M3,我想在使用ARM内联汇编程序的ARM cortex M3设备中将64位数字除以32位数字 我试着用32位数字除以32位数字,效果很好。我也分享了代码。请让我知道有什么变化或什么新的东西必须添加,以便我可以做64位除法 long res = 0; long Divide(long i,long j) { asm ("sdiv %0,%[input_i], %[input_j];" : "=r" (res) : [input_i] "r" (i), [input_j] "r" (j

我想在使用ARM内联汇编程序的ARM cortex M3设备中将64位数字除以32位数字

我试着用32位数字除以32位数字,效果很好。我也分享了代码。请让我知道有什么变化或什么新的东西必须添加,以便我可以做64位除法

long res = 0;
long Divide(long i,long j)
{
asm ("sdiv  %0,%[input_i], %[input_j];"
    : "=r" (res)
    : [input_i] "r" (i), [input_j] "r" (j)
     );
    return res;
 }

Cortex-M ISA目前不支持64位整数除法

long res = 0;
long Divide(long i,long j)
{
asm ("sdiv  %0,%[input_i], %[input_j];"
    : "=r" (res)
    : [input_i] "r" (i), [input_j] "r" (j)
     );
    return res;
 }
你必须对它进行编程

下面是我刚刚写下的一个例子。可能是因为效率太低,而且车太多

 .syntax unified
    .cpu cortex-m3
    .fpu softvfp
    .thumb

.global div64

    .section .text.div64
    .type div64, %function

div64:
  cbz   r1, normal_divu
  stm   sp!, {r4-r7}
  mov   r6, #0
  mov   r7, #32
rot_init:
  cbz   r7, exit
#evaluate free space on left of higher word
  clz   r3, r1
#limit to free digits
  cmp   r7, r3
  it    pl
  bpl   no_limit
  mov   r3, r7
no_limit:
#update free digits
  sub   r7, r3
#shift upper word r3 times
  lsl   r1, r3
#evaluate right shift for masking upper bits
  rsb   r4, r3, #32
#mask higher bits of lower word
  mov   r4, r0, LSR r4
#add them to higher word
  add   r1, r4
#shift lower word r3 times
  lsl   r0, r3
#divide higher word
  udiv  r5, r1, r2
#put the remainder in higher word
  mul   r4, r5, r2
  sub   r1, r4
#add result bits
  lsl   r6, r3
  add   r6, r5
  b     rot_init
exit:
  mov   r0, r6
  ldm   sp!, {r4-r7}
  bx    lr

normal_divu:
  udiv  r0, r2
  bx    lr

为什么呢
int32_t div64_32(int64_t x,int32_t y){return x/y;}
并让编译器调用使用多个除法指令进行扩展精度除法的辅助函数。(我认为Cortex-M3没有64/64或64/32 in 1指令)。还可以查看编译器生成的内容:。它将32位值转换为64位值,并调用库函数(可能是手动调整的)。我们的控制器没有硬件FPU(浮点单元)。所以它不能识别浮点数,所以我们用24位定点格式进行所有计算。所以所有的除法和乘法都将超过32位。此外,根据公司标准,我们不应使用任何标准编译器库。所以,请告诉我是否有任何可能,以便我可以执行64位除法。任何人在评论中建议的都不涉及浮点。我不知道你为什么提到那件事。如果出现链接器错误,那是因为在链接时忘记包含
libgcc.a
;它实现了GCC的helper函数。您使用的编译器是什么?你的约束对我来说真的很奇怪。我可以将ATSAMG55(Cortex-M4,不带FPU)除以64位/32位,IAR对
\uuuuuu-aeabi\uldivmod
进行内部调用。声明“不应使用任何标准编译器库”只能有一个含义:不要使用C/C++,用汇编语言编写所有东西(这很愚蠢)。嗨,程序意味着我必须在汇编语言或C中完成它???@Manjunath你可以用C或汇编语言编写除法例程,这是一个选择问题。该芯片有一条32/32位除法指令,可以在构造算法时用作原语。@Johan我正在努力使用32/32位除法指令来构建64位除法的算法。请分享一些示例代码或一些使用示例更新的开发技巧如果您尝试自己编写这些代码,您将不可避免地出现一些错误。只需使用标准编译器库并用C编写代码。