перевод вещест.чисел в АНСИ

Тема в разделе "WASM.BEGINNERS", создана пользователем grozz, 7 авг 2006.

  1. grozz

    grozz New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    11
    Кто знает плз подскажите как можно перевести число с плав.точкой (например в какомто буффере) в АНСИ :\

    ps:слышал что можно осуществить с помощью тогоже FPU
     
  2. BioMehanik

    BioMehanik New Member

    Публикаций:
    0
    Регистрация:
    30 апр 2006
    Сообщения:
    101
    А зачем?
    Если брутфорс, лучше стандартными числами пользоваться... Без геморроя перевода..
     
  3. grozz

    grozz New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    11
    нет у меня идут вычесления обьема резервуара
    все в метрах и ест-о бывает и длина 5.78м и
    высота 7.345м и тд.
    я сначала все на обычных регистрах делал потом переводил в мм (просто mul на 1000 и в eax) но ввыводить то надо все равно в метрах! т.е. вещ.числ.
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Поиск по форуму или masm32\m32lib\fptoa.asm
     
  5. grozz

    grozz New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    11
    в форуме не нашел по вещ.числам
    насчет masm`a я только начинаю на fasme работать не подскажешь хотябы как
    в теории число ну скажем 245 в одном байте можно раскидать на три байта по позициям |2|4|5| (затем +30h)->ANSI2
     
  6. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Так тебе вещественные или нет? Если нет и попроще, смотри функции wsprintf (user32), если да - _ecvt, _fcvt, _gcvt из msvcrt.dll.

    В теории: самое простое, в цикле делить на 10 и забирать остатки, преобразуя их уже в символы.
    Посложнее - использовать математику:
    Код (Text):
    1. proc dwtoa dwValue, lpBuffer
    2.        
    3.     ; -------------------------------------------------------------
    4.     ; convert DWORD to ascii string
    5.     ; dwValue is value to be converted
    6.     ; lpBuffer is the address of the receiving buffer
    7.     ; EXAMPLE:
    8.     ; invoke dwtoa,edx,ADDR buffer
    9.     ;
    10.     ; Uses: eax, ecx, edx.
    11.     ; -------------------------------------------------------------
    12.  
    13.     push ebx
    14.     push esi
    15.     push edi
    16.  
    17.     mov eax, [dwValue]
    18.     mov edi, [lpBuffer]
    19.  
    20.     or eax,eax
    21.     jnz .sign
    22.    
    23.   .zero:
    24.     mov word [edi],30h
    25.     jmp .dw2asc
    26.    
    27.   .sign:
    28.     jns pos
    29.     mov byte [edi],'-'
    30.     neg eax
    31.     inc edi
    32.  
    33.   .pos:      
    34.     mov ecx,429496730
    35.     mov esi, edi
    36.  
    37.    .whilex:
    38.       mov ebx,eax
    39.       mul ecx
    40.       mov eax,edx
    41.       lea edx,[edx*4+edx]
    42.       add edx,edx
    43.       sub ebx,edx
    44.       add bl,'0'
    45.       mov [edi],bl
    46.       inc edi
    47.       test eax,eax
    48.       ja .whilex
    49.  
    50.     mov byte [edi], 0       ; terminate the string
    51.  
    52.     ; We now have all the digits, but in reverse order.
    53.  
    54.     .whiles:
    55.       cmp esi,edi
    56.       jae .endws
    57.       dec edi
    58.       mov al, [esi]
    59.       mov ah, [edi]
    60.       mov [edi], al
    61.       mov [esi], ah
    62.       inc esi
    63.       jmp  .whiles
    64.     .endws:
    65.  
    66.     .dw2asc:
    67.  
    68.     pop edi
    69.     pop esi
    70.     pop ebx
    71.  
    72.     ret
    73.  
    74. endp
     
  7. grozz

    grozz New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    11
    ВО ТОЧТО НАДО СЕНКС!!!
     
  8. PaCHER

    PaCHER New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    852
    Если нужно могу скинуть пример на FPU. Есть допустим в st0 число 2123123423152345 и егоже получим в аски.
     
  9. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    PaCHER
    А давай
     
  10. grozz

    grozz New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    11
    PACHER
    КИДАЙ
     
  11. PaCHER

    PaCHER New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    852
    Код (Text):
    1. 40530B     FILD QWORD PTR DS:[EAX]     ;eax== addr Dword
    2. 40530D     FILD WORD PTR SS:[ESP]       ;10
    3. 405310     FLD ST(1)
    4.  
    5. [b]405312[/b]     DEC ESI
    6. 405313     FPREM
    7. 405315     FISTP WORD PTR SS:[ESP]
    8. 405318     FDIV ST(1),ST
    9. 40531A     MOV AL,BYTE PTR SS:[ESP]
    10. 40531D     ADD AL,30
    11. 40531F     CMP AL,3A
    12. 405321     JB SHORT Riper_Ba.00405325
    13.  
    14. 405323     ADD AL,7
    15. 405325     MOV BYTE PTR DS:[ESI],AL     esi- addr bufer for ASCII
    16. 405327     FLD ST(1)
    17. 405329     FCOM ST(3)
    18. 40532B     WAIT
    19. 40532C     FSTSW AX
    20. 40532E     SAHF
    21. 40532F     JNB SHORT Riper_Ba.[b]00405312[/b]
    22.  
    23. 405331     FLDCW WORD PTR SS:[ESP+2]
    24. 405335     ADD ESP,4
    25. 405338     FFREE ST(3)
    26. 40533A     FFREE ST(2)
    27. 40533C     FFREE ST(1)
    28. 40533E     FFREE ST
    29. 405340     POP ECX
    30. 405341     SUB ECX,ESI
    31. 405343     SUB EDX,ECX
    32. 405345     JBE SHORT Riper_Ba.00405357
     
  12. movdqu

    movdqu New Member

    Публикаций:
    0
    Регистрация:
    16 сен 2009
    Сообщения:
    33
    А вот реализация преобразования числа в unicode строку, число в строке записывается в виде hex 8 цифр

    Код (Text):
    1. //-----------------------------------------------------------------------------//
    2. __declspec( align(16) )
    3. static const wchar_t dkstring_convertinteger_hexu_sse2_mask[8] = {0x000F,0x000F,0x000F,0x000F,0x000F,0x000F,0x000F,0x000F};
    4. __declspec(align(16))
    5. static const wchar_t dkstring_convertinteger_hexu_sse2_0[8] = {0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030};
    6. __declspec(align(16))
    7. static const wchar_t dkstring_convertinteger_hexu_sse2_a[8] = {0x0057,0x0057,0x0057,0x0057,0x0057,0x0057,0x0057,0x0057};
    8. __declspec(align(16))
    9. static const wchar_t dkstring_convertinteger_hexu_sse2_A[8] = {0x0037,0x0037,0x0037,0x0037,0x0037,0x0037,0x0037,0x0037};
    10. __declspec(align(16))
    11. static const wchar_t dkstring_convertinteger_hexu_sse2_cmp[8] = {0x000A,0x000A,0x000A,0x000A,0x000A,0x000A,0x000A,0x000A};
    12. __declspec(align(16))
    13. static const wchar_t dkstring_convertinteger_hexu_sse2_not[8] = {0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF};
    14. __declspec( naked ) size_t __fastcall dkstring_convertinteger_hex1u_sse2( size_t aValue, wchar_t *aBuffer, size_t aBufferLenght )
    15. {
    16. __asm
    17. {
    18.     push _rdi                                               // push rdi in stack
    19.     sub _rsp,16                                             // locale buffer memory
    20.     test _rdx,_rdx                                          // check pointer
    21.     jz short $$bad_exit                                     // if (bad pointer) then exit
    22.     mov _rax,[_rsp+16+size size_t+size size_t]              // rax = aBufferLenght
    23.     cmp _rax,(size size_t)*2                                // check buffer size
    24.     jb short $$bad_exit                                     // if ( size aBuffer < sizeof(size_t)*2 ) then exit
    25.     mov _rdi,_rsp                                           // rdi pointer to locale memory buffer
    26.        
    27.     movdqa xmm3,dkstring_convertinteger_hexu_sse2_not       // xmm3 = {0xFFFF}
    28.     movdqa xmm4,dkstring_convertinteger_hexu_sse2_cmp       // xmm4 = {0x000A}
    29.     movdqa xmm5,dkstring_convertinteger_hexu_sse2_0         // xmm5 = {0x0030}
    30.     movdqa xmm6,dkstring_convertinteger_hexu_sse2_a         // xmm6 = {0x0057}
    31.     movdqa xmm7,dkstring_convertinteger_hexu_sse2_mask      // xmm8 = {0x000F}
    32.     movd mm0,_rcx                                           // mm0  = [0,rcx]
    33.     movq2dq xmm0,mm0                                        // xmm0 = [0,mm0]
    34.     pxor xmm1,xmm1                                          // xmm1 = 0
    35.     punpcklbw xmm0,xmm1                                     // xmm0 = bytetoword(xmm0)
    36.     movdqa xmm2,xmm0                                        // xmm2 = xmm0
    37.     psrlw xmm2,4                                            // xmm2 = xmm2 -> 4
    38.     punpcklwd xmm0,xmm1                                     // xmm0 = wordtodword(xmm0)
    39.     punpcklwd xmm2,xmm1                                     // xmm3 = wordtodword(xmm3)
    40.     pand xmm0,xmm7                                          // xmm0 = xmm0 & xmm7
    41.     pand xmm2,xmm7                                          // xmm2 = xmm2 & xmm7
    42.     pslld xmm2,16                                           // xmm2 = xmm2 <- 16
    43.     paddd xmm0,xmm2                                         // xmm0 = xmm0 + xmm2
    44.     movdqa xmm2,xmm4                                        // xmm2 = xmm4
    45.     pcmpgtw xmm2,xmm0                                       // if ( xmm2[n..n+16] > xmm0[n..n+16] ) then xmm2[n..n+16] = n0x1
    46.     paddd xmm5,xmm0                                         // {0030} + xmm0
    47.     maskmovdqu xmm5,xmm2                                    // запись по маске
    48.     paddd xmm6,xmm0                                         // {0057} + xmm0  
    49.     pandn xmm2,xmm3                                         // инверт маски
    50.     maskmovdqu xmm6,xmm2                                    // запись по маске
    51.     movq mm0,[_rdi]                                         // read 8 bytes
    52.     movq mm1,[_rdi+8]                                       // read 8 bytes
    53.     pshufw mm0,mm0,0x01B                                    // change word order
    54.     pshufw mm1,mm1,0x01B                                    // change word order
    55.     movq [_rdx],mm1                                         // write 8 bytes
    56.     movq [_rdx+8],mm0                                       // write 8 bytes
    57.     add _rsp,16                                             // destroy locale buffer
    58.     pop _rdi                                                // pop rdi
    59.     xor _rax,_rax                                           // возвращаем 0
    60.     emms                                                    // очищаем контекст mmx
    61.     ret (size size_t)                                       // exit
    62.  
    63. $$bad_exit:
    64.     add _rsp,16                                             // destroy locale buffer
    65.     pop _rdi                                                // восстанавливаем rdi
    66.     mov _rax,-1                                             // возвращаем -1
    67.     ret (size size_t)                                       // exit
    68. }
    69. };
    70. //-----------------------------------------------------------------------------//