Inline ASM version for Windows.
Code: Select all
Procedure.q asm_Bin2Dec(bin.s)
PUSH esi ebx
MOV eax, 0
MOV edx, eax
MOV ecx, eax
MOV esi, [p.v_bin + 8]
TEST esi, esi ;if null pointer, exit.
!JZ .end_calc
!@@:
CompilerIf #PB_Compiler_Unicode
MOVZX ebx, word [esi+ecx*2]
CompilerElse
MOVZX ebx, byte [esi+ecx]
CompilerEndIf
XOR ebx, $30 ;AND ebx, $FFFFFFCF
CMP ebx, 1 ;if character is not '0' or '1', then exit loop.
!JA .end_calc
SHLD edx, eax, 1
SHL eax, 1
OR eax, ebx
INC ecx
CMP ecx, 64
!JB @r
!.end_calc:
POP ebx esi
ProcedureReturn
EndProcedure
Procedure.q asm_Bin2Dec_ptr(*string.l)
PUSH esi ebx
MOV eax, 0
MOV edx, eax
MOV ecx, eax
MOV esi, [p.p_string + 8]
TEST esi, esi ;if null pointer, exit.
!JZ .end_calc
!@@:
CompilerIf #PB_Compiler_Unicode
MOVZX ebx, word [esi+ecx*2]
CompilerElse
MOVZX ebx, byte [esi+ecx]
CompilerEndIf
XOR ebx, $30 ;AND ebx, $FFFFFFCF
CMP ebx, 1 ;if character is not '0' or '1', then exit loop.
!JA .end_calc
SHLD edx, eax, 1
SHL eax, 1
OR eax, ebx
INC ecx
CMP ecx, 64
!JB @r
!.end_calc:
POP ebx esi
RET 4
;ProcedureReturn
EndProcedure
Test code.
Code: Select all
DisableDebugger
Macro d(s, v)
Debug s + ": " + Str(v)
EndMacro
Procedure.q Bin2Dec(binary.s)
Protected result.q, n, temp
For n=MemoryStringLength(@binary)-1 To 0 Step -1
temp=(PeekC(@binary+n*SizeOf(Character))-48)*1<<(MemoryStringLength(@binary)-1-n)
result+temp ; leave this line untouched, quad-bug otherwise!
Next
ProcedureReturn result
EndProcedure
Procedure.l rm_Bin2Dec(s.s)
Protected *ptr.CHARACTER
Protected pos.l, Value.l
If s
pos = Len(s) - 1
*ptr = @s
While *ptr\c <> 0
If *ptr\c = '1'
Value + (1 << pos)
ElseIf *ptr\c <> '0'
Value = 0
Break
EndIf
pos - 1
*ptr + SizeOf(CHARACTER)
Wend
EndIf
ProcedureReturn Value
EndProcedure
Procedure.q Bin2Dec2(Hex.s)
Protected Result.q
Protected Char.l
Protected Ptr = @Hex
Char = PeekC(Ptr) - '0'
While Char <> - '0'
Ptr + SizeOf(Character)
Result = Result << 1 + Char
Char = PeekC(Ptr) - '0'
Wend
ProcedureReturn Result
EndProcedure
Procedure.l Bin2DecL(s.s) ; returns the decimal number for this (max) 32-bit-binary string
Protected res.l = 0
Protected *pS.Character = @s
If *pS = 0
ProcedureReturn 0
EndIf
Repeat
Debug *pS\c
If *pS\c = '1'
res << 1 | 1
ElseIf *pS\c = '0'
res << 1
Else
Break
EndIf
*pS + SizeOf(Character)
ForEver
ProcedureReturn res
EndProcedure
Procedure.q Bin2DecQ(s.s) ; returns the decimal number for this (max) 64-bit-binary string
Protected res.q = 0
Protected *pS.Character = @s
If *pS = 0
ProcedureReturn 0
EndIf
Repeat
Debug *pS\c
If *pS\c = '1'
res << 1 | 1
ElseIf *pS\c = '0'
res << 1
Else
Break
EndIf
*pS + SizeOf(Character)
ForEver
ProcedureReturn res
EndProcedure
Procedure.q asm_Bin2Dec(bin.s)
PUSH esi ebx
MOV eax, 0
MOV edx, eax
MOV ecx, eax
MOV esi, [p.v_bin + 8]
TEST esi, esi ;if null pointer, exit.
!JZ .end_calc
!@@:
CompilerIf #PB_Compiler_Unicode
MOVZX ebx, word [esi+ecx*2]
CompilerElse
MOVZX ebx, byte [esi+ecx]
CompilerEndIf
XOR ebx, $30 ;AND ebx, $FFFFFFCF
CMP ebx, 1 ;if character is not '0' or '1', then exit loop.
!JA .end_calc
SHLD edx, eax, 1
SHL eax, 1
OR eax, ebx
INC ecx
CMP ecx, 64
!JB @r
!.end_calc:
POP ebx esi
ProcedureReturn
EndProcedure
;
PriorityClass = GetPriorityClass_(GetCurrentProcess_())
Priority = GetThreadPriority_(GetCurrentThread_())
SetPriorityClass_(GetCurrentProcess_(), #REALTIME_PRIORITY_CLASS)
SetThreadPriority_(GetCurrentThread_(), #THREAD_PRIORITY_TIME_CRITICAL)
t1 = 0
t2 = 0
t3 = 0
t4 = 0
t5 = 0
tmp = 0
;v.s
;v.s = ""
;v.s = "0120"
;v.s = BinQ($111)
;v.s = BinQ($FFFFFFFF)
;v.s = BinQ($200000000)
v.s = BinQ($1000000000000000)
;v.s = BinQ($8000000000000000)
;v.s = BinQ(-9876543210)
!rdtsc
PUSH eax
!rdtsc
POP edx
SUB eax, edx
MOV tmp, eax
;test 1 - AND51
Bin2Dec(v)
Bin2Dec(v)
Bin2Dec(v)
!rdtsc
PUSH eax
Bin2Dec(v)
!rdtsc
POP edx
SUB eax, edx
MOV t1, eax
;test 2 - remi_meier
rm_Bin2Dec(v)
rm_Bin2Dec(v)
rm_Bin2Dec(v)
!rdtsc
PUSH eax
rm_Bin2Dec(v)
!rdtsc
POP edx
SUB eax, edx
MOV t2, eax
;test 3 - Trond
Bin2Dec2(v)
Bin2Dec2(v)
Bin2Dec2(v)
!rdtsc
PUSH eax
Bin2Dec2(v)
!rdtsc
POP edx
SUB eax, edx
MOV t3, eax
;test 4 - Froggerprogger
Bin2DecQ(v)
Bin2DecQ(v)
Bin2DecQ(v)
!rdtsc
PUSH eax
Bin2DecQ(v)
!rdtsc
POP edx
SUB eax, edx
MOV t4, eax
; Bin2DecL(v)
; Bin2DecL(v)
; Bin2DecL(v)
; !rdtsc
; PUSH eax
; Bin2DecL(v)
; !rdtsc
; POP edx
; SUB eax, edx
; MOV t4, eax
;test 5 - My Asm ver.
asm_Bin2Dec(v)
asm_Bin2Dec(v)
asm_Bin2Dec(v)
!rdtsc
PUSH eax
asm_Bin2Dec(v)
!rdtsc
POP edx
SUB eax, edx
MOV t5, eax
EnableDebugger
CompilerIf #PB_Compiler_Unicode
Debug "Unicode Mode"
CompilerElse
Debug "ASCII Mode"
CompilerEndIf
Debug ""
Debug tmp
d("AND51", t1-tmp)
d("remi_meier", t2-tmp)
d("Trond", t3-tmp)
d("Froggerprogger", t4-tmp)
d("Asm ver.", t5-tmp)
Debug ""
Debug Bin2Dec(v)
Debug rm_Bin2Dec(v)
Debug Bin2Dec2(v)
Debug Bin2DecQ(v)
;Debug Bin2DecL(v)
Debug asm_Bin2Dec(v)