Число => Текст (и обратно)

Тема в разделе "WASM.BEGINNERS", создана пользователем Twister, 12 окт 2005.

  1. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Недавно начал изучать АСМ (с Делфи и ВБ я на ТЫ) и сразу возник у меня такой вопрос (собственно САБЖ). К примеру, в EAX есть число и я хочу отобразить его через MessageBoxA. Как?...
     
  2. IceStudent

    IceStudent Active Member

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

    читаем книги, там описано, как самому делать.
     
  3. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Фишка в том, что у меня три книги по АСМу, но я там ничего об этом не вычитал. Спасибо за dwtoa, atodw - поищу, почитаю...
     
  4. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    К примеру, в EAX есть число и я хочу отобразить его через MessageBoxA.



    Так ?
    Код (Text):
    1.        mov eax,123
    2.        invoke wsprintfA,offset buf,$CTA0("%u"),eax
    3.        invoke MessageBox,0,offset buf,offset buf,0
     
  5. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Выдает ошибку на push $CTA0("%u")... (FASM)
     
  6. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Честно, даже не знаю что есть $CTA0("%u")
     
  7. leo

    leo Active Member

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

    buf rb 16

    fmt db '%u',0 ;u - беззнакоковое целое, d или i - знаковое

    invoke wsprintfA,buf,fmt,eax
     
  8. IceStudent

    IceStudent Active Member

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

    только cinvoke.

    или
    Код (Text):
    1. push  eax
    2. push  fmt
    3. push  buf
    4. call  [wsprintfA]
    5. add  esp,4*3
     
  9. leo

    leo Active Member

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

    Ах да, конечно ;)

    или

    invoke wsprintf,buf,fmt,eax

    add esp,4*3
     
  10. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Ругается на call [wsprintfA]. Какой модуль надо подключать? (fasm)
     
  11. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Потому что нужно просто wsprintf без всякого "A"

    Используй invoke, но после нее добавь add esp,4*3 (т.к. wsprintf это не stdcall и после нее нужно удалять переданные параметры из стека, что и делает add esp)
     
  12. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Кажись все работает... Вот, привожу текст проги (FASM), которая выдает серийный номер ТОМА (не винчестера) диска С:\. Но у меня возникают сомнения, правильный ли результат, мож кто протестит?


    Код (Text):
    1. include 'C:\Program Files\TwR\fasmw164\INCLUDE\win32ax.inc'
    2.  
    3. .code
    4. start:
    5.     invoke  GetVolumeInformation, 'c:\', Bfr, 255,dword ptr SN, a, b, 0, 0
    6.     cmp EAX, 0
    7.     je err
    8.     mov eax, SN
    9.     push  fmt
    10.     push  buf
    11.     call  [wsprintf]
    12.     add  esp,4*3
    13.     invoke MessageBox,0,buf,"Serial Number of C\:",0
    14.     jmp exit
    15. err:
    16.     invoke MessageBox,0, _errmsg, _txt,0
    17. exit:
    18.     invoke  ExitProcess,0
    19. .end start
    20.  
    21. buf rb 16
    22. fmt db '%u',0
    23. SN dw ?
    24. a dw ?
    25. b dw ?
    26. Bfr dw 255 dup(0)
    27. _txt db 'Volume Information',0
    28. _errmsg db 'Error. Program will terminate',0
     
  13. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    По-моему хрень получается! Что бы я не клал в EAX перед вызовом wsprintf в сообщении отображается "2088856911"...
     
  14. leo

    leo Active Member

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

    1) переменные SN,a,b должны быть dd а не dw

    2) в фасме mov eax,SN заносит в eax адрес SN, а тебе нужно значение по этому адресу, т.е. mov eax,[SN]

    2) ты забыл сделать push eax (или push dword [SN] без всякого mov)
     
  15. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Так?


    Код (Text):
    1. include 'C:\Program Files\TwR\fasmw164\INCLUDE\win32ax.inc'
    2.  
    3. .code
    4. start:
    5.     invoke  GetVolumeInformation, "c:\", Bfr, 255,dword ptr SN, a, b, 0, 0
    6.     cmp EAX, 0
    7.     je err
    8.     push dword [SN]
    9.     push  fmt
    10.     push  buf
    11.     call  [wsprintf]
    12.     add  esp,4*3
    13.     invoke MessageBox,0,buf,"Serial Number of C\:",0
    14.     jmp exit
    15. err:
    16.     invoke MessageBox,0, _errmsg, _txt,0
    17. exit:
    18.     invoke  ExitProcess,0
    19. .end start
    20.  
    21. buf rb 16
    22. fmt db '%u',0
    23. SN dd ?
    24. a dd ?
    25. b dd ?
    26. Bfr dw 255 dup(0)
    27. _txt db 'Volume Information',0
    28. _errmsg db 'Error. Program will terminate',0




    Но теперь он выдает "0"...
     
  16. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Код (Text):
    1.  
    2.     xor ebx,ebx
    3.     invoke GetVolumeInformation,szVol,pVolName,nVolName,dwSer,ebx,ebx,ebx,ebx
    4.     movzx   eax,word[dwSer]
    5.     movzx   ecx,word[dwSer+2]
    6.     cinvoke wsprintf,buf,szFmt,szVol,pVolName,eax,ecx
    7.     invoke MessageBox,ebx,buf,szCaption,MB_ICONINFORMATION
    8.     invoke ExitProcess,ebx
    9.  
    10. align 32
    11. szCaption   db 'Volume information',0
    12. szVol       db 'c:\',0
    13. szFmt       db 'Volume [%s]',13,10,'Name: %s, Serial: %02X-%02X',0
    14. dwSer       dd 0
    15. nVolName    = 260
    16. pVolName    rb nVolName
    17. buf     rb 128
    18.  
     
  17. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Всем спасибо, уже давно все сделал.