Уроки Изелиона или помогите ламеру Asm

Тема в разделе "WASM.BEGINNERS", создана пользователем [ixTor], 5 янв 2017.

Метки:
  1. [ixTor]

    [ixTor] Member

    Публикаций:
    0
    Регистрация:
    5 янв 2017
    Сообщения:
    53
    вот имеется значит такой кодес в статье создание окошка

    Код (Text):
    1.  
    2. format PE GUI
    3. include 'win32ax.inc'
    4. ; import, code, data in the same section
    5.  xor ebx,ebx
    6.  mov edi,wTitle
    7.  mov esi,400000h
    8.  ; +------------------------------+
    9.  ; | registering the window class |
    10.  ; +------------------------------+
    11.  
    вопрос в том что я никак не догоняю зачем нужно делать
    xor ebx,ebx
    и почему именно в edi заносится адрес wTitle и почему esi получает значение 400000h,
    оговорюсь что я таки понимаю что так создается окно но почему именно эти регистры и именно эти значения?
    Коментарий самого Изелиона (импорт код и данные в одной секции) мне непонятен, а ведь дальше двигаться я не смогу ведь это основа, объясните пожалуйста, и не кидайтесь только тухлыми гуглами и яндексами.
    Умоляю объясните....я когда то учил Masm но там такого не было вродебы.
     
  2. _qwe8013

    _qwe8013 Active Member

    Публикаций:
    2
    Регистрация:
    30 ноя 2016
    Сообщения:
    123
    У вас не полностью скопирован код, предположу, что в регистрах - передаваемые параметры в функцию, соответственно регистры могут быть любые (если конечно они не используются повторно после вызова функции).
     
  3. [ixTor]

    [ixTor] Member

    Публикаций:
    0
    Регистрация:
    5 янв 2017
    Сообщения:
    53
    вот весь код

    Код (ASM):
    1.  
    2. format PE GUI
    3. include 'win32ax.inc'
    4. ; import, code, data in the same section
    5.  xor ebx,ebx
    6.  mov edi,wTitle
    7.  mov esi,400000h
    8.  ; +------------------------------+
    9.  ; | registering the window class |
    10.  ; +------------------------------+
    11.  invoke RegisterClass,esp,ebx,window_procedure,ebx,\
    12.  ebx,esi,ebx,10011h,COLOR_WINDOW+1,ebx,edi
    13.  ; +--------------------------+
    14.  ; | creating the main window |
    15.  ; +--------------------------+
    16.  push ebx esi ebx ebx
    17.  shl esi,9;400000h * 200h = 80000000h = CW_USEDEFAULT
    18.  invoke CreateWindowEx,ebx,edi,edi,WS_OVERLAPPEDWINDOW+WS_VISIBLE,\
    19.  esi,esi,esi,esi
    20.  mov ebp,esp
    21.  ; +---------------------------+
    22.  ; | entering the message loop |
    23.  ; +---------------------------+
    24. message_loop: invoke GetMessage,ebp,ebx,ebx,ebx
    25.  invoke DispatchMessage,ebp
    26.  jmp message_loop
    27.  ; +----------------------+
    28.  ; | the window procedure |
    29.  ; +----------------------+
    30. window_procedure: cmp dword[esp+8],WM_DESTROY
    31.       je wmDESTROY
    32.       jmp dword [DefWindowProc]
    33. wmDESTROY: invoke ExitProcess,ebx
    34. wTitle db   'Iczelion Tutorial #3:The Simplest Window in FASM',0 ;name and class of our window
    35. data import
    36.  library KERNEL32, 'KERNEL32.DLL',\
    37. user32,   'USER32.DLL'
    38.  import KERNEL32,\
    39.       ExitProcess,   'ExitProcess'
    40.  import user32,\
    41. RegisterClass,    'RegisterClassA',\
    42. CreateWindowEx,     'CreateWindowExA',\
    43. DefWindowProc,    'DefWindowProcA',\
    44. GetMessage,    'GetMessageA',\
    45. DispatchMessage,    'DispatchMessageA'
    46. end data
    47.  
    Уроки Iczelion'а от Sulaiman Chang на диалекте FASM
     
  4. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    [ixTor]

    К примеру берём Esi - он далее используется в RegisterClass(), вызов кривой - так не нужно делать, сохранять ссылку на стек через сам стек, это грязый трюк. Invoke это макрос, серия push, справа на лево, push esp сохранит ссылку на структуру - аргумент апи, смотрим её https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms633576(v=vs.85).aspx
    Esi это hInstance, тоесть база загрузки экзешника, соответственно по дефолту она 0x400000. Такое будет работать корректно только если на mov esi,N - на N имеется фиксап, тоесть приложение собрано с релоками.

    Остальные регистры сами посмотрите аналогично.
     
    rococo795 нравится это.
  5. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
    [ixTor],
    1. _
      всё сделано для уменьшения размера ехе-файла. Ты же на ассемблере пишешь, а не на Delphi :)
    2. _
      после вызова Win API функций значения в регистрах EBX, ESI, EDI, EBP не меняются. Команды push ebx, push esi, push edi - имеют размер 1 байт и используются для формирования значений в структуре WNDCLASS и для передачи параметров в функции CreateWindowEx, GetMessage, ExitProcess. Значения регистра EBX используется там, где требуется push 0 (2 байта). В регистре ESI значение hInstance, именно его вернет "invoke GetModuleHandle,NULL", чуть позже в ESI окажется значение CW_USEDEFAULT, значение в EDI это и заголовок окна и значение wClsName
    3. _
      ни Iczelion, ни Sulaiman Chang тут не причем. У тебя в ехе-файле может быть три секции для кода, данных и импорта, а может быть и одна -- от этого размер РЕ-заголовка уменьшится, а между секциями не будет прослоек из нулей. На работоспособность ехе-файла это никак не отразится
    4. _
      время идет вперед и всё когда-нибудь меняется
    5. вот исходный "классический" текст Sulaiman Chang для третьего урока Iczelion
      Код (ASM):
      1. format PE GUI 4.0
      2. entry start
      3. include '%fasminc%\win32a.inc'
      4. section '.data' data readable writeable
      5.      wHMain         dd   ?
      6.      wHInstance     dd   ?
      7.      wTitle         db   'Tutorial 3',0 ;name of our window
      8.      wClsName       db   'TUT03',0      ;name of our window class
      9.      wMsg      MSG
      10.      wCls      WNDCLASS
      11.  
      12. section '.code' code readable executable
      13.      start:
      14.           ; +------------------------------+
      15.           ; | registering the window class |
      16.           ; +------------------------------+
      17.           invoke    GetModuleHandle,NULL
      18.                     mov  [wHInstance],eax
      19.                     mov  [wCls.hInstance],eax
      20.                     mov  [wCls.style],CS_HREDRAW or CS_VREDRAW
      21.                     mov  [wCls.lpfnWndProc],window_procedure
      22.                     mov  [wCls.lpszClassName],wClsName
      23.                     mov  [wCls.hbrBackground],COLOR_WINDOW+1
      24.           invoke    LoadIcon,NULL,IDI_APPLICATION
      25.                     mov  [wCls.hIcon],eax
      26.           invoke    LoadCursor,NULL,IDC_ARROW
      27.                     mov  [wCls.hCursor],eax
      28.           invoke    RegisterClass,wCls
      29.           ; +--------------------------+
      30.           ; | creating the main window |
      31.           ; +--------------------------+
      32.           invoke    CreateWindowEx,\
      33.                          0,\
      34.                          wClsName,\
      35.                          wTitle,\
      36.                          WS_OVERLAPPEDWINDOW,\
      37.                          CW_USEDEFAULT,\
      38.                          CW_USEDEFAULT,\
      39.                          CW_USEDEFAULT,\
      40.                          CW_USEDEFAULT,\
      41.                          NULL,\
      42.                          NULL,\
      43.                          [wHInstance],\
      44.                          NULL
      45.                     mov  [wHMain],eax
      46.           invoke    ShowWindow,[wHMain],SW_SHOW
      47.           ; +---------------------------+
      48.           ; | entering the message loop |
      49.           ; +---------------------------+
      50.           window_message_loop_start:
      51.                invoke    GetMessage,wMsg,NULL,0,0
      52.                          or   eax,eax
      53.                          je   window_message_loop_end
      54.                invoke    TranslateMessage,wMsg
      55.                invoke    DispatchMessage,wMsg
      56.                          jmp  window_message_loop_start
      57.           window_message_loop_end:
      58.                invoke    ExitProcess,0
      59.           ; +----------------------+
      60.           ; | the window procedure |
      61.           ; +----------------------+
      62.           proc window_procedure,hWnd,uMsg,wParam,lParam
      63.                push ebx esi edi    ;eventhough the API would preserved, but play safe :p
      64.                cmp  [uMsg],WM_DESTROY
      65.                je   wmDESTROY
      66.                wmDEFAULT:
      67.                     invoke    DefWindowProc,[hWnd],[uMsg],[wParam],[lParam]
      68.                               jmp  wmBYE
      69.                wmDESTROY:
      70.                     invoke    PostQuitMessage,0
      71.                wmBYE:
      72.                     pop  edi esi ebx
      73.                     return
      74.           endp
      75. section '.idata' import data readable writeable
      76.      library   KERNEL32, 'KERNEL32.DLL',\
      77.                USER32,   'USER32.DLL'
      78.      import    KERNEL32,\
      79.                GetModuleHandle,    'GetModuleHandleA',\
      80.                ExitProcess,        'ExitProcess'
      81.      import    USER32,\
      82.                RegisterClass,      'RegisterClassA',\
      83.                CreateWindowEx,     'CreateWindowExA',\
      84.                DefWindowProc,      'DefWindowProcA',\
      85.                ShowWindow,         'ShowWindow',\
      86.                LoadCursor,         'LoadCursorA',\
      87.                LoadIcon,           'LoadIconA',\
      88.                GetMessage,         'GetMessageA',\
      89.                TranslateMessage,   'TranslateMessage',\
      90.                DispatchMessage,    'DispatchMessageA',\
      91.                PostQuitMessage,    'PostQuitMessage'
    6. _
      А вот это зря написал, здесь халявщиков не любят:negative:
     
    Последнее редактирование: 6 янв 2017
    rococo795 и Thetrik нравится это.
  6. [ixTor]

    [ixTor] Member

    Публикаций:
    0
    Регистрация:
    5 янв 2017
    Сообщения:
    53
    я просто привык что все пушается перед вызовом апи, поэтому недоглядел, мне сложно сосредоточиться,я недавно пережил стресс так что не судите строго, очень сложно возвращаться в мир по новой.
     
  7. [ixTor]

    [ixTor] Member

    Публикаций:
    0
    Регистрация:
    5 янв 2017
    Сообщения:
    53
    Забыл сказать спасибо вам...
     
  8. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.329
    Так и нужно писать. Это просто они извращаются, пользуясь гибкостью и нестрогостью ассемблера и макросов.
    Сэкономят пару байт на создании окна, а затем добавят в ресурсы иконку на сотню тысяч байт. В итоге ни оптимизации, ни читаемости кода :)
     
    Последнее редактирование модератором: 6 янв 2017
    _edge нравится это.
  9. PAA

    PAA New Member

    Публикаций:
    0
    Регистрация:
    6 янв 2017
    Сообщения:
    1
    Немного оффтоп, но все же рискну спросить - стоит ли начинать изучение асма с уроков iczelion'a ? Хочу двигаться по направлению к VX :)
     
    Последнее редактирование модератором: 6 янв 2017
  10. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
    PAA,
    уроки Iczelion'а это уроки по созданию графического интерфейса, каким образом это может быть связано с VX? Хочешь двигаться "по направлению к VX"? -- займись изучением VX
     
    PAA нравится это.
  11. [ixTor]

    [ixTor] Member

    Публикаций:
    0
    Регистрация:
    5 янв 2017
    Сообщения:
    53
    начни с изучения ассемблера в той среде в которой хочешь работать, к примеру если это масм(огосподе масм это конпелятор + линкер) дада с него можно начать также как и с фасм(фасм помимо всего предоставляет тебе еще и среду но она поганая с лажевой), книжек в сети навалом, если хочешь могу тебе скинуть книгу по фасму хорошую, еще тебе пригодится наверное и среда разработки
     
  12. [ixTor]

    [ixTor] Member

    Публикаций:
    0
    Регистрация:
    5 янв 2017
    Сообщения:
    53
    фасм(но она поганая с лажевой подсветкой синтаксиса) бери RadAsm отсюда http://wasm.in/forum/threads/progra...-win64-chast-1-assembler-otladchik-ide.31858/ надо будет его настроить это целая IDE(о господе что это - в статье поймешь) а книжку я щас выложу в раздел books
    PS сори за два поста, както нажалось само по себе
     
  13. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    631
    Адрес:
    Russia
    По VX инфы очень много. И если у вопрошающего нет желания хотя бы гуглить, насильно мил не будешь. Но VX очень сейчас высокий порог вхождения имеет. Поэтому с одной стороны азаза-скрипткиды, криптующие "комету", а с другой - руткиты х64.
     
    Последнее редактирование: 12 янв 2017
  14. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
    Интересно хотя бы название "хорошей" книги...
    наверное, это Аблязов Р.З. "Программирование на ассемблере на платформе x86-64"? или нет?
     
  15. [ixTor]

    [ixTor] Member

    Публикаций:
    0
    Регистрация:
    5 янв 2017
    Сообщения:
    53
    она самая, уже опубликовал в разделе книг, непонятно правда почему снесли мой пост рекламирующий эту манускрипт в статье в разделе артиклес, ламер бы сразу понял что качать надо, тем более книга была в тему...
    ЗЫ разве что для усложнения жизни новичкам которые постят посты "что почитать?"
     
    Последнее редактирование модератором: 12 янв 2017
  16. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
    [ixTor],
    внимательно читаем назначение разделов
    WASM.ARTICLES раздел предназначенный для статей (статьи, проба пера)
    WASM.BOOKS (Обсуждение книг по тематике форума, сообщения об опечатках)
     
    Последнее редактирование: 12 янв 2017
  17. [ixTor]

    [ixTor] Member

    Публикаций:
    0
    Регистрация:
    5 янв 2017
    Сообщения:
    53
    так тож юыл комент на книгу в нужном разделе...ну даладно пофиг удалили и фиг с ним