· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› HEX2ASCII

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Ноя 16, 2003 20:28:07

Хочу алгоритм(ы) перевода HEX2ASCII, можно исходник(и).
Для затравки, читаем у Зубкова:


-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -
Например: пусть описано макроопределение hex2ascii, переводящее
шестнадцатеричное число, находящееся в регистре AL, в ASCII-код
соответствующей шестнадцатеричной цифры:
hex2ascii   macro
            cmp      al,10
            sbb      al,69h
            das
            endm

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -

Гениально, но не работает :-)
Или я вообще ничего не понимаю %)


Дата: Ноя 16, 2003 21:18:12

Для затравки, читаем у Зубкова

Лентяй. Для затравки читаем у Рендалла Хайда. Зубков стрындил половину сорцов оттуда. Втихую.


Дата: Ноя 16, 2003 22:26:12 · Поправил: Asterix

volodya

Посмотрел html версию Рендалла Хайда в сети, ты прав,
действительно стоящая вещь, жалко что только на английском.


Дата: Ноя 16, 2003 23:10:23

На сайте лежит pdf. Если будут сильные проблемы - пиши тогда, что ли :)


Дата: Ноя 17, 2003 04:17:13 · Поправил: Asterix

Раз никто ничего не предложил, то я написал свой вариант,
уверен что это можно улучшить.


aam_16 MACRO
       db 0D4h,010h
       ENDM

.data

Register dd 0

.code

start:
  mov ax, 0AFh ; байт, который конвертируем, ну конечно WORD, но конвертируем то мы BYTE ;-)
  aam_16
  or ax, 3030h
  .if al > 39h
      add al, 07h
  .endif
  .if ah > 39h
      add ah, 07h
  .endif
  xchg al, ah
  mov WORD PTR [Register], ax
  mov eax, OFFSET Register
  xor ecx, ecx
  invoke MessageBox, ecx, eax, ecx, ecx


Дата: Ноя 17, 2003 14:04:50

[ Asterix: Гениально, но не работает :-) ]

Да нет, работает.


Дата: Ноя 17, 2003 19:25:43 · Поправил: Asterix

Four-F

Это как же?

Вот, по порядку:
xor eax, eax
mov al, 0FFh ; конвертируем BYTE=FFh
cmp al, 10   ; устанавливает флаги
sbb al, 69h  ; <--после этой команды eax=00000096
das  ; <--после этой команды ничего не изменилось


Дата: Ноя 18, 2003 00:45:23 · Поправил: Asterix

[ Four-F: Да нет, работает.]

Я понял что Зубков имел ввиду(!), вот такой код будет работать:
aam_16 macro
       db 0D4h,010h
       endm
       
hex2ascii   macro
            cmp      al,10
            sbb      al,69h
            das
            endm

.DATA

Register dd 0

.CODE

start:

mov al, 0AFh  ; <--байт, который конвертируем
aam_16
hex2ascii
xchg al, ah
hex2ascii

mov WORD PTR [Register], ax
  mov eax, OFFSET Register
  xor ecx, ecx
  invoke MessageBox, ecx, eax, ecx, ecx


Дата: Ноя 18, 2003 00:58:44

proc check4bitsstate,lbyte ;
enter
mov eax,[lbyte]
add eax,48
cmp eax,58
jl @F
add eax,7
@@:
return

proc byteto4bits,lbyte ; Return eax,ecx
enter
mov eax,[lbyte]
movzx eax,al
mov ecx,eax
and eax,11110000b
shr eax,4
and ecx,1111b
push eax
stdcall check4bitsstate,ecx
mov ecx,eax
call check4bitsstate
return


Дата: Ноя 18, 2003 01:13:05

Последний вариант и думаю тему можно закрывать ;-)
aam_16 macro
       db 0D4h,010h
       endm

.DATA

hex_table db "0123456789ABCDEF",0
Register  dd 0

.CODE

start:

mov al, 0CFh
aam_16
mov ebx, OFFSET hex_table
xlatb
xchg al, ah
xlatb

mov WORD PTR [Register], ax


Дата: Ноя 18, 2003 01:18:59

Songoku

Используй кнопку CODE или пиши теги вручную
[code]
[/code]


Дата: Ноя 18, 2003 10:05:39

для subj входящее число должно быть меньше 0Fh! Пример:
mov eax,1ABCDEF3h
mov cx,041ch ;для 32 бит числа, 040Ch для 16 бит,0404h для 8 бит.
loop1:
push eax
shr eax,cl
and al,0Fh
cmp al,10
sbb al,69h
das
int 29h
pop eax
sub cl,ch
jnc loop1


Дата: Ноя 18, 2003 18:02:42

Вот нарыл в своих исходниках :)
; Рекурсивная ф-ция перевода HEX DWORD в ASCII
; Вход EAX - DWORD
; Выход [edx] - ASCII
HexToStrDW:
mov cx, '0h'
mov [edx+9], cl
mov [edx], ch
inc edx
push eax
ror eax, 16
call RecHexToStrW
pop eax
RecHexToStrW:
push eax
ror eax, 8
call RecHexToStrB
pop eax
RecHexToStrB:
push eax
ror eax, 4
call RecHexToStrL
pop eax
RecHexToStrL:
and al, 00001111b
cmp al, 0ah
jc NotAdd
add al, 39;7
NotAdd:
add al, 30h
mov [edx], al
inc edx
;
ret


Дата: Ноя 18, 2003 20:19:23 · Поправил: Quantum

Asterix
Я кому исходник UUPX высылал? Там реализован сабж для цепочки байт любой длины.


Дата: Ноя 18, 2003 20:45:30

Quantum

Я его смотрел, длина не проблема, решается простым циклом, просто я
хотел ещё порыть на эту тему ;-)

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.082