| Посл.ответ | 
Сообщение | 
 Ранг: 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
 Спасибо
   | Сообщение посчитали полезным:   |