有没有通用的(不是伊萨特定的)方法,如何在汇编中得到任何正数的倒数值,而不使用div
函数?
我使用倒数值将一个未知数x
除以一个常数y
。例如,我想将256除以一个常数3(相当于将256乘以1/3)
1.手工计算1/3
1.手动将0.3333...
从浮点转换为Q32定点(32个无符号小数位)1/3 * 2^32 = 0x55555555
1.将0x0x55555555
常量作为立即数保存到程序集中的寄存器
1.在程序集中乘以0x100 * 0x55555555 = 0x5555555500
1.在汇编中从Q64定点转换回32位整数0x5555555500 >> 32 = 0x55 = 85
这是工作正常,但现在,我想除以2未知数彼此。为了做到这一点,使用上述算法,首先我必须计算一个倒数值的y
在汇编,而不是手工。
或者有没有其他的通用方法,我可以用它来做除法?我不想在一个循环中用减法来计算除法,因为我的代码的速度性能。
1条答案
按热度按时间2w3kk1z51#
Newton Raphson算法是实现这一点的一种方法。使用一个基于除数的高位非零位的初始估计表可以加快处理速度。第二个表可以用于小数字的求逆,如从2到255。
https://en.wikipedia.org/wiki/Division_algorithm#Newton%E2%80%93Raphson_division