|

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