冰楓論壇
標題:
計算正整數平方根
[打印本頁]
作者:
ikj78i
時間:
1 小時前
標題:
計算正整數平方根
本帖最後由 ikj78i 於 2026-11-13 13:55 編輯
底下的副程式可以計算正整數的平方根,至整數為無條件捨去
;sqrt求某64位元無號整數平方根的整數部分。採用逐位元法計算(模擬直式開平方根法)。
;輸入:RCX=64位元無號整數
;輸出:RAX=RCX的平方根,無條件捨去至整數位
;會變更RDX、R8
sqrt PROC Value:QWORD
mov r8,4000000000000000h ;只有第62位元為1,其餘均為0
xor rax,rax ;RAX先假設為零,隨迴圈進行會逐步改變,最終為RCX的平方根
;如果RCX很小,平方根的高位元也是0不用算。下面5列的程式檢查RCX高位元是否為零,直到不是零才跳至again
shrink: cmp r8,rcx ;尋找RCX最高兩位元是否為0
jbe again ;若R8小於或等於RCX,表示已找到不是0的最高兩位元,跳至agian
shr r8,2 ;否則把R8右移兩位,再試試
jnz shrink
jmp exit ;若Value=0,回傳值=0
;sqrt的核心程式,開根號迴圈,算出RCX平方根,存於RAX
;R8=存放當前猜測位元,
;RCX=原本存放輸入的參數,在迴圈中會被用來當作餘數或剩餘被減數
again: lea rdx,[rax+r8] ;RDX=RAX+R8,先猜測本次迴圈的結果為1
shr rax,1 ;每計算出方根的一個位元,須以ECX兩個位元為依據,故右移一個位元
cmp rcx,rdx ;檢驗猜測是否正確
jb no_add ;猜測錯誤,跳至no_add,不扣除餘數,也不加猜測的1
sub rcx,rdx ;猜測正確,扣除餘數
add rax,r8 ;加上猜測的1
no_add: shr r8,2 ;使猜測位元右移2位
jnz again
exit: mov rcx,Value
ret
sqrt ENDP
複製代碼
歡迎光臨 冰楓論壇 (https://bingfong.com/)
Powered by 冰楓