我试图将结果除以ARM中的9与ARM DIVISION HOW TO DO IT?非常相似 除了几件事,
我现在有以下实现来划分[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,但它没有更好的
答案 0 :(得分:0)
不确定是否有人关心,但我找到了一种解决方案。在查看结果之后,我注意到ARM部门用我的技术比C ++少了一个。
因此,使其有效的修改:
TST r8, #32768
SMULBB r8, r8, r7
ASR r8, #16
ADDNE r8, #1
我现在遇到的另一个问题是,在九次添加之后会发生除法。当这些加法的结果超出半字范围时,C ++仍设法输出良好的结果,因为ARM结果似乎在某种程度上已经饱和。
我将不得不修改代码以将半字转换为全字,因此必须将乘法更改为32位。
只要您的起始值位于有符号的半字范围
,上述代码就可以正常工作