自己写的,求64位整数的以2为底的对数,如果是32位整数,代码更加简单。
------------------------------------------------
以下代码可用微软的ml.exe编译
------------------------------------------------
.486
.model flat
PUBLIC _Uint64_Log2_ALU
_TEXT SEGMENT
_Uint64_Log2_ALU PROC
mov ecx,[esp+4]
mov edx,[esp+8]
or edx,edx
jnz check_64
check_is_zero:
or ecx,ecx
jnz check_32
mov eax,-1
ret
check_32:
bsr eax,ecx
ret
check_64:
bsr eax,edx
add eax,32
ret
ret 0
_Uint64_Log2_ALU ENDP
_TEXT ENDS
END
--------------------------------------
以下代码可用gcc编译
--------------------------------------
.intel_syntax noprefix
.text
.globl Uint64_Log2_ALU
.type Uint64_Log2_ALU, @function
.ifndef M64
Uint64_Log2_ALU:
mov ecx,[esp+4]
mov edx,[esp+8]
or edx,edx
jnz check_64
check_is_zero:
or ecx,ecx
jnz check_32
mov eax,-1
ret
check_32:
bsr eax,ecx
ret
check_64:
bsr eax,edx
add eax,32
ret
.else
.equ PARA1,rdi
Uint64_Log2_ALU:
check_is_zero:
or PARA1, PARA1
jnz check_64
mov rax,-1
ret
check_64:
bsr rax,PARA1
ret
.endif
|