· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.WIN32 —› dw2a - число в строку - как красивше?

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


Дата: Фев 17, 2003 18:46:50

число в double word - требуется изобразить в виде строки. Кто знает как ая процедурка оптимальная?


Дата: Фев 17, 2003 18:49:33

извиняюсь! Здесь уже эта тема поднималась. Еще раз извиняюсь.


Дата: Фев 27, 2003 11:33:16

вот вариант от amd - без цикла:

u2str proc near
;eax - number
;edi - str
push ebx
push ecx
push edx
MOV ECX, EAX ;save original argument
MOV EDX, 89705F41h ;1e-9*2^61 rounded
MUL EDX ;divide by 1e9 by multplying with reciprocal
ADD EAX, EAX ;round division result
ADC EDX, 0 ;EDX<31:29> = argument / 1e9
SHR EDX, 29 ;leading decimal digit, 0...4
MOV EAX, EDX ;leading digit
MOV EBX, EDX ;init digit accumulator with leading digit
IMUL EAX, 1000000000 ;leading digit * 1e9
SUB ECX, EAX ;subtract (leading digit * 1e9) from argument
OR DL, '0' ;convert leading digit to ASCII
MOV [EDI], DL ;store leading digit
CMP EBX, 1 ;any non-zero digit yet ?
SBB EDI, -1 ;yes->increment ptr, no->keep old ptr
MOV EAX, ECX ;get reduced argument < 1e9
MOV EDX, 0abcc7712h ;2^28/1e8 * 2^30 rounded up
MUL EDX ; divide reduced
SHR EAX, 30 ; argument < 1e9 by 1e8
LEA EDX, [EAX+4*EDX+1] ; converting it into 4.28 fixed
MOV EAX, EDX ; point format such that 1.0 = 2^28
SHR EAX, 28 ;next digit
AND EDX, 0fffffffh ;fraction part
OR EBX, EAX ;accumulate next digit
OR EAX, '0' ;convert digit to ASCII
MOV [EDI], AL ;store digit out to memory
LEA EAX, [EDX*4+EDX] ;5*fraction, new digit EAX<31:27>
LEA EDX, [EDX*4+EDX] ;5*fraction, new fraction EDX<26:0>
CMP EBX, 1 ;any non-zero digit yet ?
SBB EDI, -1 ;yes->increment ptr, no->keep old ptr
SHR EAX, 27 ;next digit
AND EDX, 07ffffffh ;fraction part
OR EBX, EAX ;accumulate next digit
OR EAX, '0' ;convert digit to ASCII
MOV [EDI], AL ;store digit out to memory
LEA EAX, [EDX*4+EDX] ;5*fraction, new digit EAX<31:26>
LEA EDX, [EDX*4+EDX] ;5*fraction, new fraction EDX<25:0>
CMP EBX, 1 ;any non-zero digit yet ?
SBB EDI, -1 ;yes->increment ptr, no->keep old ptr
SHR EAX, 26 ;next digit
AND EDX, 03ffffffh ;fraction part
OR EBX, EAX ;accumulate next digit
OR EAX, '0' ;convert digit to ASCII
MOV [EDI], AL ;store digit out to memory
LEA EAX, [EDX*4+EDX] ;5*fraction, new digit EAX<31:25>
LEA EDX, [EDX*4+EDX] ;5*fraction, new fraction EDX<24:0>
CMP EBX, 1 ;any non-zero digit yet ?
SBB EDI, -1 ;yes->increment ptr, no->keep old ptr
SHR EAX, 25 ;next digit
AND EDX, 01ffffffh ;fraction part
OR EBX, EAX ;accumulate next digit
OR EAX, '0' ;convert digit to ASCII
MOV [EDI], AL ;store digit out to memory
LEA EAX, [EDX*4+EDX] ;5*fraction, new digit EAX<31:24>
LEA EDX, [EDX*4+EDX] ;5*fraction, new fraction EDX<23:0>
CMP EBX, 1 ;any non-zero digit yet ?
SBB EDI, -1 ;yes->increment ptr, no->keep old ptr
SHR EAX, 24 ;next digit
AND EDX, 00ffffffh ;fraction part
OR EBX, EAX ;accumulate next digit
OR EAX, '0' ;convert digit to ASCII
MOV [EDI], AL ;store digit out to memory
LEA EAX, [EDX*4+EDX] ;5*fraction, new digit EAX<31:23>
LEA EDX, [EDX*4+EDX] ;5*fraction, new fraction EDX<31:23>
CMP EBX, 1 ;any non-zero digit yet ?
SBB EDI, -1 ;yes->increment ptr, no->keep old ptr
SHR EAX, 23 ;next digit
AND EDX, 007fffffh ;fraction part
OR EBX, EAX ;accumulate next digit
OR EAX, '0' ;convert digit to ASCII
MOV [EDI], AL ;store digit out to memory
LEA EAX, [EDX*4+EDX] ;5*fraction, new digit EAX<31:22>
LEA EDX, [EDX*4+EDX] ;5*fraction, new fraction EDX<22:0>
CMP EBX, 1 ;any non-zero digit yet ?
SBB EDI, -1 ;yes->increment ptr, no->keep old ptr
SHR EAX, 22 ;next digit
AND EDX, 003fffffh ;fraction part
OR EBX, EAX ;accumulate next digit
OR EAX, '0' ;convert digit to ASCII
MOV [EDI], AL ;store digit out to memory
LEA EAX, [EDX*4+EDX] ;5*fraction, new digit EAX<31:21>
LEA EDX, [EDX*4+EDX] ;5*fraction, new fraction EDX<21:0>
CMP EBX, 1 ;any non-zero digit yet ?
SBB EDI, -1 ;yes->increment ptr, no->keep old ptr
SHR EAX, 21 ;next digit
AND EDX, 001fffffh ;fraction part
OR EBX, EAX ;accumulate next digit
OR EAX, '0' ;convert digit to ASCII
MOV [EDI], AL ;store digit out to memory
LEA EAX, [EDX*4+EDX] ;5*fraction, new digit EAX<31:20>
CMP EBX, 1 ;any-non-zero digit yet ?
SBB EDI, -1 ;yes->increment ptr, no->keep old ptr
SHR EAX, 20 ;next digit
OR EAX, '0' ;convert digit to ASCII
MOV [EDI], AX ;store last digit and end marker out to memory
pop edx
pop ecx
pop ebx
retn
u2str endp


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