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

 WASM Phorum —› WASM.A&O —› Функция str2all

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


Дата: Июн 29, 2004 23:30:17

Товарищи! Я уже умом тронулся тут, но край как надо реализовать функцию перевода из строки в число. Проблема в том, что число в строке может быть в любом представлении и перевести надо в любую систему. Например 16 -> 10 или наоборот. Систему числа в строке можно указать параметром, желаемую систему числа на выходе тоже. Но я что-то дотупить не могу. Настрадал код, но он переводит только из 16->10, а наоборот.. лучше не видеть.
Если хотите, могу показать. :)
Оптимизировать лучше по размеру.


Дата: Июн 29, 2004 23:41:55

А поэтапно религия не позволяет?
1) Перевести строку в число
2) Перевести число в нужную систему согласно переданному спецификатору. Для этого открываем Кнута.


Дата: Июн 30, 2004 00:25:58

for (i=len-1;i>=0;i--){
num=num*inputBase+(input[i]-'0');
}
len++;
do{
str[i++]=num%outputBase;
num/=outputBase;
}while (num!=0)
str[i]=0;
ReverseString(str);


Дата: Июн 30, 2004 07:35:41

volodya
Так в том-то и задумка была, чтобы одновременно переводить.


Дата: Июн 30, 2004 10:46:48

Ну вот, после пары часов медитации родился код:
str2all:    ; lpBuffer,nBufBase,nNewBase
    push    ebx esi edi
    mov     edi,dword [esp+4+12]
    mov     ecx,dword [esp+8+12]

    xor     esi,esi
    mov     eax,esi
    mov     ebx,eax
  @@:
    inc     esi
    cmp     byte [edi+esi],0
    jne     @B
    dec     esi

    .conv:
        xor     eax,eax
        mov     al,byte [edi]
        sub     al,30h
        push    esi
        cmp     al,10
        jl      @F
        sub     al,7
        @@:
        cmp     esi,0
        jz      @F
        xor     edx,edx
        mul     ecx
        dec     esi
        jnz     @B
        @@:
        pop     esi
        add     ebx,eax
        inc     edi
        dec     esi
    jns     .conv
    mov     ecx,dword [esp+12+12]
    mov     eax,ebx
    xor     ebx,ebx
    @@:
        xor     edx,edx
        div     ecx
        shl     ebx,4
        add     ebx,edx
        test    eax,eax
        jnz     @B
    xor     eax,eax
    @@:
        mov     dl,bl
        and     dl,00001111b
        shl     eax,4
        add     al,dl
        shr     ebx,4
        test    ebx,ebx
        jnz     @B
    pop     edi esi ebx
    retn    8

Сей код из любой системы исчисления переводит в любую (теоретически), при этом преобразует строковое число в числовой вариант.

Вызов на сях: str2all("1356",10,16);

Предлагаю попытаться это дело оптимизировать, а заодно проверить правильность.


Дата: Июн 30, 2004 13:19:18

msvcrt.dll!strtol


Дата: Июн 30, 2004 20:32:53

n0p
Оптимизирую не вдаваясь в правильность работы твоего кода:
> shr ebx,4
test ebx,ebx
jnz @B

   shr     ebx,4
   jnz     @B


> xor esi,esi
mov eax,esi
mov ebx,eax

   xor     esi,esi
   xor     eax,eax
   xor     ebx,ebx


;-)


Дата: Июн 30, 2004 20:46:20 · Поправил: Asterix

n0p

Ещё, в процедуру ты пихаешь, судя по всему, 3-и параметра, тогда нужно поправить стек соответственно
retn 0Ch


cmp esi,0
jz @F

  test esi, esi
  jz @F


А вобще, если вникнуть в логику, то думаю можно гораздо лучше соптимизировать,
некоторые места для оптимизации сразу бросаются в глаза ;-)


Дата: Июн 30, 2004 21:29:39

Да, с возвратом у меня там злобная ашыпка вкралась. %)


Дата: Июл 1, 2004 09:28:43

Вот немного оптимизнутая версия:
str2all:    ; lpBuffer,nBufBase,nNewBase
    push    ebx esi edi
    mov     edi,dword [esp+4+12]
    mov     ecx,dword [esp+8+12]

    xor     esi,esi
    xor     ebx,ebx
  @@:
    inc     esi
    cmp     byte [edi+esi],0
    jne     @B

    .conv:
        xor     eax,eax
        mov     al,byte [edi]
        sub     al,30h
        push    esi
        cmp     al,10
        jl      @F
        sub     al,7
      @@:
        dec     esi
        jz      @F
        xor     edx,edx
        mul     ecx
        jmp     @B
      @@:
        pop     esi
        add     ebx,eax
        inc     edi
        dec     esi
    jnz     .conv
    mov     esi,dword [esp+12+12]
    mov     eax,ebx
    xor     ebx,ebx
    xor     ecx,ecx
    @@:
        xor     edx,edx
        div     esi
        shl     edx,cl
        add     cl,4
        add     ebx,edx
        test    eax,eax
        jnz     @B
    mov     eax,ebx
    pop     edi esi ebx
    retn    12

Что, никому не нужно чтоли? А как же тяга к оптимизации? Я понимаю, что msvcrt юзать лучше - думать не надо, но ведь это не тема, дорогие друзья. Вы код его видели? Это же совершенно недзенская вещь!

Вобщем, жду, когда хоть в ком-нибудь проснется тяга к прекрасному.


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