#AutoIt3Wrapper_UseX64=n Switch @AutoItX64 Case 1 Global $_pASM_DecToHex = _FASM_StructCreateBCA16("0x4989C94D89CA4189D7F3410F6F38F3410F6F7010F3410F6F6820660FEFE4F3410F6F58304531F6909090909090909090F3410F6F01660FFAC7660F6FC8660F60C4660FF5C5660F70D0D4660FF4D3660F70C0E7660FFED0660F70C2E6660FFEC2660FDBCE660F73D908660FFEC166410F7E024183C6014983C1094983C2044183EF097FACF3410F6F7840F3410F6F70504989C94589F7F3410F6F01660F70C831660FDBCE660FF4C7660FD4C1F3410F7F014983C1104183EF047FDB4989C94989CA4589F749BD000064A7B3B6E00D90904589F74D89D14831C0909090909090904831D249F7E54903014883D2004989114983C1084183EF027FE64989024983C2084183EE027FC9C3") Global $_pASM_HexToStr = _FASM_StructCreateBCA16("0x4801D16641B9F00F4883E9018A0188C4664421C8C0E8043C0A7C020407043080FC0A7C0380C40780C430664189004983C00283EA017FD1C3") Global $_pASM_HexToBinStr = _FASM_StructCreateBCA16("0x4801D16641B9F00F4883E9018A0188C4664421C8C0E80441BA30303030A80174074181CA00000001A80274074181CA00000100A80474074181CA00010000A80874044183CA014589104983C00441BA30303030F6C40174074181CA00000001F6C40274074181CA00000100F6C40474074181CA00010000F6C40874044183CA014589104983C00483EA010F8F78FFFFFFC3") Case Else Global $_pASM_DecToHex = _FASM_StructCreateBCA16("0x5589E583EC048B75088B4D0C8B551089F7F30F6F3AF30F6F7210F30F6F6A20660FEFE4F30F6F5A3031DB909090909090F30F6F06660FFAC7660F6FC8660F60C4660FF5C5660F70D0D4660FF4D3660F70C0E7660FFED0660F70C2E6660FFEC2660FDBCE660F73D908660FFEC1660F7E0783C30183C60983C70483E9097FB28B750889F789D9890C24BB00CA9A3B9090908B0C2489FE31C090909090909090909031D2F7E3030683D200891683C60483E9017FED890783C704832C24017FD283C4045DC20C00") Global $_pASM_HexToStr = _FASM_StructCreateBCA16("0x8B7424048B4C24088B7C240C01CE66BBF00F83EE018A0688C46621D8C0E8043C0A7C020407043080FC0A7C0380C40780C43066890783C70283E9017FD5C20C00") Global $_pASM_HexToBinStr = _FASM_StructCreateBCA16("0x8B7424048B4C24088B7C240C01CE66BBF00F83EE018A0688C46621D8C0E804BA30303030A801740681CA00000001A802740681CA00000100A804740681CA00010000A808740383CA01891783C704BA30303030F6C401740681CA00000001F6C402740681CA00000100F6C404740681CA00010000F6C408740383CA01891783C70483E9017F8CC20C00") EndSwitch $sDec = "9876543210" For $i = 1 To 15 $sDec &= $sDec Next ConsoleWrite("! Dec Len: " & StringLen($sDec) & @CRLF) Global $iTimer = TimerInit() $sHex = _BigDecToHex($sDec) ConsoleWrite("! Time: " & TimerDiff($iTimer) & @CRLF & @CRLF) Func _BigDecToHex(ByRef $sDec, $iMode = 2) Local $iLen = StringLen($sDec) If Mod($iLen, 18) Then $iLen += 18 - Mod($iLen, 18) $sDec = StringRight("000000000000000000" & $sDec, $iLen) EndIf Local $tDec = DllStructCreate("char[" & $iLen & "]; byte[16];") DllStructSetData($tDec, 1, $sDec) Local $tVal = DllStructCreate("byte[96];") DllStructSetData($tVal, 1, "0x303030303030303030303030303030300000000000000000FF000000000000001027E80364000A001027E80364000A001027000000000000102700000000000000CA9A3B0000000000CA9A3B00000000FFFFFFFF00000000FFFFFFFF00000000") DllCallAddress("none", $_pASM_DecToHex, "struct*", $tDec, "uint", $iLen, "struct*", $tVal) Switch $iMode Case 1 ;Hex String Local $tHex = DllStructCreate("char[" & $iLen & "];") DllCallAddress("none", $_pASM_HexToStr, "struct*", $tDec, "uint", $iLen / 18 * 8, "struct*", $tHex) Return StringRegExpReplace(DllStructGetData($tHex, 1), "^0+([^0]|0$)", "\1", 1) Case 2 ;Bin String Local $tBin = DllStructCreate("char[" & $iLen * 4 & "];") DllCallAddress("none", $_pASM_HexToBinStr, "struct*", $tDec, "uint", $iLen / 18 * 8, "struct*", $tBin) Return StringRegExpReplace(DllStructGetData($tBin, 1), "^0+([^0]|0$)", "\1", 1) Case Else ;Hex Local $tHex = DllStructCreate("byte[" & Ceiling($iLen / 18 * 8) & "];", DllStructGetPtr($tDec)) Return DllStructGetData($tHex, 1) EndSwitch EndFunc ;==>_BigDecToHex #ASM _ASM_DecToHex32 # use32 # push ebp # mov ebp, esp # sub esp, 4 ;####################################################### ;# Char to NumberArray ;####################################################### # mov esi, [ebp+8] # mov ecx, [ebp+12] # mov edx, [ebp+16] # mov edi, esi # movdqu xmm7, [edx] # movdqu xmm6, [edx+16] # movdqu xmm5, [edx+32] # pxor xmm4, xmm4 # movdqu xmm3, [edx+48] ;xmm7 = 0x30303030303030303030303030303030 ;xmm6 = 0x0000000000000000FF00000000000000 ;xmm5 = 10000, 1000, 100, 10, 10000, 1000, 100, 10 ;xmm4 = 0, 0, 0, 0 ;xmm3 = 10000, 0, 10000, 0 # xor ebx, ebx # align 16 # _LoopChar: # movdqu xmm0, [esi] # psubd xmm0, xmm7 # movdqa xmm1, xmm0 # punpcklbw xmm0, xmm4 ;Char 1-8 # pmaddwd xmm0, xmm5 # pshufd xmm2, xmm0, 0xD4 # pmuludq xmm2, xmm3 # pshufd xmm0, xmm0, 0xE7 # paddd xmm2, xmm0 # pshufd xmm0, xmm2, 0xE6 # paddd xmm0, xmm2 # pand xmm1, xmm6 # psrldq xmm1, 8 # paddd xmm0, xmm1 ;123456789 # movd [edi], xmm0 # add ebx, 1 # add esi, 9 # add edi, 4 # sub ecx, 9 # jg _LoopChar ;####################################################### ;# BigDiv ;####################################################### # mov esi, [ebp+8] # mov edi, esi # mov ecx, ebx # mov [esp], ecx # mov ebx, 1000000000 ;eax = Number/Result ;ebx = MulFactor ;ecx = Count ;edx = Result # align 16 # _LoopDiv: # mov ecx, [esp] # mov esi, edi # xor eax, eax ;Tmp = 0 # align 16 # _LoopBigDiv: # xor edx, edx ;??? # mul ebx ;carry * 100000000 # add eax, [esi] # adc edx, 0 # mov [esi], edx # add esi, 4 # sub ecx, 1 # jg _LoopBigDiv # mov [edi], eax ;write carry # add edi, 4 ;next ArrayIndex # sub dword[esp], 1 # jg _LoopDiv # add esp, 4 # pop ebp # ret 12 #ASMEND #ASM _ASM_HexToBinStr32 # use32 # mov esi, [esp+4] # mov ecx, [esp+8] # mov edi, [esp+12] # add esi, ecx # mov bx, 0x0FF0 # _Loop: # sub esi, 1 # mov al, [esi] # mov ah, al # and ax, bx # shr al, 4 # mov edx, 0x30303030 # test al, 1 # jz _L2 # or edx, 0x01000000 # _L2: # test al, 2 # jz _L4 # or edx, 0x00010000 # _L4: # test al, 4 # jz _L8 # or edx, 0x00000100 # _L8: # test al, 8 # jz _H1 # or edx, 0x00000001 # _H1: # mov [edi], edx # add edi, 4 # mov edx, 0x30303030 # test ah, 1 # jz _H2 # or edx, 0x01000000 # _H2: # test ah, 2 # jz _H4 # or edx, 0x00010000 # _H4: # test ah, 4 # jz _H8 # or edx, 0x00000100 # _H8: # test ah, 8 # jz _HN # or edx, 0x00000001 # _HN: # mov [edi], edx # add edi, 4 # sub ecx, 1 # jg _Loop # ret 12 #ASMEND #ASM _ASM_HexToStr32 # use32 # mov esi, [esp+4] # mov ecx, [esp+8] # mov edi, [esp+12] # add esi, ecx # mov bx, 0x0FF0 # _Loop: # sub esi, 1 # mov al, [esi] # mov ah, al # and ax, bx # shr al, 4 # cmp al, 0xA # jl _Dec # add al, 7 # _Dec: # add al, 0x30 # cmp ah, 0xA # jl _Dec2 # add ah, 7 # _Dec2: # add ah, 0x30 # mov [edi], ax # add edi, 2 # sub ecx, 1 # jg _Loop # ret 12 #ASMEND #ASM _ASM_DecToHex64 # use64 ;####################################################### ;# Char to UINT Array ;####################################################### # mov r9, rcx # mov r10, r9 # mov r15d, edx # movdqu xmm7, [r8] # movdqu xmm6, [r8+16] # movdqu xmm5, [r8+32] # pxor xmm4, xmm4 # movdqu xmm3, [r8+48] ;xmm7 = 0x30303030303030303030303030303030 ;xmm6 = 0x0000000000000000FF00000000000000 ;xmm5 = 10000, 1000, 100, 10, 10000, 1000, 100, 10 ;xmm4 = 0, 0, 0, 0 ;xmm3 = 10000, 10000, 1, 1 # xor r14d, r14d # align 16 # _LoopChar: # movdqu xmm0, [r9] # psubd xmm0, xmm7 # movdqa xmm1, xmm0 # punpcklbw xmm0, xmm4 ;Char 1-8 # pmaddwd xmm0, xmm5 # pshufd xmm2, xmm0, 0xD4 # pmuludq xmm2, xmm3 # pshufd xmm0, xmm0, 0xE7 # paddd xmm2, xmm0 # pshufd xmm0, xmm2, 0xE6 # paddd xmm0, xmm2 # pand xmm1, xmm6 # psrldq xmm1, 8 # paddd xmm0, xmm1 ;123456789 # movd [r10], xmm0 # add r14d, 1 # add r9, 9 # add r10, 4 # sub r15d, 9 # jg _LoopChar ;####################################################### ;# UINT to UINT64 ;####################################################### # movdqu xmm7, [r8+64] # movdqu xmm6, [r8+80] # mov r9, rcx # mov r15d, r14d # _Loop64: # movdqu xmm0, [r9] # pshufd xmm1, xmm0, 0x31 # pand xmm1, xmm6 # pmuludq xmm0, xmm7 # paddq xmm0, xmm1 # movdqu [r9], xmm0 # add r9, 16 # sub r15d, 4 # jg _Loop64 ;####################################################### ;# BigDiv ;####################################################### # mov r9, rcx # mov r10, rcx # mov r15d, r14d # mov r13, 1000000000000000000 # align 16 # _LoopDiv: # mov r15d, r14d # mov r9, r10 # xor rax, rax # align 16 # _LoopBigDiv: # xor rdx, rdx # mul r13 # add rax, [r9] # adc rdx, 0 # mov [r9], rdx # add r9, 8 # sub r15d, 2 # jg _LoopBigDiv # mov [r10], rax # add r10, 8 # sub r14d, 2 # jg _LoopDiv # ret #ASMEND #ASM _ASM_HexToBinStr64 # use64 # add rcx, rdx # mov r9w, 0x0FF0 # _Loop: # sub rcx, 1 # mov al, [rcx] # mov ah, al # and ax, r9w # shr al, 4 # mov r10d, 0x30303030 # test al, 1 # jz _L2 # or r10d, 0x01000000 # _L2: # test al, 2 # jz _L4 # or r10d, 0x00010000 # _L4: # test al, 4 # jz _L8 # or r10d, 0x00000100 # _L8: # test al, 8 # jz _H1 # or r10d, 0x00000001 # _H1: # mov [r8], r10d # add r8, 4 # mov r10d, 0x30303030 # test ah, 1 # jz _H2 # or r10d, 0x01000000 # _H2: # test ah, 2 # jz _H4 # or r10d, 0x00010000 # _H4: # test ah, 4 # jz _H8 # or r10d, 0x00000100 # _H8: # test ah, 8 # jz _HN # or r10d, 0x00000001 # _HN: # mov [r8], r10d # add r8, 4 # sub edx, 1 # jg _Loop # ret #ASMEND #ASM _ASM_HexToStr64 # use64 # add rcx, rdx # mov r9w, 0x0FF0 # _Loop: # sub rcx, 1 # mov al, [rcx] # mov ah, al # and ax, r9w # shr al, 4 # cmp al, 0xA # jl _Dec # add al, 7 # _Dec: # add al, 0x30 # cmp ah, 0xA # jl _Dec2 # add ah, 7 # _Dec2: # add ah, 0x30 # mov [r8], ax # add r8, 2 # sub edx, 1 # jg _Loop # ret #ASMEND Func _FASM_StructCreateBCA16($bBinaryCode) Local $iSize = BinaryLen($bBinaryCode) Local $aResult = DllCall("kernel32.dll", "ptr", "VirtualAlloc", "ptr", 0, "ulong_ptr", $iSize + 16, "dword", 0x00001000, "dword", 0x00000040) If @error Or Not $aResult[0] Then Return SetError(1, 0, False) Local $pStruct = Number($aResult[0]) $pStruct = $pStruct + 16 - Mod($pStruct, 16) Local $tStruct = DllStructCreate("byte[" & $iSize & "];", $pStruct) DllStructSetData($tStruct, 1, $bBinaryCode) Return $pStruct EndFunc ;==>_FASM_StructCreateBCA16