вот имеется значит такой кодес в статье создание окошка Код (Text): format PE GUI include 'win32ax.inc' ; import, code, data in the same section xor ebx,ebx mov edi,wTitle mov esi,400000h ; +------------------------------+ ; | registering the window class | ; +------------------------------+ вопрос в том что я никак не догоняю зачем нужно делать xor ebx,ebx и почему именно в edi заносится адрес wTitle и почему esi получает значение 400000h, оговорюсь что я таки понимаю что так создается окно но почему именно эти регистры и именно эти значения? Коментарий самого Изелиона (импорт код и данные в одной секции) мне непонятен, а ведь дальше двигаться я не смогу ведь это основа, объясните пожалуйста, и не кидайтесь только тухлыми гуглами и яндексами. Умоляю объясните....я когда то учил Masm но там такого не было вродебы.
У вас не полностью скопирован код, предположу, что в регистрах - передаваемые параметры в функцию, соответственно регистры могут быть любые (если конечно они не используются повторно после вызова функции).
вот весь код Код (ASM): format PE GUI include 'win32ax.inc' ; import, code, data in the same section xor ebx,ebx mov edi,wTitle mov esi,400000h ; +------------------------------+ ; | registering the window class | ; +------------------------------+ invoke RegisterClass,esp,ebx,window_procedure,ebx,\ ebx,esi,ebx,10011h,COLOR_WINDOW+1,ebx,edi ; +--------------------------+ ; | creating the main window | ; +--------------------------+ push ebx esi ebx ebx shl esi,9;400000h * 200h = 80000000h = CW_USEDEFAULT invoke CreateWindowEx,ebx,edi,edi,WS_OVERLAPPEDWINDOW+WS_VISIBLE,\ esi,esi,esi,esi mov ebp,esp ; +---------------------------+ ; | entering the message loop | ; +---------------------------+ message_loop: invoke GetMessage,ebp,ebx,ebx,ebx invoke DispatchMessage,ebp jmp message_loop ; +----------------------+ ; | the window procedure | ; +----------------------+ window_procedure: cmp dword[esp+8],WM_DESTROY je wmDESTROY jmp dword [DefWindowProc] wmDESTROY: invoke ExitProcess,ebx wTitle db 'Iczelion Tutorial #3:The Simplest Window in FASM',0 ;name and class of our window data import library KERNEL32, 'KERNEL32.DLL',\ user32, 'USER32.DLL' import KERNEL32,\ ExitProcess, 'ExitProcess' import user32,\ RegisterClass, 'RegisterClassA',\ CreateWindowEx, 'CreateWindowExA',\ DefWindowProc, 'DefWindowProcA',\ GetMessage, 'GetMessageA',\ DispatchMessage, 'DispatchMessageA' end data Уроки Iczelion'а от Sulaiman Chang на диалекте FASM
[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 имеется фиксап, тоесть приложение собрано с релоками. Остальные регистры сами посмотрите аналогично.
[ixTor], _ всё сделано для уменьшения размера ехе-файла. Ты же на ассемблере пишешь, а не на Delphi _ после вызова 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 _ ни Iczelion, ни Sulaiman Chang тут не причем. У тебя в ехе-файле может быть три секции для кода, данных и импорта, а может быть и одна -- от этого размер РЕ-заголовка уменьшится, а между секциями не будет прослоек из нулей. На работоспособность ехе-файла это никак не отразится _ время идет вперед и всё когда-нибудь меняется вот исходный "классический" текст Sulaiman Chang для третьего урока Iczelion Код (ASM): format PE GUI 4.0 entry start include '%fasminc%\win32a.inc' section '.data' data readable writeable wHMain dd ? wHInstance dd ? wTitle db 'Tutorial 3',0 ;name of our window wClsName db 'TUT03',0 ;name of our window class wMsg MSG wCls WNDCLASS section '.code' code readable executable start: ; +------------------------------+ ; | registering the window class | ; +------------------------------+ invoke GetModuleHandle,NULL mov [wHInstance],eax mov [wCls.hInstance],eax mov [wCls.style],CS_HREDRAW or CS_VREDRAW mov [wCls.lpfnWndProc],window_procedure mov [wCls.lpszClassName],wClsName mov [wCls.hbrBackground],COLOR_WINDOW+1 invoke LoadIcon,NULL,IDI_APPLICATION mov [wCls.hIcon],eax invoke LoadCursor,NULL,IDC_ARROW mov [wCls.hCursor],eax invoke RegisterClass,wCls ; +--------------------------+ ; | creating the main window | ; +--------------------------+ invoke CreateWindowEx,\ 0,\ wClsName,\ wTitle,\ WS_OVERLAPPEDWINDOW,\ CW_USEDEFAULT,\ CW_USEDEFAULT,\ CW_USEDEFAULT,\ CW_USEDEFAULT,\ NULL,\ NULL,\ [wHInstance],\ NULL mov [wHMain],eax invoke ShowWindow,[wHMain],SW_SHOW ; +---------------------------+ ; | entering the message loop | ; +---------------------------+ window_message_loop_start: invoke GetMessage,wMsg,NULL,0,0 or eax,eax je window_message_loop_end invoke TranslateMessage,wMsg invoke DispatchMessage,wMsg jmp window_message_loop_start window_message_loop_end: invoke ExitProcess,0 ; +----------------------+ ; | the window procedure | ; +----------------------+ proc window_procedure,hWnd,uMsg,wParam,lParam push ebx esi edi ;eventhough the API would preserved, but play safe :p cmp [uMsg],WM_DESTROY je wmDESTROY wmDEFAULT: invoke DefWindowProc,[hWnd],[uMsg],[wParam],[lParam] jmp wmBYE wmDESTROY: invoke PostQuitMessage,0 wmBYE: pop edi esi ebx return endp section '.idata' import data readable writeable library KERNEL32, 'KERNEL32.DLL',\ USER32, 'USER32.DLL' import KERNEL32,\ GetModuleHandle, 'GetModuleHandleA',\ ExitProcess, 'ExitProcess' import USER32,\ RegisterClass, 'RegisterClassA',\ CreateWindowEx, 'CreateWindowExA',\ DefWindowProc, 'DefWindowProcA',\ ShowWindow, 'ShowWindow',\ LoadCursor, 'LoadCursorA',\ LoadIcon, 'LoadIconA',\ GetMessage, 'GetMessageA',\ TranslateMessage, 'TranslateMessage',\ DispatchMessage, 'DispatchMessageA',\ PostQuitMessage, 'PostQuitMessage' _ А вот это зря написал, здесь халявщиков не любят
я просто привык что все пушается перед вызовом апи, поэтому недоглядел, мне сложно сосредоточиться,я недавно пережил стресс так что не судите строго, очень сложно возвращаться в мир по новой.
Так и нужно писать. Это просто они извращаются, пользуясь гибкостью и нестрогостью ассемблера и макросов. Сэкономят пару байт на создании окна, а затем добавят в ресурсы иконку на сотню тысяч байт. В итоге ни оптимизации, ни читаемости кода
Немного оффтоп, но все же рискну спросить - стоит ли начинать изучение асма с уроков iczelion'a ? Хочу двигаться по направлению к VX
PAA, уроки Iczelion'а это уроки по созданию графического интерфейса, каким образом это может быть связано с VX? Хочешь двигаться "по направлению к VX"? -- займись изучением VX
начни с изучения ассемблера в той среде в которой хочешь работать, к примеру если это масм(огосподе масм это конпелятор + линкер) дада с него можно начать также как и с фасм(фасм помимо всего предоставляет тебе еще и среду но она поганая с лажевой), книжек в сети навалом, если хочешь могу тебе скинуть книгу по фасму хорошую, еще тебе пригодится наверное и среда разработки
фасм(но она поганая с лажевой подсветкой синтаксиса) бери RadAsm отсюда http://wasm.in/forum/threads/progra...-win64-chast-1-assembler-otladchik-ide.31858/ надо будет его настроить это целая IDE(о господе что это - в статье поймешь) а книжку я щас выложу в раздел books PS сори за два поста, както нажалось само по себе
По VX инфы очень много. И если у вопрошающего нет желания хотя бы гуглить, насильно мил не будешь. Но VX очень сейчас высокий порог вхождения имеет. Поэтому с одной стороны азаза-скрипткиды, криптующие "комету", а с другой - руткиты х64.
Интересно хотя бы название "хорошей" книги... наверное, это Аблязов Р.З. "Программирование на ассемблере на платформе x86-64"? или нет?
она самая, уже опубликовал в разделе книг, непонятно правда почему снесли мой пост рекламирующий эту манускрипт в статье в разделе артиклес, ламер бы сразу понял что качать надо, тем более книга была в тему... ЗЫ разве что для усложнения жизни новичкам которые постят посты "что почитать?"
[ixTor], внимательно читаем назначение разделов WASM.ARTICLES раздел предназначенный для статей (статьи, проба пера) WASM.BOOKS (Обсуждение книг по тематике форума, сообщения об опечатках)