Сейчас на форуме: bartolomeo, hgdagon (+7 невидимых)

 eXeL@B —› Программирование —› strToHex
Посл.ответ Сообщение

Ранг: 53.0 (постоянный)
Активность: 0.050
Статус: Участник

Создано: 23 марта 2006 06:19 · Поправил: alex111
· Личное сообщение · #1

Как в ассемблере перевести строку в HEX,
но надо чтоб напр. Ascii-322112 HEX-322112
У меня выходит только как обычно HEX-333232313132



Ранг: 253.9 (наставник)
Активность: 0.130
Статус: Участник

Создано: 23 марта 2006 07:07
· Личное сообщение · #2

Скорее всего, сначала StrToInt, а потом IntToHex. По крайней мере, на Delphi и C++Builder это так... =)

-----
MicroSoft? Is it some kind of a toilet paper?




Ранг: 253.9 (наставник)
Активность: 0.130
Статус: Участник

Создано: 23 марта 2006 07:16
· Личное сообщение · #3

Можно сделать так:
1. Найти функции StrToInt и IntToHex на C или C++.
2. Вставить их в программу HelloWorld и скомпилировать.
3. Использовать бинарный код функций из полученной программы.
---------------------------------------------------------------------- ------------------
4. Опционально. Почистить код от ненужных операторов.

P.S. Я так всегда делаю, когда не могу допереть на АСМе, т.к. не силен в последнем.

-----
MicroSoft? Is it some kind of a toilet paper?




Ранг: 253.9 (наставник)
Активность: 0.130
Статус: Участник

Создано: 23 марта 2006 07:18 · Поправил: Tim
· Личное сообщение · #4

Погоди, ведь это Delphi функция HexToDec!
...
или нет?

Короче, запутал ты меня, как и себя, наверное...

-----
MicroSoft? Is it some kind of a toilet paper?




Ранг: 50.7 (постоянный)
Активность: 0.060
Статус: Участник

Создано: 23 марта 2006 07:22
· Личное сообщение · #5

Вот пример на FASM'e
Есть 2 функции StrToInt и IntToStr , но он позволяют перевести строку в число любой системы исчисления и наоборот... Вообщем посмотри

645b_basecnv.asm.zip




Ранг: 251.8 (наставник), 17thx
Активность: 0.120
Статус: Участник
Seeker

Создано: 23 марта 2006 08:57
· Личное сообщение · #6

вот рабочий код:

pushad
lea esi,szStr
lea edi,baHex
push esi
@@Next:
lodsb
test al,al
jnz @@Next
dec esi
mov eax,esi
pop esi
sub eax,esi
mov ecx,eax
test eax,1
jz @@NoInc
inc ecx
@@NoInc:
shr ecx,1
xor edx,edx
test eax,1
jnz @@Loop_2
@@Loop:
xor edx,edx
call @@Convert
shl edx,4
@@Loop_2:
call @@Convert
mov byte ptr [edi+ecx-1], dl
loop @@Loop
@@Exit:
popad
ret
@@Convert:
lodsb
sub al,30h
cmp al,9
jna @@Convert_2
sub al,7
@@Convert_2:
or dl,al
ret


-----
DREAMS CALL US





Ранг: 251.8 (наставник), 17thx
Активность: 0.120
Статус: Участник
Seeker

Создано: 23 марта 2006 09:01 · Поправил: =TS=
· Личное сообщение · #7

alex111
Закинешь это все в функцию, вместо
lea esi,szStr
lea edi,baHex
задашь нормально параметры

ЗЫ. szStr -- ASCIIZ строка -- должна завершаться нулем...

-----
DREAMS CALL US




Ранг: 53.0 (постоянный)
Активность: 0.050
Статус: Участник

Создано: 23 марта 2006 09:10
· Личное сообщение · #8

Tim пишет:
функции StrToInt и IntToHex

а если в строке есть символы "a..f" StrToInt выкинет ошибку.
=TS= пишет:
ASCIIZ строка -- должна завершаться нулем...

так у меня не получится, строку считываю с Edit.Text




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 23 марта 2006 09:18
· Личное сообщение · #9

Если ты пишешь на Delphi, то зачем ассемблером переводишь? Tim правильно сказал - юзай StrToInt, только вот так:
StrToInt('$'+szStr);

Бакс будет указывать на то, что это HEX строка, иначе вылетит ошибка, если в строке будут символы A..F.

-----
Yann Tiersen best and do not fuck





Ранг: 251.8 (наставник), 17thx
Активность: 0.120
Статус: Участник
Seeker

Создано: 23 марта 2006 09:20
· Личное сообщение · #10

alex111
Какой это тогда нафик асм?
Ты на делфях программишь или на билдере? Есди на билдере, то там есть вроде у строки метод c_str()
Если на делфях, то там строки ASCIIZ совместимые...
Для игнорирования регистра надо немножко изменить код:

...
@@Convert:
lodsb
sub al,30h
cmp al,9
jna @@Convert_2
and al,0Fh
add al,9
@@Convert_2:
or dl,al
ret


-----
DREAMS CALL US





Ранг: 251.8 (наставник), 17thx
Активность: 0.120
Статус: Участник
Seeker

Создано: 23 марта 2006 09:26
· Личное сообщение · #11

или вообще заюзай HexToBin

-----
DREAMS CALL US




Ранг: 53.0 (постоянный)
Активность: 0.050
Статус: Участник

Создано: 23 марта 2006 09:28
· Личное сообщение · #12

Thanks всем



Ранг: 309.8 (мудрец), 21thx
Активность: 0.170
Статус: Участник

Создано: 23 марта 2006 15:51
· Личное сообщение · #13

какой StrToInt? этож дельфийская SysUtils +~60Kb в exe...
юзай masmlib.lib... там всё есть...

-----
Shalom ebanats!





Ранг: 199.6 (ветеран), 12thx
Активность: 0.10
Статус: Участник
www.uinc.ru

Создано: 23 марта 2006 17:06 · Поправил: DrGolova
· Личное сообщение · #14

Ну прямо как дети малые. За пару минут написал функцию на С, и рипанул асмовый код IDA'й:

unsigned long StrToHex(char* Str)
{
unsigned long Result;
char C;

for ( Result = 0; ; )
{
C = *Str++;
if ( C >= '0' && C <= '9' )
Result = Result * 16 + (C - '0');
else if ( (C |= 0x20) >= 'a' && C <= 'f' )
Result = Result * 16 + (C - 'a') + 10;
else
return Result;
}
}



StrToHex:
mov edx, [esp+4]
xor eax, eax
sth_chr:
movsx ecx, byte ptr [edx]
inc edx
cmp ecx, '0'
jl short sth_lit
cmp ecx, '9'
jg short sth_lit
shl eax, 4
lea eax, [eax+ecx-'0']
jmp short sth_chr
sth_lit:
or ecx, 20h
cmp ecx, 'a'
jl short sth_done
cmp ecx, 'f'
jg short sth_done
shl eax, 4
lea eax, [eax+ecx-'W']
jmp short sth_chr
sth_done:
retn




Ранг: 309.8 (мудрец), 21thx
Активность: 0.170
Статус: Участник

Создано: 23 марта 2006 19:23
· Личное сообщение · #15

собственно это и реализовано в masmlib...

-----
Shalom ebanats!




Ранг: 53.0 (постоянный)
Активность: 0.050
Статус: Участник

Создано: 24 марта 2006 18:15 · Поправил: alex111
· Личное сообщение · #16

DrGolovaТвой рипнутый код подошел как нельзя лучше, правда пришлось чуть подогнать чтоб делфи работало.
asm
//int 3;
pushad;
@@StrToHex: ;
mov edx, s ;
xor eax, eax ;
@@sth_chr: ;
movsx ecx, byte ptr [edx] ;
inc edx ;
cmp ecx, '0' ;
jl @@sth_lit ;
cmp ecx, '9' ;
jg @@sth_lit ;
shl eax, 4 ;
lea eax, [eax+ecx-'0'] ;
jmp @@sth_chr ;
@@sth_lit: ;
or ecx, 20h ;
cmp ecx, 'a' ;
jl @@sth_done ;
cmp ecx, 'f' ;
jg @@sth_done ;
shl eax, 4 ;
lea eax, [eax+ecx-'W'] ;
jmp @@sth_chr ;
@@sth_done: ;
//int 3;

popad

Спасибо


 eXeL@B —› Программирование —› strToHex
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати