конвертирование HEX ASCII и обратно

Тема в разделе "WASM.BEGINNERS", создана пользователем hack_virii, 21 июл 2011.

  1. hack_virii

    hack_virii New Member

    Публикаций:
    0
    Регистрация:
    7 июн 2009
    Сообщения:
    71
    Доброго времени суток!

    Уважаемые, вопрос избит. Находил похожие темы, но примеры либо не прикручиваются, либо не подходят.
    Меня даже больше интересует теория и маленький пример, если можно.
    1) Прочитал пост http://wasm.ru/forum/viewtopic.php?id=39419&p=10 :cry: :lol:
    Попытался написать маленький конвертер HEX->ASCII и обратно.
    Скопипастил процедуру (имеется также похожая, но хочется вообще свою)):
    Код (Text):
    1.  ; by Alexander Yackubtchik
    2. htodw proc String:DWORD
    3.  
    4.   ; -----------------------------------
    5.   ; Convert hex string into dword value
    6.   ; Return value in eax
    7.   ; -----------------------------------
    8.  
    9.     push ebx
    10.     push esi
    11.     push edi
    12.  
    13.     mov edi, String
    14.     mov esi, String
    15.  
    16.      ALIGN 4
    17.  
    18.   again:
    19.     mov al,[edi]
    20.     inc edi
    21.     or  al,al
    22.     jnz again
    23.     sub esi,edi
    24.     xor ebx,ebx
    25.     add edi,esi
    26.     xor edx,edx
    27.     not esi             ;esi = lenth
    28.  
    29.   .while esi != 0
    30.     mov al, [edi]
    31.     cmp al,'A'
    32.     jb figure
    33.     sub al,'a'-10
    34.     adc dl,0
    35.     shl dl,5            ;if cf set we get it bl 20h else - 0
    36.     add al,dl
    37.     jmp next
    38.   figure:
    39.     sub al,'0'
    40.   next:
    41.     lea ecx,[esi-1]
    42.     and eax, 0Fh
    43.     shl ecx,2           ;mul ecx by log 16(2)
    44.     shl eax,cl          ;eax * 2^ecx
    45.     add ebx, eax
    46.     inc edi
    47.     dec esi
    48.   .endw
    49.  
    50.     mov eax,ebx
    51.  
    52.     pop edi
    53.     pop esi
    54.     pop ebx
    55.  
    56.     ret
    57.  
    58. htodw endp
    Вроде работает. Но прикрутить к массиву не смог. Недопетрил.
    Функция возвращает значение в eax.
    Код (Text):
    1. .data
    2. var  DD   ?
    Например, было 31 30 31 32.
    Получаем 0Ah, 0Ch.

    Вопрос: как мне получив значение 1-го и 2-го ASCII->HEX'ов их объединить?
    Где-то недоучился, видимо. (Вначале =\).
    Как поместить число, скажем, 0Bh в регистр AL, сдвинуть его (влево или вправо) и добавить 0Ah.
    Тот же вопрос касаемо не только регистра, но и памяти.

    И если несложно, вкратце объяснить работу процедуры.
    Может есть более простой и понятный способ?


    Буду признателен за ликбез.




    ЗЫ. прошу сильно не пинать, как любит товарищ Clerk.)
     
  2. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
  3. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    Помню в книге Марека (%writer_second_name%) есть такая функция. С подробнейшим объяснением. Помню, тут кто-то уже задолбался её рекламировать.
     
  4. hack_virii

    hack_virii New Member

    Публикаций:
    0
    Регистрация:
    7 июн 2009
    Сообщения:
    71
    Mikl___, круто! Спасибо!
    Igor1024, благодарю! Изучу!
    Присоединяюсь к предложению закрепить тему.

    Подскажите, пожалуйста, причину ошибки ERROR_INVALID_USER_BUFFER (000006F8) после функции WriteFile.
    INVOKE WriteFile,
    fileHandle, ADDR var2,ADDR pos,
    ADDR byteCount, 0
    Прочитал, что надо освободить файл от потоков. Выполнил функцию CancelIO. Ничего не меняется.

    Также читал про выравнивания буфера.
    Пробовал ALIGN 1 и ALIGN 2 перед объявлением var BYTE 4096 DUP(0). Та же самая ошибка.

    В чем может быть причина?
     
  5. hack_virii

    hack_virii New Member

    Публикаций:
    0
    Регистрация:
    7 июн 2009
    Сообщения:
    71
    Извините, натупил!(
     
  6. Ezrah

    Ezrah Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    411
    В том, что в третьем параметре передаётся количество записываемых байт, а не адрес некой переменной.