|
|
| Посл.отвђт | Сообщен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 |