преобразование LONG в строку

Тема в разделе "WASM.BEGINNERS", создана пользователем xx7, 11 май 2009.

  1. xx7

    xx7 New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2009
    Сообщения:
    18
    или не long, но вроде как в msdn

    по всякому уже попробовал вывести разрешение экрана
    , и сичего не пойму, или потомучто не докурил самые основы , или это и точно не так просто как из простого INT
    Код (Text):
    1. ;fasm
    2.  
    3. format PE GUI 4.0
    4. entry start
    5.  
    6. include "win32a.inc"
    7.  
    8. client   RECT
    9. temp    db 32 dup (0)
    10. xBparam db 32 dup (0)
    11. ; code section
    12. ;---------------------------
    13.  
    14. section '.code' code readable executable
    15. start:
    16.  
    17. invoke  GetClientRect,0,client ; окно
    18.  
    19. mov eax,  client.right
    20. lea edi , [temp]
    21. mov ebx, 10
    22.  
    23. call NumToASCII ;;;;;;;;;;;;;
    24. mov dword[xBparam], client.bottom
    25.  
    26.  
    27. invoke MessageBox,0,temp,xBparam,MB_OK
    28.  
    29. STOP:
    30. invoke  ExitProcess,    0
    31.  
    32. ;==========================
    33. NumToASCII:
    34. pushad
    35. xor esi,esi
    36. convert_loop:
    37.     xor edx,edx
    38. div ebx
    39. add dl , 30h
    40.  
    41. push edx
    42. inc esi
    43. test eax,eax
    44. jnz convert_loop
    45. ;eld
    46.     write_loop:
    47. pop eax  ; цифрa из стека
    48. stosb ; AL по адресу  в EDI, EDI +1
    49.  
    50. dec esi
    51. test esi,esi
    52. jnz write_loop
    53. mov byte [edi],0
    54. popad
    55. ret
    56. ;======================================
    57. section '.idata' import data readable
    58. library kernel32,"KERNEL32.DLL",\
    59.     user32,"USER32.DLL"
    60. include "api/kernel32.inc"
    61. include "api/user32.inc"
    несколько описаний преобразования числа в строку находил
    , впринципе таким-же путёm деления на 10 и преобразования остатков

    , подскажите почему не могу вывести эти цифры
     
  2. irrona

    irrona Member

    Публикаций:
    0
    Регистрация:
    26 май 2004
    Сообщения:
    178
    Адрес:
    Тирасполь
    xx7

    У меня работает.
    1) В функции GetClientRect 1-й параметр укажи. Нужен хэндл окна.
    2) В функции MessageBox 2-й и 3-й параметры должны быть адресами переменных. Хотя может быть в Fasm-е разрешена и такая запись как у тебя?
     
  3. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    Это фасм. mov eax,client.right положит в eax адрес соответствующего элемента структуры. И, кстати, поэтому зря lea ниже.
    Это Windows. GetClientRect(NULL, ...), естественно, не работает.
    Код (Text):
    1. invoke GetDesktopWindow
    2. invoke  GetClientRect,eax,client ; окно
    3. mov eax, [client.right]
    4. mov edi ,temp
    С xBparam сам.
    ЗЫ: обычно делают GetSystemMetrics с SM_CXSCREEN и SM_CYSCREEN. Тебе ведь это надо?
     
  4. xx7

    xx7 New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2009
    Сообщения:
    18
    Большое спасибо, заработало,, и за GetSystemMetrics тоже.
    Нужно сразу всё ,) Хотелось понять синтаксис, а тут ещё и WinApi тоже не знаю :)
     
  5. xx7

    xx7 New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2009
    Сообщения:
    18
    и ещё одно непойму теперь,
    например я хочу задать размеры окну исходя из этих RECT.....
    значит нужно примерно так вычислять?
    Код (Text):
    1. mov eax, [client.right]
    2. xor edx,edx
    3. div ebx
    4. mov [client.right], eax
    5.  
    6. mov eax, [client.bottom]
    7. xor edx,edx
    8. div ebx
    9. mov [client.bottom], eax
    10.  
    11.  invoke CreateWindowEx, WS_EX_CLIENTEDGE,szClass,szTitle,\
    12.         WS_CAPTION+WS_VISIBLE+WS_POPUP+\        WS_SYSMENU+WS_MAXIMIZEBOX+WS_MINIMIZEBOX,\
    13.         [client.right],\
    14.         [client.bottom],\
    15.         [client.right],\
    16.         [client.bottom],\
    17.         0,[hMenu],[hInstance],\
    18.         0
    что-то читал-читал про операторы /*-+, и ничего не понял)(в справке по фасму), как-то можно их использовать ? или так тоже пойдёт
     
  6. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Я не понял, почему ты дважды написал [client.right] и [client.bottom]? Хочешь, чтобы окно размещалось относительно вершины десктопа на расстоянии, равном размеру окна? И что ты хочешь вычислить? Размер окна, в десять раз меньший размеру десктопа (по обеим осям)? Если так, тогда ты сделал все правильно. Причем здесь операторы fasm'а, я тоже так и не понял.
     
  7. xx7

    xx7 New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2009
    Сообщения:
    18
    забыл вначале написать mov ebx, 2

    хотел упростить и получилось что-то типа
    Код (Text):
    1. ....
    2. <.right = .right/2>,\
    3. <.bottom = .bottom/2>,\
    4. .right,\
    5. .bottom,\
    6. ....
    а так , сначало было 400,400,400,200 (для 800x600 экрана), просто лениво далеко тянуться мышкой ,) а там ещё на notifyicon кой чего навесил.
    вобще хотел с высотой поделить на три , и сделать в нижней третьей части, но вычислений тогда ещё больше.
    Думал что может как в сях можно чего записать , типа ((600/3)*2)
     
  8. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Операторы можно использовать только в выражениях, содержащих одни константы. Вычислить 1/3 и 2/3 на ассемблере элементарно.
    Код (Text):
    1.   mov ebx, 3
    2.  
    3. ; ecx <-- y, edi <-- height
    4.   mov eax, [.bottom]
    5.   xor edx, edx
    6.   div ebx
    7.   mov edi, eax
    8.   shl eax, 1
    9.   mov ecx, eax
    10.  
    11. ; eax <-- x, esi <-- width
    12.   mov eax, [.right]
    13.   xor edx, edx
    14.   div ebx
    15.   mov esi, eax
    16.   shl eax, 1
    17.  
    18.   stdcall CreateWindowEx, ..., eax, ecx, esi, edi, ...
     
  9. xx7

    xx7 New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2009
    Сообщения:
    18
    Совсем так не получилось , пока на таком остановился
    mov eax, [client.bottom]
    mov ebx, 3
    Код (Text):
    1. xor edx,edx
    2. div ebx
    3. mov esi, eax ; height -> esi
    4. mov ebx, eax ; y -> ebx
    5. sal ebx, 1
    6.  
    7. mov eax, [client.right]
    8. sar eax, 1 ;x,width -> eax
    9.  
    10. CreateWindowEx, ... eax,ebx,eax,esi,...
    насчёт логического сдвига и правда забыл что-то
     
  10. xx7

    xx7 New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2009
    Сообщения:
    18
    выше было

    mov eax, [client.bottom]
    mov ebx, 3

    чтойто не найду как редактировать сообщения ;)
     
  11. xx7

    xx7 New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2009
    Сообщения:
    18
    Теперь совсем запутался со стеком

    например просто чтобы посмотреть какое-то значение сделал такую функцию например stdcall numtest esp посмотреть
    Код (Text):
    1. proc numtest num
    2. push eax ebx edi ;сохранение
    3.  
    4. mov eax,[num]
    5. mov ebx, 16
    6. lea edi, [stest]
    7. call NumToASCII
    8.  
    9. invoke MessageBox, 0, stest,'numtest',MB_OK
    10.  
    11. pop edi ebx eax ;возврат значений
    12. ret
    13. endp
    14. ;=======================================================
    15. stest db 32 dup(0)
    но "stest" ненужна как глобальная переменная.
    никакие local или locals-endl непомогают, наверное нужно динамически выделить место под строку, но никак не пойму как делается.

    Как-нибудь можно сделать чтобы edi указывало на место в стеке, и чтобы потом ещё передать оттуда в MessageBox ?