hex - dword

Тема в разделе "WASM.WIN32", создана пользователем xSoft, 12 июл 2006.

  1. xSoft

    xSoft New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2006
    Сообщения:
    17
    Привет всем!

    Подкиньте пожалуйста процедурку для перевода HEX строки в переменную DWord.

    К примеру так: hex2dw proc szHexstr
    На вход - ссылка на строковый буфер(фиксированного размера=8 байт) hex-строчки, на выходе в EAX десятичное ее значение.

    В общем-то я и сам это сделал, но сечас смеяться будете долго :)

    Для этого мне понадобилось:

    Процедурка умножения
    (Множимое, множитель)

    Код (Text):
    1. Mult Proc DW_Mult:DWord, DW_Size:DWord
    2.     Local   var1:DWORD
    3.     Fild    DW_Mult
    4.     Fild    DW_Size
    5.     Fmul
    6.     Fistp   var1
    7.     Mov     eax, var1
    8.     Ret
    9. Mult EndP
    Процедурка возведения в степень :)
    (Число, Показатель степени)

    Код (Text):
    1. Step Proc DW_Step:DWord, DW_Size:DWord
    2.     Local DW_Temp:DWord
    3.     Pusha
    4.     Cmp     DW_Size, 0
    5.     Je      Step_Zero
    6.     Cmp     DW_Size, 1
    7.     Je      Step_None
    8.     Mov     EAX, DW_Step
    9.     Mov     ECX, 1
    10.     Mov     DW_Temp, EAX
    11. Step_Loop:
    12.     Invoke  Mult, DW_Temp, DW_Step
    13.     Mov     DW_Temp, EAX
    14.     Inc     ECX
    15.     Cmp     ECX, DW_Size
    16.     Jne     Step_Loop
    17.     Popa
    18.     Mov     EAX, DW_Temp
    19.     Ret
    20. Step_None:
    21.     Mov     EAX, DW_Step
    22.     Ret
    23. Step_Zero:
    24.     Mov     EAX, 1
    25.     Ret
    26. Step EndP
    Процедурка...хм...Ну это тоже нужная такая процедурка, она из ASC символа значение A,B,C,D,E,F приравниет к реальным ну и цифры ессно :))


    Код (Text):
    1. Hexb Proc BT_Hexb:Byte
    2.     Xor     EAX, EAX
    3.     Mov     AL, BT_Hexb
    4.     .If AL > 57
    5.         Sub AL, 55
    6.     .Else
    7.         Sub AL, 48
    8.     .EndIf
    9.     Ret     4
    10. Hexb EndP
    И, наконец, о чудо! Процедура мега-мозг, которая всем этим заправляет и конвертирует из HEX в DWORD! :)

    Код (Text):
    1. Hexd Proc DW_Text:DWord
    2.     Local   DW_Hexd:DWord
    3.     Local   DW_Temp:DWord
    4.     Local   DW_Retn:DWord
    5.     Pusha
    6.     Mov     EDX, DW_Text
    7.     Xor     ECX, ECX
    8. Hexd_Loop:
    9.  
    10.     Mov     AL, [EDX + ECX]
    11.  
    12.     Cmp     ECX, 8
    13.     Je      Hexd_Exit
    14.  
    15.     Invoke  Hexb, AL
    16.     Mov     DW_Hexd, EAX
    17.  
    18.     Mov     EBX, 7
    19.     Sub     EBX, ECX
    20.  
    21.     Invoke  Step, 16, EBX
    22.     Mov     DW_Temp, EAX
    23.  
    24.     Invoke  Mult, DW_Hexd, DW_Temp
    25.     Add     DW_Retn, EAX
    26.  
    27.     Inc     ECX
    28.  
    29.     Jmp     Hexd_Loop
    30.  
    31. Hexd_Exit:
    32.     Popa
    33.     Mov     EAX, DW_Retn
    34.     Ret
    35. Hexd EndP
    Да, это все работает. Медленно правда :)
    Очень хотелось бы увидеть как правильно и компактно преобразовать HEX значение в число DWord.

    Спасибо за внимание :)
     
  2. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
  3. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
  4. xSoft

    xSoft New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2006
    Сообщения:
    17
    То что надо! Большое спасибо :)