簡體   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