Замена wsprintf

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

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

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    есть такой код
    Код (Text):
    1. tics        dq      0
    2. counter     dd      0
    3. resultlist  rq      iter
    4. templist    rb      iter*10+2
    5. message     rb      iter*26+1
    6. lpfmtm      db      '%.8X%.8X%.8X',13,10,0

    Код (Text):
    1.             finit
    2.             mov     esi,resultlist
    3.             mov     ebp,templist
    4.             mov     edi,message
    5. align       4
    6. @@:         fild    qword [esi]
    7.             fabs
    8.             fbstp   [ebp]
    9.             invoke  wsprintf,edi,lpfmtm,[ebp+8],[ebp+4],[ebp]
    10.             add     esp,20
    11.             add     esi,8
    12.             add     ebp,10
    13.             add     edi,eax
    14.             sub     [counter],8
    15.             jnz     @B
    16.             add     esp,16
    17.             invoke  MessageBox,0,message,caption,MB_ICONINFORMATION
    18.             mov eax,message
    19.             call HexToDword
    20.             invoke MessageBox,0,message,0,0
    21.             finit
    22.             invoke  ExitProcess,0


    Нужно сделать так чтобы wsprintf был на асме.


    Код (Text):
    1.             mov edi,message
    2.             mov eax,[ebp+8]
    3.             stosd
    4.             mov eax,[ebp+4]
    5.             stosd
    6.             mov eax,[ebp]
    7.             stosd


    неработает. Ничего непонимаю, нужно учить асм.
     
  2. alpet

    alpet Александр

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

    Нужен полнофункциональный или частный (для данного когда) вариант? Полная фукнция будет и сложнее и тормознее.
     
  3. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    так ты DWORD'ы засовываешь в message, а wsprintf их распечатывает в виде текста в этот message.

    Кроме того edi портишь.



    Тебе что-то вроде:
    Код (Text):
    1.  
    2. mov edi, OF message
    3. invoke dd2a_hex, [ebp+8], edi
    4. add edi, 8
    5. mov PB [edi],"."
    6. inc edi
    7. ...
    8.  
     
  4. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    вот на всякий случай
    Код (Text):
    1.  
    2. pecreg16 proc chislo:DWORD, mem:DWORD
    3. pushad
    4.  
    5. mov ebx,[chislo]
    6. mov edx,[mem]
    7.  
    8. mov ecx,8
    9.  
    10. align 4
    11. @@1:
    12.  rol ebx,4
    13.  mov eax,ebx
    14.  and eax,0fh
    15.  cmp eax,10
    16.  sbb eax,69h
    17.  das
    18.  mov [edx],al
    19.  inc edx
    20. dnz ecx,@@1
    21.  
    22. mov [edx],PB 0
    23. mov [pecreg_kon], edx
    24. stc
    25. popad
    26. ret
    27. pecreg16 endp
    28.  
     
  5. NoName

    NoName New Member

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

    частный (для данного когда) вариант



    yureckor



    верно.

    Что такое "dnz ecx,@@1"?
     
  6. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    Код (Text):
    1.  
    2. ;---
    3. dnz MACRO QAX,M
    4.  dec QAX
    5.  jnz M
    6. ENDM
    7.  
     
  7. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    mov [edx],PB 0 -?

    mov [pecreg_kon], edx -?



    Либа для строк еще не готова?

    (multicat)



    Нашел один сорец, но что-то явно лишние данные выводятся. И аттач не хочет крепится.
     
  8. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    И все-таки я хотел бы знать почему неработает

    mov edi,message

    mov eax,[ebp+8]

    stosd

    mov eax,[ebp+4]

    stosd

    mov eax,[ebp]

    stosd

    даже если сохранить регистры.
    Код (Text):
    1. .586
    2. .model  flat,stdcall
    3. option  casemap:none
    4. include     windows.inc
    5. include     kernel32.inc
    6. include     user32.inc
    7.  
    8. includelib  user32.lib
    9. includelib  kernel32.lib
    10.  
    11. udwtoa PROTO :DWORD,:DWORD
    12. mprintf PROTO C :DWORD,:DWORD,:VARARG
    13.  
    14. .data
    15. buffer  db     'f5cD4e2AFFFFFFFFFFFFFFFFF34634634FF',0
    16. buffer2 db 512 dup(0)
    17. format db "%d",0
    18. .code
    19. start:
    20.  
    21.     invoke mprintf,offset buffer2,offset format,offset buffer  
    22.     invoke MessageBox, NULL,offset buffer,offset buffer2,MB_OK
    23.     invoke ExitProcess,0
    24.    
    25. mprintf proc C uses esi edi ebx lpOut:DWORD,lpFmt:DWORD,param:VARARG
    26. LOCAL buf[16]:byte
    27. LOCAL dwtmp:dword
    28.  
    29. mov esi,lpFmt
    30. mov edi,lpOut
    31. xor ebx,ebx
    32. .while 1
    33. lodsb
    34. .if al=="%"
    35. lodsb
    36. .if al=="s"
    37. mov eax,param[ebx]
    38. .elseif al=="d"
    39. push dwtmp
    40. pop param[ebx];,dwtmp
    41. invoke udwtoa,dwtmp,addr buf
    42. lea eax,buf
    43. .elseif al=="r"
    44. mov eax,param[ebx]
    45. add ebx,4
    46. stosd
    47. .continue
    48. .else
    49. mov ah,"%"
    50. stosw
    51. .continue
    52. .endif
    53.  
    54. add ebx,4 ;Move param pointer
    55.  
    56. push esi
    57. mov esi,eax
    58. .while 1
    59. lodsb
    60. .if al==0
    61. .break
    62. .endif
    63. stosb
    64. .endw
    65.  
    66. pop esi
    67. .else
    68. stosb
    69. .if al==0
    70. .break
    71. .endif
    72. .endif
    73. .endw
    74. ret
    75. mprintf endp
    76.  
    77. udwtoa proc uses edx esi edi dwValue:DWORD, lpBuffer:DWORD
    78. LOCAL buf[10]:BYTE
    79.  
    80. lea esi,buf
    81. mov eax,dwValue
    82. mov edi,10
    83. .while(1)
    84. .if eax<10
    85. or al,30H
    86. mov [esi],al
    87. .break
    88. .else
    89. xor edx,edx
    90. div edi
    91. or dl,30H
    92. mov [esi],dl
    93. inc esi
    94. .endif
    95. .endw
    96. lea ecx,buf
    97. mov edi,lpBuffer
    98. .while esi>=ecx
    99. mov al,[esi]
    100. dec esi
    101. stosb
    102. .endw
    103. mov byte ptr [edi],0
    104. ret
    105. udwtoa endp                  
    106. end start
    107.  
     
  9. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    Код (Text):
    1.  
    2. ;; output str = 28 chars min
    3. int3toa  proc uses ecx edx edi dst:DWORD, i1:DWORD, i2:DWORD,i3:DWORD
    4.         lea     edi, [dst + 24]
    5.         mov             dword ptr [edi], 0A0Dh
    6.         mov     ecx, [i3]      
    7.         call    i2h
    8.         mov     ecx, [i2]
    9.         call    i2h
    10.         mov     ecx, [i1]
    11.         call    i2h    
    12.         ret
    13. i2h:           
    14.         mov     bl, 8
    15. cvt:        sub     edi, 1
    16.         mov     al, cl
    17.         and     al, 15
    18.         shr     ecx, 4  
    19.         cmp     al, 10 ;; is digit?
    20.         jb      dig
    21.         add     al, 7
    22. dig:        add     al, 30h
    23.         mov     [edi], al      
    24.         sub     bl, 1
    25.         jnz     cvt
    26.         ret
    27. int3toa         endp
    28.  
     
  10. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    NoName



    читай выше внимательнее:

     
  11. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    NoName>И все-таки я хотел бы знать почему неработает...даже если сохранить регистры

    см. мой первый пост.



    >mov [edx],PB 0 -?
    Код (Text):
    1.  
    2. OF EQU OFFSET
    3. PD EQU DWORD PTR
    4. PB EQU BYTE  PTR
    5. PT EQU TBYTE PTR
    6. PF EQU FBYTE PTR
    7. PW EQU WORD PTR
    8. PQ EQU QWORD PTR
    9. PS EQU SDWORD PTR
    10.  


    >mov [pecreg_kon], edx -?
    Код (Text):
    1.  
    2. .data?
    3. ...
    4. pecreg_kon dd ? ;конец текста, куда распечатали
    5. ...
    6.  




    В ближайшее время я (верней я и Avalonec) выложим библиотеку поддержки самодельного скриптового языка для парсинга текста, там есть реализация wsprintf.
     
  12. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    После fbstp мы имеем упакованное BCD число, где каждые 4 бита принимают значения 0..9, а не 0..F как в Hex. Поэтому если речь идет о преобразовании BCD, то анализ на > 9 не нужен:
    Код (Text):
    1. ;преобразование BCD в строку
    2.     ;ebp - адрес упакованного BCD
    3.         ;edi - адрес строки
    4.     mov ecx,bytes ;число байт BCD, после fbstp bytes=9, а не 12 !!
    5. @@:
    6.     mov al,[ebp+ecx-1]
    7.     mov dl,al
    8.     or  dl,30h     ;преобразуем число 0..9 в символ "0".."9" - ответ на вопрос "почему не работает ?"
    9.     mov [edi+1],dl
    10.     shr al,4
    11.     or  al,30h
    12.     mov [edi],al
    13.     add edi,2
    14.     dec ecx
    15.     jnz @B
    16.     ;mov byte [edi],0
     
  13. NoName

    NoName New Member

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

    попробовал твой код вместо wsprintf'а и словил сайс.



    alpet

    у меня твой алгаритм не пашет.



    yureckor

    Я непонял почему ptr 0.
     
  14. NoName

    NoName New Member

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

    include 'win32ax.inc'



    .data



    src db 'a man from Kent',0

    srclen dd $-src

    dest db 'There once was ',0

    buffer rb 30

    destlen dd buffer-dest-1 ;extra -1 to skip destination zero terminated byte

    strm db 'Message',0



    .code



    start:



    mov esi, src ; source address in esi

    mov ecx, [srclen] ; length of source in ecx

    inc ecx ; include the 0 termination byte

    mov edi, dest ; destination in edi

    add edi, [destlen] ; start at end of destination



    rep movsb

    push 0

    push strm

    push dest

    push 0

    call [MessageBox]

    push 0

    call [ExitProcess]



    .end start

    и чтоб тихо было!
     
  15. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    MASM'у одинаково:

    mov [edx],PB 0

    mov PB [edx], 0

    - запихнуть в адрес по edx байт 0.
     
  16. NoName

    NoName New Member

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

    NoName New Member

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

    call HexToDword

    invoke MessageBox,0,ebp,0,0





    тогда почему неработает это?
     
  18. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Ты издеваешься?

    HexToDword переводит строку в число. А тебе по ходу нужно что-то вроде DwordToHex
     
  19. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    Кусочек кода для FASM (из сорца), поправленный:
    Код (Text):
    1.  
    2. align       4
    3. @@:         fild    qword [esi]
    4.             fabs
    5.             fbstp   [ebp]
    6.             mov     eax, [ebp + 0]
    7.             mov     ecx, 10404h
    8.             add     edi, 8
    9.             call    cvtl
    10.             mov     eax, [ebp + 4]
    11.             call    cvtl
    12.             mov     eax, [ebp + 8]
    13.             call    cvtl
    14.             jmp     outputm
    15. cvtl:
    16.             mov     bl, al
    17.             and     bl, 15
    18.             or      bl, 30h
    19.             mov     [edi], bl
    20.             dec     edi
    21.             shr     eax, 4
    22.             dec     cl
    23.             jnz     cvtl
    24.             shr     ecx, 8
    25.             ret
    26. outputm:  
    27.             mov     dword [edi + 10], 0A0Dh
    28.  
    29.  
     
  20. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    Весь сорец целиком. У меня показывает невразумительные числа в районе 2000.

    [​IMG] 1238386168__wintest.zip
     
Статус темы:
Закрыта.