Посл.ответ |
Сообщение |
Ранг: 53.0 (постоянный) Активность: 0.05↘0 Статус: Участник
|
Создано: 23 марта 2006 06:19 · Поправил: alex111 · Личное сообщение · #1
Как в ассемблере перевести строку в HEX,
но надо чтоб напр. Ascii-322112 HEX-322112
У меня выходит только как обычно HEX-333232313132
| Сообщение посчитали полезным: |
|
Ранг: 253.9 (наставник) Активность: 0.13↘0 Статус: Участник
|
Создано: 23 марта 2006 07:07 · Личное сообщение · #2
Скорее всего, сначала StrToInt, а потом IntToHex. По крайней мере, на Delphi и C++Builder это так... =)
----- MicroSoft? Is it some kind of a toilet paper? | Сообщение посчитали полезным: |
Ранг: 253.9 (наставник) Активность: 0.13↘0 Статус: Участник
|
Создано: 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.13↘0 Статус: Участник
|
Создано: 23 марта 2006 07:18 · Поправил: Tim · Личное сообщение · #4
Погоди, ведь это Delphi функция HexToDec!
...
или нет?
Короче, запутал ты меня, как и себя, наверное...
----- MicroSoft? Is it some kind of a toilet paper? | Сообщение посчитали полезным: |
Ранг: 50.7 (постоянный) Активность: 0.06↘0 Статус: Участник
|
Создано: 23 марта 2006 07:22 · Личное сообщение · #5
Вот пример на FASM'e
Есть 2 функции StrToInt и IntToStr , но он позволяют перевести строку в число любой системы исчисления и наоборот... Вообщем посмотри 645b_basecnv.asm.zip
| Сообщение посчитали полезным: |
Ранг: 251.8 (наставник), 17thx Активность: 0.12↘0 Статус: Участник 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.12↘0 Статус: Участник Seeker
|
Создано: 23 марта 2006 09:01 · Поправил: =TS= · Личное сообщение · #7
alex111
Закинешь это все в функцию, вместо
lea esi,szStr
lea edi,baHex
задашь нормально параметры
ЗЫ. szStr -- ASCIIZ строка -- должна завершаться нулем...
----- DREAMS CALL US | Сообщение посчитали полезным: |
Ранг: 53.0 (постоянный) Активность: 0.05↘0 Статус: Участник
|
Создано: 23 марта 2006 09:10 · Личное сообщение · #8
Tim пишет:
функции StrToInt и IntToHex
а если в строке есть символы "a..f" StrToInt выкинет ошибку.
=TS= пишет:
ASCIIZ строка -- должна завершаться нулем...
так у меня не получится, строку считываю с Edit.Text
| Сообщение посчитали полезным: |
Ранг: 793.4 (! !), 568thx Активность: 0.74↘0 Статус: Участник Шаман
|
Создано: 23 марта 2006 09:18 · Личное сообщение · #9
Если ты пишешь на Delphi, то зачем ассемблером переводишь? Tim правильно сказал - юзай StrToInt, только вот так:
StrToInt('$'+szStr);
Бакс будет указывать на то, что это HEX строка, иначе вылетит ошибка, если в строке будут символы A..F.
----- Yann Tiersen best and do not fuck | Сообщение посчитали полезным: |
Ранг: 251.8 (наставник), 17thx Активность: 0.12↘0 Статус: Участник 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.12↘0 Статус: Участник Seeker
|
Создано: 23 марта 2006 09:26 · Личное сообщение · #11
или вообще заюзай HexToBin
----- DREAMS CALL US | Сообщение посчитали полезным: |
Ранг: 53.0 (постоянный) Активность: 0.05↘0 Статус: Участник
|
Создано: 23 марта 2006 09:28 · Личное сообщение · #12
Thanks всем
| Сообщение посчитали полезным: |
Ранг: 309.8 (мудрец), 21thx Активность: 0.17↘0 Статус: Участник
|
Создано: 23 марта 2006 15:51 · Личное сообщение · #13
какой StrToInt? этож дельфийская SysUtils +~60Kb в exe...
юзай masmlib.lib... там всё есть...
----- Shalom ebanats! | Сообщение посчитали полезным: |
Ранг: 199.6 (ветеран), 12thx Активность: 0.1↘0 Статус: Участник 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.17↘0 Статус: Участник
|
Создано: 23 марта 2006 19:23 · Личное сообщение · #15
собственно это и реализовано в masmlib...
----- Shalom ebanats! | Сообщение посчитали полезным: |
Ранг: 53.0 (постоянный) Активность: 0.05↘0 Статус: Участник
|
Создано: 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
Спасибо
| Сообщение посчитали полезным: |