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