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

 WASM Phorum —› WASM.A&O —› Глюки с dwtoa (masm32.lib)

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


Дата: Июл 28, 2004 14:26:00

Использую функцию dwtoa из masm32.lib (пакет masm32v8.2 by Hutch). При попытке преобразовать число 7FFFEFDF возвращает "214747952/" a не "2147479519". Откуда берется "/"? Где-то ошибка в алгоритме преобразования :(


Дата: Июл 28, 2004 16:43:36

Кстати, вот код:
dwtoa proc dwValue:DWORD, lpBuffer:DWORD

    push ebx
    push esi
    push edi

    mov eax, dwValue
    mov edi, [lpBuffer]

    or eax,eax
    jnz sign
    
  zero:
    mov word ptr [edi],30h
    jmp dw2asc
    
  sign:
    jns pos
    mov byte ptr [edi],'-'
    neg eax
    inc edi

  pos:      
    mov ecx,429496730
    mov esi, edi

    .while (eax > 0)
      mov ebx,eax
      mul ecx
      mov eax,edx
      lea edx,[edx*4+edx]
      add edx,edx
      sub ebx,edx
      add bl,'0'
      mov [edi],bl
      inc edi
    .endw

    mov byte ptr [edi], 0       ; terminate the string

    ; We now have all the digits, but in reverse order.

    .while (esi < edi)
      dec edi
      mov al, [esi]
      mov ah, [edi]
      mov [edi], al
      mov [esi], ah
      inc esi
    .endw

    dw2asc:

    pop edi
    pop esi
    pop ebx

    ret

dwtoa endp
Ошибка где-то в 1-м цикле while. После выполнения первого прохода "add bl,'0'" в регистре (bl) число, на 1 меньшее кода нуля.


Дата: Июл 28, 2004 17:42:50

Ага. Там ещё один, кроме этого, косяк есть.

http://board.win32asmcommunity.net/showthread.php?s=c4227f37df73dfb0c7 b43486d62b16be&threadid=6007


Дата: Июл 28, 2004 18:18:33

Функция с багом! НАпиши перевод сам типа
mov edi,0Ah
mov ecx,10
to:
lea esi,string+11
xor edx,edx
div edi
add edx,30h
add esi,ecx
mov [esi],dl
loop to
оптимизируешь деление добавляешь знак и убераешь слева нули


Дата: Июл 28, 2004 21:11:04

Four-F
Спасибо, почитал и исправил :) Странно, что Hutch этого не сделал, ведь баг нашли еще в 2002.

kamatoz
Написанием собственной функции ошибку в masm32.lib не решишь. Да и проще 2 строчки в готовой подправить, чем самому с нуля над переводом париться ;)

P.S.
Кому надо - исправленная версия в аттаче :)

_1989752027__DWTOA.ASM


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