冰楓論壇

 找回密碼
 立即註冊
查看: 27|回覆: 0
打印 上一主題 下一主題

[心得] 計算正整數平方根

[複製鏈接]

16

主題

0

好友

61

積分

新手上路

Rank: 1

UID
460236
帖子
32
主題
16
精華
0
積分
61
楓幣
1918
威望
59
存款
0
贊助金額
0
推廣
0
GP
17
閱讀權限
10
性別
保密
在線時間
48 小時
註冊時間
2024-10-12
最後登入
2026-11-13
跳轉到指定樓層
1樓
發表於 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
複製代碼
收藏收藏0 推推0 噓噓0

分享這篇文章



把本文推薦給朋友或其他網站上,每次被點擊增加您在本站積分: 1鑰匙
複製連結並發給好友,以賺取推廣點數
簡單兩步驟,註冊、分享網址,即可獲得獎勵! 一起推廣文章換商品、賺$$
高級模式
B Color Image Link Quote Code Smilies |上傳

廣告刊登∣意見回饋∣關於我們∣管群招募∣本站規範∣DMCA∣隱私權政策∣詐騙防範及資料調閱

Copyright © 2011-2026 冰楓論壇, All rights reserved

免責聲明:本網站是以即時上載留言的方式運作,本站對所有留言的真實性、完整性及立場等,不負任何法律責任。

而一切留言之言論只代表留言者個人意見,並非本網站之立場,用戶不應信賴內容,並應自行判斷內容之真實性。

小黑屋|手機版|冰楓論壇

GMT+8, 2026-11-13 15:15

APP Store下載 Play Store下載
回頂部