Замена wsprintf

Тема в разделе "WASM.WIN32", создана пользователем NoName, 29 июл 2005.

Статус темы:
Закрыта.
  1. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Это только первый проход. Там их 10 по умолчанию, выставляется в переменной iter.

    Первый проход самый бессмысленный, нужны остальные
     
  2. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    NoName

    Так, то оно так. Но логика надеюсь понятна - как преобразуется BCD число (упакованное) в строчный эквивалент, а в конце добавляется 0Dh, 0Ah.
     
  3. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    ничего непонятно, числа не те выпадают :dntknw:
     
  4. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257




    В принципе готова, но multicat не конвертирует числа в строки (для этого есть другие ф-ции). Она просто добавляет несколько строк к буферу-приёмнику:


    Код (Text):
    1. align 16
    2. ;===================================================================== ======
    3. ;   Процедура добавления строк к буферу.
    4. ;   str_count = количество строк, добавляемых к буферу
    5. ;   lpBuffer  = адрес выходного буфера, к которому добавляются строки
    6. ;   params    = массив адресов добавляемых строк
    7. ;   Возвращаемое значение: eax = длина результирующей строки
    8. ;   !!! C-функция, после вызова функции необходимо очистить стек (add esp,...)
    9. ;   для копирования (не добавления) перед вызовом занулить lpBuffer
    10. ;           ПРИМЕР ВЫЗОВА:
    11. ;                ;mov [szOutput+0],0        - если надо переписать предыдущее состояние szOutput
    12. ;                push offset string_3       - адрес третьей строки
    13. ;                push offset string_2       - адрес второй  строки
    14. ;                push offset string_1       - адрес первой  строки
    15. ;                push offset szOutput       - адрес выходной строки
    16. ;                push 3                     - кол-во добавляемых к буферу строк
    17. ;                call cr_multicat
    18. ;                add esp,20                 - 4х<кол-во параметров>
    19.                
    20. cr_multicat proc C str_count:DWORD,lpBuffer:DWORD,params:VARARG
    21.     option prologue : none
    22.     option epilogue : none
    23.    
    24.     push    esi
    25.     push    edi
    26.     push    ebx
    27.     push    ebp
    28.  
    29.     mov     edi,[esp+24]            ;edi => lpBuffer
    30.     lea     edx,[edi+3]             ;edx = edi+3
    31. align 16
    32.   @@:    
    33.     mov     eax,[edi]
    34.     mov     ecx,-01010101h
    35.     add     edi,4
    36.     add     ecx,eax
    37.     not     eax
    38.     and     ecx,eax
    39.     and     ecx,80808080h
    40.     jz      @B
    41.     test    ecx,00008080h
    42.     jnz     @F
    43.     shr     ecx,16
    44.     add     edi,2
    45.   @@:
    46.     shl     cl,1
    47.     sbb     edi,edx
    48.     add     edi,[esp+24]
    49.  
    50.     lea     ebp,[esp+28]
    51.  
    52. align 16
    53. next_string:
    54.     mov     esi,[ebp]               ;esi => адрес след. строки
    55.  _a:
    56.     test    esi,3
    57.     jz      _loop
    58.     mov     al,[esi]
    59.     mov     [edi],al
    60.     inc     esi
    61.     inc     edi
    62.     test    al,al
    63.     jnz     _a
    64.     dec     edi
    65.     jmp     _next
    66.    
    67. align 16
    68. _copy:
    69.     mov     [edi],edx               ;переписали дворд в буфер
    70.     add     edi,4
    71. _loop:
    72.     mov     eax,[esi]               ;взяли дворд из добавляемой строки
    73.     add     esi,4                   ;сдвинули указатели на строку и буфер
    74.     mov     ebx,-01010101h
    75.     mov     edx,eax
    76.     add     ebx,eax
    77.     not     eax
    78.     and     ebx,eax
    79.     and     ebx,80808080h
    80.     jz      _copy                    ;если в дворде нет нулевого байта, копируем и продложаем цикл
    81.  
    82.  @@:
    83.     test    dl,dl
    84.     jz      _next
    85.     mov     [edi],dl
    86.     inc     edi
    87.     test    dh,dh
    88.     jz      _next
    89.     mov     [edi],dh
    90.     inc     edi
    91.     shr     edx,16
    92.     test    dl,dl
    93.     jz      _next
    94.     mov     [edi],dl
    95.     inc     edi
    96.     test    dh,dh
    97.     jz      _next
    98.     mov     [edi],dh
    99.     inc     edi
    100. align 16
    101. _next:
    102.     add     ebp,4
    103.     dec     dword ptr[esp+20]
    104.     jnz     next_string
    105.    
    106.     mov     byte ptr[edi],0
    107.     sub     edi,[esp+24]
    108.     mov     eax,edi                 ;длина получившейся строки
    109.  
    110.     pop     ebp
    111.     pop     ebx
    112.     pop     edi
    113.     pop     esi
    114.  
    115.     retn
    116.     option prologue : prologuedef
    117.     option epilogue : epiloguedef
    118.    
    119. cr_multicat endp
     
  5. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Если нужно число - дворд представить в виде Hex-строки, то там же есть:


    Код (Text):
    1. .data
    2.     h_conv              db  '0123456789ABCDEF',0
    3. .code
    4. align 16
    5.  
    6. ;=====================================================================  ==============
    7. ;   Процедура перевода dword - числа в hex-строку. Выходная строка
    8. ;   помещается в буфер lpOutString: '01ABDC78',0
    9. ;   Возвращаемое значение: нет
    10. cr_dwtohexstr proc  dwValue:DWORD, lpOutString:DWORD
    11.     option prologue : none
    12.     option epilogue : none
    13.     mov     edx,[esp+8]
    14.     mov     eax,[esp+4]
    15. align 16
    16. _st:
    17.     mov     ecx,eax
    18.     shr     ecx,28
    19.     and     ecx,0Fh
    20.     movzx   cx,byte ptr[h_conv+ecx]
    21.     mov     [edx],cx
    22.     mov     ecx,eax
    23.     shr     ecx,24
    24.     and     ecx,0Fh
    25.     movzx   cx,byte ptr[h_conv+ecx]
    26.     mov     [edx+1],cx
    27.     mov     ecx,eax
    28.     shr     ecx,20
    29.     and     ecx,0Fh
    30.     movzx   cx,byte ptr[h_conv+ecx]
    31.     mov     [edx+2],cx
    32.     mov     ecx,eax
    33.     shr     ecx,16
    34.     and     ecx,0Fh
    35.     movzx   cx,byte ptr[h_conv+ecx]
    36.     mov     [edx+3],cx
    37.     mov     ecx,eax
    38.     shr     ecx,12
    39.     and     ecx,0Fh
    40.     movzx   cx,byte ptr[h_conv+ecx]
    41.     mov     [edx+4],cx
    42.     mov     ecx,eax
    43.     shr     ecx,8
    44.     and     ecx,0Fh
    45.     movzx   cx,byte ptr[h_conv+ecx]
    46.     mov     [edx+5],cx
    47.     mov     ecx,eax
    48.     shr     ecx,4
    49.     and     ecx,0Fh
    50.     movzx   cx,byte ptr[h_conv+ecx]
    51.     mov     [edx+6],cx
    52.     and     eax,0Fh
    53.     movzx   ax,byte ptr[h_conv+eax]
    54.     mov     [edx+7],ax
    55.     retn    8
    56.     option prologue : prologuedef
    57.     option epilogue : epiloguedef
    58. cr_dwtohexstr endp
     
  6. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    NoName

    Извини за очепятки ;)



    Вот рабочий вариант для wintest:
    Код (Text):
    1. ;--- убираем из исходника строки ----
    2. ;invoke  wsprintf,edi,lpfmtm,[ebp+8],[ebp+4],[ebp]
    3. ;add esp,20 - восстановление стека после wsprintf
    4. ;add edi,eax - приращение edi будем делать по другому
    5. ;--- после fbstp [ebp] вставляем код ---
    6.     mov ecx,8  ;(8+1)*2=18 значащих цифр
    7. @@bcd2str:
    8.     mov al,[ebp+ecx]
    9.     mov dl,al
    10.     and dl,0Fh  ;<- !!!
    11.     or  dl,30h
    12.     mov [edi+1],dl
    13.     shr al,4
    14.     or  al,30h
    15.     mov [edi],al
    16.     add edi,2
    17.     dec ecx
    18.     jge @@bcd2str
    19.  
    20.         mov dword [edi],0A0Dh ;перевод строки + замыкающий 0
    21.         add edi,2 ;смещение на замык.ноль
     
  7. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Я извиняюсь за ламерство, надеюсь такого больше не повтарится.

    [​IMG] 201731148__asmpak000Ch.rar



    leo

    Ты мозг. Оно работает :)!

    Всем остальным тоже thx.
     
  8. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Можно ли обойтись без fpu?
     
  9. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Вот это убери
    Код (Text):
    1. ;===================================================================== =======
    2.             finit
    3.             mov     esi,resultlist
    4.             mov     ebp,templist
    5.             mov     edi,message
    6. align       4
    7. @@:         fild    qword [esi]
    8.             fabs
    9.             fbstp   [ebp]
    10.             invoke  wsprintf,edi,lpfmtm,[ebp+8],[ebp+4],[ebp]
    11.             add     esp,20
    12.             add     esi,8
    13.             add     ebp,10
    14.             add     edi,eax
    15.             sub     [counter],8
    16.             jnz     @B
    17.             finit
    18. ;============================================================================
    Эти переменные тоже
    Код (Text):
    1. templist    rb      iter*10+2
    2. lpfmtm      db      '%.8X%.8X%.8X',13,10,0
    Поставь это
    Код (Text):
    1. ;===================================================================== =======
    2.             mov     esi,resultlist
    3.             mov     edi,message
    4. @1:         lea     ebx,[edi+20]
    5.             mov     word[ebx],0x0A0D
    6.             dec     ebx
    7.             mov     eax,[esi]
    8.             mov     ecx,10
    9. @@:         xor     edx,edx
    10.             div     ecx
    11.             add     edx,0x30
    12.             mov     byte [ebx],dl
    13.             dec     ebx
    14.             or      eax,eax
    15.             jnz     @b
    16.             mov     eax,[esi+4]
    17. @@:         xor     edx,edx
    18.             div     ecx
    19.             add     edx,0x30
    20.             mov     byte [ebx],dl
    21.             dec     ebx
    22.             or      eax,eax
    23.             jnz     @b
    24. @@:         cmp     ebx,edi
    25.             jc      @f
    26.             mov     byte [ebx],'0'
    27.             dec     ebx
    28.             jmp     @b
    29. @@:         add     esi,8
    30.             add     edi,22
    31.             sub     [counter],8
    32.             jnz     @1
    33. ;============================================================================
     
  10. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    bogrus

    У меня нет слов. rlz!

    Кстати под 2003 server разброс такой же хаотичный как и под sp2.
     
Статус темы:
Закрыта.