在ARM中签名半字除以常数

时间:2016-04-26 15:50:59

标签: arm

我试图将结果除以ARM中的9与ARM DIVISION HOW TO DO IT?非常相似 除了几件事,

  1. 我正在尝试划分16位数字(半字)
  2. 签名
  3. 我现在有以下实现来划分[r8]并将其放入[r1]但是当第16位设置时其结果与C ++实现不同,否则

    LDR         r7, =0x1C72 ; 2**16 *(1/9) +1   
    MUL         r9, r8, r7
    LSR         r9, #16
    STRH        r9, [r1], #2
    

    如果您理解原因,请告诉我。 (ps我也尝试过SMULBB,但它没有更好的

1 个答案:

答案 0 :(得分:0)

不确定是否有人关心,但我找到了一种解决方案。在查看结果之后,我注意到ARM部门用我的技术比C ++少了一个。

因此,使其有效的修改:

TST         r8, #32768
SMULBB      r8, r8, r7
ASR         r8, #16
ADDNE       r8, #1

我现在遇到的另一个问题是,在九次添加之后会发生除法。当这些加法的结果超出半字范围时,C ++仍设法输出良好的结果,因为ARM结果似乎在某种程度上已经饱和。

我将不得不修改代码以将半字转换为全字,因此必须将乘法更改为32位。

只要您的起始值位于有符号的半字范围

,上述代码就可以正常工作