繁体   English   中英

Atmel Studio汇编:8位数字的平方根

[英]Atmel studio assembly : Square root of an 8-bit number

我正在Atmel Studio中使用ATmega328P,我必须制作一个函数/算法,该函数/算法采用8位数字并计算其平方根。 结果必须在两个寄存器中给出,一个用于整数部分,另一个用于小数部分。

我正在考虑:根必须在给定数字与0(或1)之间。 因此,我将使用lsr(除以2),它会检查它是否更大,更小或相等,然后以更高的精度再次尝试,因此它将变得越来越精确。

问题在于整数将是不正确的,并且我不知道如何将其放入代码中,因为我是汇编的新手。 我还可以发布到目前为止的内容。

感谢您的任何建议和帮助。

仅出于完整性(或无用表示)的方法,这是如何通过线性搜索仅执行整数而不进行乘法的任务(在大多数情况下,对于0至15的值,它应比采用乘法的二进制搜索还要快) )。

root = -1
square = 0
addValue = 1
while (square <= input) {
    square += addValue
    addValue += 2
    ++root
}
; here root == trunc(sqrt(input))

因此,如果您不需要小数部分,就足够了,或者允许您至少使用256B长的LUT作为小数部分。

用8位整数寄存器编写适当的十进制sqrt实际上是很多工作,并且我不会从您身上获得所有乐趣。 :P ..

检查各种算法,不要忘记通过乘以一些“ base_exp”值可以将有限的小数范围转换为整数。

即可以通过将* 100(0-1599)的值从0.00转换为15.99,将其转换为11位整数,并且(100 * 100)的sqrt为100,因此通过输入* 10000,您将获得0-2550000的值(需要在至少22位,将其四舍五入为24b),然后对其进行整数平方根运算即可得到* 100(并适合11位),因此您可以将其除以100再分为两个值。

这对人类来说可能看起来很简单,但是在现实世界中,使用8 / 16b寄存器进行十进制计算时,通常是通过此原理完成的,但是使用了2的幂,即* 256 * 256,可以简单地通过移位值来完成还剩16位。 除以256就是将值向右移8。

因此,对于具有二进制数的每位数字方法,您将需要创建24位加/减/移位器代码。 然后,输入数字是24位数字的最高8位。 (即输入值10 => (10<<16) == 0x0A0000 )=>简单移位。 计算该值的平方根(0x0329或0x032A,取决于您是要截断还是舍入最后一位),就这样,结果一定会适合12位,而高4位是整个0-15,低8位是“金额1/256”值的小数(0x29 / 256 = 0.16015625)。 可以通过简单的移位/和运算再次拆分,即无需进行mul / div操作。

因此,这仍然需要大量工作,但这是合理的(在8b CPU上进行24位乘法/除法比进行加/减/移位扩展要痛苦得多)。 并解释为什么您选择4:8 定点格式的结果,以便从结果的小数部分开始使用全8位精度,并使其更易于进行进一步的二进制计算。 (在8:8固定点0.5 = 0x0080 ...尝试添加该值,然后看看会发生什么:0x0080 + 0x0080 = 0x0100 = 1.0而对结果没有任何复杂的篡改..这就是我们在8位CPU上进行低精度十进制计算的方式,例如,对于sin / cos效应,乘/除也更简单,再次为0.5:0x0080 * 0x0080 =(0x4000 >> 8)= 0x0040 = 0.25)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM