;***************************************************
;Hexadecimal String to DWORD OR QWORD(MMX)
;Author bitRAKE  http://madwizard.org/programming/snippets?id=43
;Updated  By  G-Spider
;ml  /c /coff hex.asm 
;link /subsystem:windows hex.obj
;***************************************************
.586
.MMX
.model flat,stdcall
option casemap:none

include windows.inc
include user32.inc
include kernel32.inc

includelib user32.lib
includelib kernel32.lib

;***************************************************
.data

szTitleSave    db  'good luck',0
fmt            db  '%X%X',0

ALIGN 16
_0fill          db  16  dup(0)            ;Need! When _StringLong<16
_lpString      db "89aBcDeF12aCdEfF",0  ;Test1 <====note! Have Zero End
;_lpString      db "89aBcDeF12",0        ;Test2
;_lpString      db "89aBcDe",0            ;Test3
;_lpString      db "89aBcDeF12345678aD",0 ;Test4
_StringLong    dd $-_lpString-1
 
;_lpString      db "89aBcDeF12345678"    ;<====note!  NO Zero End
;_StringLong    dd $-_lpString 

ALIGN 16        ;<==Note!
_3Hex          qword  3030303030303030h
_9Hex          qword  0909090909090909h
_7Hex          qword  0707070707070707h
_f0Hex          qword  0f000f000f000f00h 
_0fHex          qword  000f000f000f000fh

.data?
buf         db  16  dup(?)

.code

StrHex2bin PROC lpString:DWORD

        mov        eax,lpString
        movq        mm0,QWORD PTR  
        psubusb    mm0,_3Hex  ; "0" = 0   
        movq        mm1,mm0
        pcmpgtb    mm1,_9Hex  ; letter?     
        pand        mm1,_7Hex
        psubusb    mm0,mm1    ; fix letters
        movq        mm1,mm0 
        pand        mm0,_f0Hex
        pand        mm1,_0fHex
        psrlq      mm0,8 
        packuswb    mm1,mm1   
        packuswb    mm0,mm0   
        psllq      mm1,4       
        por        mm0,mm1           
        movd        eax,mm0       
        bswap      eax 
        ret
StrHex2bin ENDP

StrHex2Qword proc lpString,StringLong

        mov    ebx,lpString
        add    ebx,StringLong
        sub    ebx,16
        push    ebx
        invoke StrHex2bin,ebx
        mov    edx,eax        ;edx=QuadWord.HiDWord
        pop    ebx
        add    ebx,8
        invoke StrHex2bin,ebx ;eax=QuadWord.LoDWord
        ret
StrHex2Qword    endp

start:
invoke  StrHex2Qword,offset _lpString,_StringLong

invoke wsprintf,offset buf,offset fmt,edx,eax
invoke  MessageBox,NULL,offset buf,addr szTitleSave,0

ret
end start
Posted on 2010-10-02 21:20:20 by G-Spider