Вот странно, были билды, с которых мне нужна часть, по добавлению смещения в modrm, этого отладка была закончена. Напишем заново. Было нескольких публикаций, но похоже это удалено вручную, тк не помню всяких изменений такого рода(в истории нет). Кто же будет читать бесконечный поток мыслей авторов про иду, как с картинками разобрать семпл
Ahimov, кто-нибудь непосвещённый почитает ваши посты по ИИ и подумает, что с помощью ИИ - можно хоть докторскую диссертацию быстренько набросать, влёгкую. Но парадокс в том, что с помощью ИИ вы решаете какие-то сложнейшие задачи и не можете решить элементарную. Вот то, что выдал вам ИИ по запросу : написать код простого окна с двумя кнопками, при нажатии на которые вызываются сообщения (функции) MessageBoxA - для MASM64. Выше вы его уже выкладывали (дублирую для удобства). Вы этот код анализировали, компилировали? Я лично, пришёл к выводу, что ИИ вам выдал полный бред. Какая-то нерабочая смесь MASM32 и MASM64, да ещё с неправильным размещением главных функций окна. Может я дилетант в GUI и в простых окнах для Windows? Тогда пусть кто-нибудь перепроверит этот БРЕД. Мало ли, может у кого-то это прекрасно скомпилируется и заработает. Код (ASM): ; ----------------------------------------------------------------------------------------------------------------------- ; Инклюды и библиотеки ; Этот код требует установки MASM32 SDK (или аналогичного) для инклуд-файлов и библиотек. ; ----------------------------------------------------------------------------------------------------------------------- include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\user32.inc includelib \masm32\lib\kernel32.lib includelib \masm32\lib\user32.lib ; ----------------------------------------------------------------------------------------------------------------------- ; Константы и Идентификаторы ; ----------------------------------------------------------------------------------------------------------------------- .const ID_BUTTON_1 equ 1000 ; Идентификатор для первой кнопки ID_BUTTON_2 equ 1001 ; Идентификатор для второй кнопки WIN_TITLE db "MASM64 Пример с Кнопками", 0 CLASS_NAME db "MASM64WindowClass", 0 BUTTON_TEXT_1 db "Нажми меня (1)", 0 BUTTON_TEXT_2 db "Нажми меня (2)", 0 MSG_CAPTION_1 db "Сообщение Кнопки 1", 0 MSG_CAPTION_2 db "Сообщение Кнопки 2", 0 MSG_TEXT_1 db "Вы нажали кнопку 1!", 0 MSG_TEXT_2 db "Вы нажали кнопку 2!", 0 ; ----------------------------------------------------------------------------------------------------------------------- ; Глобальные переменные ; ----------------------------------------------------------------------------------------------------------------------- .data hInstance dq ? ; Дескриптор экземпляра hWnd dq ? ; Дескриптор главного окна wcex WNDCLASSEX <> ; Структура класса окна msg MSG <> ; Структура сообщения ; ----------------------------------------------------------------------------------------------------------------------- ; Прототипы функций ; ----------------------------------------------------------------------------------------------------------------------- WinMain proto :QWORD, :QWORD, :QWORD, :QWORD WindowProc proto :QWORD, :QWORD, :QWORD, :QWORD ; ----------------------------------------------------------------------------------------------------------------------- .code ; ----------------------------------------------------------------------------------------------------------------------- ; Точка входа в программу (аналог WinMain) ; ----------------------------------------------------------------------------------------------------------------------- start: ; Вызов WinMain (в MASM64 он вызывается напрямую) invoke WinMain, 0, 0, 0, SW_SHOWNORMAL invoke ExitProcess, rax ; Выход из программы ; ----------------------------------------------------------------------------------------------------------------------- ; Функция WinMain ; ----------------------------------------------------------------------------------------------------------------------- WinMain proc hInst:QWORD, hPrevInst:QWORD, CmdLine:QWORD, CmdShow:QWORD ; 1. Получение дескриптора экземпляра (hInst) invoke GetModuleHandle, NULL mov [hInstance], rax ; 2. Регистрация класса окна ; Заполнение структуры WNDCLASSEX mov [wcex.cbSize], SizeOf WNDCLASSEX mov [wcex.style], CS_HREDRAW | CS_VREDRAW mov [wcex.lpfnWndProc], OFFSET WindowProc ; Указатель на обработчик mov [wcex.cbClsExtra], 0 mov [wcex.cbWndExtra], 0 mov rax, [hInstance] mov [wcex.hInstance], rax invoke LoadIcon, NULL, IDI_APPLICATION mov [wcex.hIcon], rax mov [wcex.hIconSm], rax invoke LoadCursor, NULL, IDC_ARROW mov [wcex.hCursor], rax mov [wcex.hbrBackground], COLOR_WINDOW + 1 mov [wcex.lpszMenuName], NULL mov [wcex.lpszClassName], OFFSET CLASS_NAME ; Регистрация invoke RegisterClassEx, ADDR wcex cmp rax, 0 jz Exit_Error ; Если регистрация не удалась ; 3. Создание главного окна invoke CreateWindowEx, \ 0, \ ADDR CLASS_NAME, \ ADDR WIN_TITLE, \ WS_OVERLAPPEDWINDOW, \ 100, \ 100, \ 400, \ 200, \ NULL, \ NULL, \ [hInstance], \ NULL mov [hWnd], rax cmp rax, 0 jz Exit_Error ; Если создание не удалось ; 4. Создание кнопок ; Кнопка 1 invoke CreateWindowEx, \ 0, \ ADDR "Button", \ ADDR BUTTON_TEXT_1, \ WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, \ 50, \ 50, \ 120, \ 30, \ [hWnd], \ ID_BUTTON_1, \ [hInstance], \ NULL ; Кнопка 2 invoke CreateWindowEx, \ 0, \ ADDR "Button", \ ADDR BUTTON_TEXT_2, \ WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, \ 220, \ 50, \ 120, \ 30, \ [hWnd], \ ID_BUTTON_2, \ [hInstance], \ NULL ; 5. Отображение окна invoke ShowWindow, [hWnd], CmdShow invoke UpdateWindow, [hWnd] ; 6. Оконный цикл сообщений (Message Loop) Message_Loop: invoke GetMessage, ADDR msg, NULL, 0, 0 cmp rax, 0 je Quit_App invoke TranslateMessage, ADDR msg invoke DispatchMessage, ADDR msg jmp Message_Loop Quit_App: ; Возвращение значения WM_QUIT mov rax, [msg.wParam] ret Exit_Error: xor rax, rax ; Возврат 0 в случае ошибки ret WinMain endp ; ----------------------------------------------------------------------------------------------------------------------- ; Процедура окна (Обработчик сообщений) ; ----------------------------------------------------------------------------------------------------------------------- WindowProc proc hWnd_p:QWORD, uMsg:QWORD, wParam:QWORD, lParam:QWORD ; Обработка сообщений cmp uMsg, WM_COMMAND je Handle_Command cmp uMsg, WM_DESTROY je Handle_Destroy ; Сообщения по умолчанию invoke DefWindowProc, hWnd_p, uMsg, wParam, lParam ret ; --- Обработка WM_COMMAND --- Handle_Command: mov rax, wParam and rax, 0FFFFh ; Получаем идентификатор элемента управления (LOWORD(wParam)) cmp rax, ID_BUTTON_1 je Button1_Click cmp rax, ID_BUTTON_2 je Button2_Click jmp Command_Default Button1_Click: ; Вызов MessageBox для Кнопки 1 invoke MessageBox, hWnd_p, ADDR MSG_TEXT_1, ADDR MSG_CAPTION_1, MB_OK | MB_ICONINFORMATION jmp Command_Default Button2_Click: ; Вызов MessageBox для Кнопки 2 invoke MessageBox, hWnd_p, ADDR MSG_TEXT_2, ADDR MSG_CAPTION_2, MB_OK | MB_ICONWARNING jmp Command_Default Command_Default: xor rax, rax ; Возврат 0 ret ; --- Обработка WM_DESTROY --- Handle_Destroy: invoke PostQuitMessage, 0 xor rax, rax ; Возврат 0 ret WindowProc endp end start
GRAFik - он не знает какие пути, инклуды и тп у вас. Вообще бред такие боту вопросы задавать - собери компилируемый сэмпл".
Путей у нас всего два: либо SDK Хуча - Mikl___ либо компиляция через Visual Studio (у меня VS 2022). Пусть любой выбирает. Да и причем здесь пути и инклуды, когда сам код бредовый А какие вопросы нужно задавать боту? В чём смысл жизни? Так на этот вопрос - любой дурак ответит. Или на ваш взгляд - ИИ именно для таких вопросов и разрабатывали? Ладно, подождём других специалистов по MASM64, если вы ничего конкретного не можете предложить. Может Mikl___ прояснит ситуацию по поводу правильности кода. Может у Mikl___ 'а код от ИИ соберется и заработает.
GRAFik Код (Text): Code snippet ; ----------------------------------------------------------------------------------------------------------------------- ; MASM64 - Чистый код без макроса invoke ; ----------------------------------------------------------------------------------------------------------------------- option casemap:none ; В MASM64 обычно используются стандартные системные библиотеки extrn GetModuleHandleA : proc extrn GetMessageA : proc extrn TranslateMessage : proc extrn DispatchMessageA : proc extrn LoadIconA : proc extrn LoadCursorA : proc extrn RegisterClassExA : proc extrn CreateWindowExA : proc extrn ShowWindow : proc extrn UpdateWindow : proc extrn MessageBoxA : proc extrn PostQuitMessage : proc extrn DefWindowProcA : proc extrn ExitProcess : proc ; Псевдонимы для удобства (совместимость с вашим кодом) GetModuleHandle equ <GetModuleHandleA> GetMessage equ <GetMessageA> DispatchMessage equ <DispatchMessageA> LoadIcon equ <LoadIconA> LoadCursor equ <LoadCursorA> RegisterClassEx equ <RegisterClassExA> CreateWindowEx equ <CreateWindowExA> MessageBox equ <MessageBoxA> DefWindowProc equ <DefWindowProcA> include \masm32\include\windows.inc ; Используем константы из MASM32, они идентичны .const ID_BUTTON_1 equ 1000 ID_BUTTON_2 equ 1001 WIN_TITLE db "MASM64 No Invoke", 0 CLASS_NAME db "MASM64WindowClass", 0 BTN_CLASS db "Button", 0 BUTTON_TEXT_1 db "Нажми меня (1)", 0 BUTTON_TEXT_2 db "Нажми меня (2)", 0 MSG_CAPTION_1 db "Сообщение Кнопки 1", 0 MSG_CAPTION_2 db "Сообщение Кнопки 2", 0 MSG_TEXT_1 db "Вы нажали кнопку 1!", 0 MSG_TEXT_2 db "Вы нажали кнопку 2!", 0 .data hInstance dq ? hWnd dq ? wcex WNDCLASSEX <> msg MSG <> .code ; ----------------------------------------------------------------------------------------------------------------------- start proc sub rsp, 28h ; Резерв Shadow Space + выравнивание xor rcx, rcx ; lpModuleName = NULL call GetModuleHandle mov hInstance, rax mov r9, SW_SHOWNORMAL ; 4-й аргумент xor r8, r8 ; 3-й xor rdx, rdx ; 2-й mov rcx, rax ; 1-й (hInstance) call WinMain mov rcx, rax ; Код выхода call ExitProcess start endp ; ----------------------------------------------------------------------------------------------------------------------- WinMain proc hInst:QWORD, hPrevInst:QWORD, CmdLine:QWORD, CmdShow:QWORD local loc_cmdShow:QWORD mov loc_cmdShow, r9 ; Сохраним CmdShow (r9 затрется при вызовах) sub rsp, 30h ; Место для структуры и вызовов ; Заполнение WNDCLASSEX mov [wcex.cbSize], sizeof WNDCLASSEX mov [wcex.style], CS_HREDRAW or CS_VREDRAW lea rax, WindowProc mov [wcex.lpfnWndProc], rax mov [wcex.cbClsExtra], 0 mov [wcex.cbWndExtra], 0 mov rax, hInstance mov [wcex.hInstance], rax xor rdx, rdx mov dx, IDI_APPLICATION xor rcx, rcx call LoadIcon mov [wcex.hIcon], rax mov [wcex.hIconSm], rax xor rdx, rdx mov dx, IDC_ARROW xor rcx, rcx call LoadCursor mov [wcex.hCursor], rax mov [wcex.hbrBackground], COLOR_WINDOW + 1 mov [wcex.lpszMenuName], 0 lea rax, CLASS_NAME mov [wcex.lpszClassName], rax lea rcx, wcex call RegisterClassEx test rax, rax jz Exit_Error ; Создание окна sub rsp, 60h ; Место под 12 параметров (8 * 8 байт лишних в стеке) mov qword ptr [rsp+58h], 0 ; lpParam mov rax, hInstance mov qword ptr [rsp+50h], rax ; hInstance mov qword ptr [rsp+48h], 0 ; hMenu mov qword ptr [rsp+40h], 0 ; hWndParent mov qword ptr [rsp+38h], 200 ; nHeight mov qword ptr [rsp+30h], 400 ; nWidth mov qword ptr [rsp+28h], 100 ; y mov qword ptr [rsp+20h], 100 ; x mov r9, WS_OVERLAPPEDWINDOW ; dwStyle lea r8, WIN_TITLE ; lpWindowName lea r2, CLASS_NAME ; rdx (но используем rdx) lea rdx, CLASS_NAME xor rcx, rcx ; dwExStyle call CreateWindowEx add rsp, 60h ; Очистка стека параметров mov hWnd, rax test rax, rax jz Exit_Error ; Кнопка 1 sub rsp, 60h mov qword ptr [rsp+58h], 0 mov rax, hInstance mov qword ptr [rsp+50h], rax mov qword ptr [rsp+48h], ID_BUTTON_1 mov rax, hWnd mov qword ptr [rsp+40h], rax mov qword ptr [rsp+38h], 30 mov qword ptr [rsp+30h], 120 mov qword ptr [rsp+28h], 50 mov qword ptr [rsp+20h], 50 mov r9, WS_TABSTOP or WS_VISIBLE or WS_CHILD or BS_PUSHBUTTON lea r8, BUTTON_TEXT_1 lea rdx, BTN_CLASS xor rcx, rcx call CreateWindowEx add rsp, 60h ; Показ окна mov rdx, loc_cmdShow mov rcx, hWnd call ShowWindow mov rcx, hWnd call UpdateWindow Message_Loop: xor r9, r9 xor r8, r8 xor rdx, rdx lea rcx, msg call GetMessage test rax, rax jz Quit_App lea rcx, msg call TranslateMessage lea rcx, msg call DispatchMessage jmp Message_Loop Quit_App: mov rax, msg.wParam add rsp, 30h ret Exit_Error: xor rax, rax add rsp, 30h ret WinMain endp ; ----------------------------------------------------------------------------------------------------------------------- WindowProc proc hWnd_p:QWORD, uMsg:QWORD, wParam:QWORD, lParam:QWORD ; В x64 параметры уже в rcx, rdx, r8, r9 cmp rdx, WM_COMMAND je Handle_Command cmp rdx, WM_DESTROY je Handle_Destroy ; Если не наше — в дефолт ; rcx, rdx, r8, r9 уже на местах sub rsp, 28h call DefWindowProc add rsp, 28h ret Handle_Command: mov rax, r8 ; wParam and rax, 0FFFFh ; LOWORD cmp rax, ID_BUTTON_1 je Button1_Click cmp rax, ID_BUTTON_2 je Button2_Click xor rax, rax ret Button1_Click: sub rsp, 28h mov r9, MB_OK or MB_ICONINFORMATION lea r8, MSG_CAPTION_1 lea rdx, MSG_TEXT_1 mov rcx, hWnd_p call MessageBox add rsp, 28h xor rax, rax ret Button2_Click: sub rsp, 28h mov r9, MB_OK or MB_ICONWARNING lea r8, MSG_CAPTION_2 lea rdx, MSG_TEXT_2 mov rcx, hWnd_p call MessageBox add rsp, 28h xor rax, rax ret Handle_Destroy: sub rsp, 28h xor rcx, rcx call PostQuitMessage add rsp, 28h xor rax, rax ret WindowProc endp end ps если у бота спросить сам не можешь даже, о какой сборке может идти речь
Действительно, если не можете проверить на корректность код, который вам генерирует БРЕДО-БОТ - о какой сборке может идти речь? И логично ли обсуждать какие-либо тонкости и вопросы по коду с таким "специалистом"? Ладно, подождём, может Mikl___ прояснит ситуацию.
GRAFik Покажи место с ошибкой или может она в логике ? invoke это штатный макрос. Если запросить: Код (Text): void start() { auto hInst = GetModuleHandle(null); WinMain(hInst, ...); ExitProcess(0); } LRESULT WindowProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { switch(msg) { case WM_COMMAND: if (LOWORD(wp) == ID_BUTTON_1) MessageBox(hWnd, "Вы нажали кнопку 1!", "Сообщение Кнопки 1", MB_OK); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, msg, wp, lp); } return 0; } Что на счет r2, я не знаю как бот устроен: Реверсит замечательно. > если не можете проверить на корректность код Для этого нужно внимательно смотреть листинг, либо же собирать, что бы видеть лог. Мобилой это сделать проблемно.)
Да никакой он не штатный. Если бы был штатный, то с Visual Studio бы поставлялся. Microsoft в MASM64 - отказалась от этого макроса. Это умельцы ассемблерщики сами его добавили в SDK. Да там, на мой взгляд, "куда не плюнь" - почти везде БРЕД и с логикой в том числе. Я что предлагаю: Не выяснять кто умнее, а устранить ошибки и отослать багрепорт разработчикам ИИ. Я с ними связывался, они ответили, что всё знать невозможо. Мы (в смысле разработчики) не можем быть специалистами во всех областях знаний. И попросили помочь, если я действительно заинтересован в улучшении ИИ. В общем, разработчики просили прислать рабочий код, чтобы они смогли его сравнить с тем, что генерирует ИИ. И постараться исправить ошибку в следующей версии ИИ.
Недавно попросил бота сделать класс нейросети как в tensorflow/keras, вообще не думал что такое возможно, нужно было учитывать особенности языка: Местами очень умная вещь, и явно недооцененная.
R81..., DeepSeek слишком самостоятельный, он не слушает", например генерит академический матан из простых понятий на свой лад
Мир утонул в причудливых теориях, в которые адепты ии уверовали. Отныне никакого критического мышления. Только проекция человеческого желания видеть разум там, где его нет.