冰楓論壇

標題: 計算正整數平方根 [打印本頁]

作者: ikj78i    時間: 1 小時前
標題: 計算正整數平方根
本帖最後由 ikj78i 於 2026-11-13 13:55 編輯

底下的副程式可以計算正整數的平方根,至整數為無條件捨去
  1. ;sqrt求某64位元無號整數平方根的整數部分。採用逐位元法計算(模擬直式開平方根法)。
  2. ;輸入:RCX=64位元無號整數
  3. ;輸出:RAX=RCX的平方根,無條件捨去至整數位
  4. ;會變更RDX、R8
  5. sqrt    PROC    Value:QWORD
  6.         mov     r8,4000000000000000h ;只有第62位元為1,其餘均為0
  7.         xor     rax,rax ;RAX先假設為零,隨迴圈進行會逐步改變,最終為RCX的平方根

  8. ;如果RCX很小,平方根的高位元也是0不用算。下面5列的程式檢查RCX高位元是否為零,直到不是零才跳至again
  9. shrink: cmp     r8,rcx  ;尋找RCX最高兩位元是否為0
  10.         jbe     again   ;若R8小於或等於RCX,表示已找到不是0的最高兩位元,跳至agian
  11.         shr     r8,2    ;否則把R8右移兩位,再試試
  12.         jnz     shrink
  13.         jmp     exit    ;若Value=0,回傳值=0

  14. ;sqrt的核心程式,開根號迴圈,算出RCX平方根,存於RAX
  15. ;R8=存放當前猜測位元,
  16. ;RCX=原本存放輸入的參數,在迴圈中會被用來當作餘數或剩餘被減數
  17. again:  lea     rdx,[rax+r8] ;RDX=RAX+R8,先猜測本次迴圈的結果為1
  18.         shr     rax,1   ;每計算出方根的一個位元,須以ECX兩個位元為依據,故右移一個位元
  19.         cmp     rcx,rdx ;檢驗猜測是否正確
  20.         jb      no_add  ;猜測錯誤,跳至no_add,不扣除餘數,也不加猜測的1
  21.         sub     rcx,rdx ;猜測正確,扣除餘數
  22.         add     rax,r8  ;加上猜測的1
  23. no_add: shr     r8,2    ;使猜測位元右移2位
  24.         jnz     again
  25. exit:   mov     rcx,Value
  26.         ret
  27. sqrt    ENDP
複製代碼





歡迎光臨 冰楓論壇 (https://bingfong.com/) Powered by 冰楓