Ahimov, у меня к вам просьба. Вы можете Депсику дать задание (промт) ? У меня он тупо всё сбрасывает ( видимо, с перепуга -когда видит слово АССЕМБЛЕР ). Может вам что-нибудь ответит. Просто интересно, какой будет ответ и сколько там будет ошибок. Если Депсик что-то ответит, я потом могу проверить у себя его ответ. А вдруг он будет правильным. Чудеса ведь иногда случаются. ПРОМТ для ДЕПСИКа: Операционная система Windows 10 Pro x64. Вы можете сгенерировать код для ассемблера NASM x64 ( ABI x64 ) простого окна с двумя кнопками, при нажатии на которые - вызывается функция MessageBoxA ?
Зачем создавать на форуме по низк. ур. програмированию хаос из бредовых теорий? Подлый и убогий ТТР ничем не доказан. Теория разбитых окон.
GRAFik, вот. Ему нужны структуры, без них пытается вычислять, а так нельзя делать, он ошибется или придумает, короче ввод неопределенности Затем необходимо загрузить сохраненный чат - он полностью не удерживает его в памяти, для проверки. ps. В данном случае насм, яп вообще не нужен - он может собрать в дамп, не придерживаясь формата. Тоесть: задача -> спецификация -> хексдамп.
Ahimov, в общем, дела с генерацией кода для NASM x64 (ABI x64) обстоят так: Если ты точно знаешь - какой дожен быть код, тогда путем небольших корректировок кода для NASM x64 - процесс получения нужного кода с нужной последовательностью инструкций для NASM - немного ускоряется. Если ты понятия не имеешь как должен работать код и не знаешь точной последовательности инструкций для ассемблера NASM x64 - можно просидеть над компиляцией и исправлениями много времени и не добиться получения правильно работающего кода. Код который сгенерировал Дипсик - почти рабочий. Я его позже чуть подправлю\проверю и выложу в своём посте.
GRAFik, > знаешь точной последовательности инструкций для ассемблера NASM Не знаю синтаксис насм. В каком конкретно месте "почти" ?
Я код подправлю и выложу. Ну и будет ясно и понятно в каких местах у Дипсика "косяки". --- Сообщение объединено, 26 апр 2026 --- Извиняюсь за задержку. Немного запутался с NASM x64, пришлось с отладчиком немного повозится. Да, класный код сгенерировал Дипсик - у меня аж голова от этой генерации разболелась. Код (ASM): ;============================================================================== ; app.asm (Финальная и рабочая x64 версия) ; 64-bit Windows GUI application. ; ; Assemble: nasm -f win64 app.asm -o app.obj ; Link: link /subsystem:windows /entry:WinMain app.obj user32.lib kernel32.lib /out:app.exe ;============================================================================== default rel global WinMain extern GetModuleHandleA extern ShowWindow extern UpdateWindow extern GetMessageA extern TranslateMessage extern DispatchMessageA extern DefWindowProcA extern PostQuitMessage extern RegisterClassExA extern CreateWindowExA extern MessageBoxA ;============================================================================== ; Constants ;============================================================================== NULL equ 0 CW_USEDEFAULT equ 80000000h WS_CHILD equ 40000000h WS_VISIBLE equ 10000000h BS_PUSHBUTTON equ 00000000h WS_OVERLAPPEDWINDOW equ 00CF0000h CS_HREDRAW equ 0002h CS_VREDRAW equ 0001h WM_CREATE equ 0001h WM_COMMAND equ 0111h WM_DESTROY equ 0002h ID_BUTTON1 equ 1001 ID_BUTTON2 equ 1002 MB_OK equ 0 SW_SHOW equ 5 ; Константа для принудительного показа окна [ Позже разберёмся :) ] COLOR_WINDOW equ 5 ; Цвет фона окна ;============================================================================== ; Structures (align 8 for x64) ;============================================================================== struc WNDCLASSEX .cbSize resd 1 ; 0 .style resd 1 ; 4 (padding 0) .lpfnWndProc resq 1 ; 8 .cbClsExtra resd 1 ; 16 .cbWndExtra resd 1 ; 20 .hInstance resq 1 ; 24 .hIcon resq 1 ; 32 .hCursor resq 1 ; 40 .hbrBackground resq 1 ; 48 .lpszMenuName resq 1 ; 56 .lpszClassName resq 1 ; 64 .hIconSm resq 1 ; 72 endstruc ; size = 80 struc MSG .hwnd resq 1 ; 0 .message resd 1 ; 8 resd 1 ; 12 (padding) .wParam resq 1 ; 16 .lParam resq 1 ; 24 .time resd 1 ; 32 resd 1 ; 36 (padding) .pt_x resd 1 ; 40 .pt_y resd 1 ; 44 endstruc ; size = 48 ;============================================================================== ; Data section ;============================================================================== section .data class_name db "MyWindowClass",0 but_class db "BUTTON",0 win_title db "Two Buttons App",0 btn1_text db "Button1",0 btn2_text db "Button2",0 msg_title db "Info",0 msg1 db "You clicked Button1",0 msg2 db "You clicked Button2",0 ;============================================================================== ; BSS section ;============================================================================== section .bss wc: resb WNDCLASSEX_size msg: resb MSG_size hInstance: resq 1 hWnd: resq 1 ;============================================================================== ; Code section ;============================================================================== section .text ;----------------------------------------------------------------------------- ; WinMain(Без параметров, так как CRT отключен) ;----------------------------------------------------------------------------- WinMain: push rbp mov rbp, rsp ; Выделяем 96 байт в стеке (Shadow Space + параметры для CreateWindowExA) sub rsp, 60h ; 1. Получаем настоящий hInstance от ОС xor rcx, rcx call GetModuleHandleA mov [hInstance], rax ; ----- Register window class ----- mov dword [wc + WNDCLASSEX.cbSize], WNDCLASSEX_size mov dword [wc + WNDCLASSEX.style], CS_HREDRAW | CS_VREDRAW lea rax, [WndProc] ; PIC-адресация функции mov qword [wc + WNDCLASSEX.lpfnWndProc], rax mov dword [wc + WNDCLASSEX.cbClsExtra], 0 mov dword [wc + WNDCLASSEX.cbWndExtra], 0 mov rax, [hInstance] mov qword [wc + WNDCLASSEX.hInstance], rax mov qword [wc + WNDCLASSEX.hIcon], NULL mov qword [wc + WNDCLASSEX.hCursor], NULL mov qword [wc + WNDCLASSEX.hbrBackground], COLOR_WINDOW mov qword [wc + WNDCLASSEX.lpszMenuName], NULL lea rax, [class_name] ; PIC-адресация строки mov qword [wc + WNDCLASSEX.lpszClassName], rax mov qword [wc + WNDCLASSEX.hIconSm], NULL lea rcx, [wc] call RegisterClassExA test eax, eax jz .exit_fail ; ----- Create main window ----- mov eax, CW_USEDEFAULT ; Избегаем ошибки 64-bit sign extension mov qword [rsp+20h], rax ; X mov qword [rsp+28h], rax ; Y mov qword [rsp+30h], rax ; nWidth mov qword [rsp+38h], rax ; nHeight mov qword [rsp+40h], NULL ; hWndParent mov qword [rsp+48h], NULL ; hMenu mov rax, [hInstance] mov qword [rsp+50h], rax ; hInstance mov qword [rsp+58h], NULL ; lpParam xor rcx, rcx lea rdx, [class_name] lea r8, [win_title] mov r9d, WS_OVERLAPPEDWINDOW call CreateWindowExA test rax, rax jz .exit_fail mov [hWnd], rax ; ----- Show window ----- mov rcx, [hWnd] mov edx, SW_SHOW ; 2. Жестко говорим системе ПОКАЗАТЬ окно call ShowWindow ; ----- Update window ----- mov rcx, [hWnd] call UpdateWindow ; ----- Message loop ----- .message_loop: lea rcx, [msg] xor rdx, rdx xor r8, r8 xor r9, r9 call GetMessageA test eax, eax jz .exit_ok lea rcx, [msg] call TranslateMessage lea rcx, [msg] call DispatchMessageA jmp .message_loop .exit_ok: mov eax, [msg + MSG.wParam] jmp .exit .exit_fail: xor eax, eax .exit: add rsp, 60h pop rbp ret ;----------------------------------------------------------------------------- ; WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) ;----------------------------------------------------------------------------- WndProc: push rbp mov rbp, rsp push rbx ; Выделяем 104 байта. С учетом push rbp(8) и push rbx(8) это дает 120 байт ; + 8 байт адреса возврата = 128 байт. Стек идеально выровнен по 16 байтам! sub rsp, 68h mov rbx, rcx ; Сохраняем hWnd cmp edx, WM_CREATE je .wm_create cmp edx, WM_COMMAND je .wm_command cmp edx, WM_DESTROY je .wm_destroy .default: call DefWindowProcA jmp .return .wm_create: ; ----- Create Button 1 ----- mov qword [rsp+20h], 50 ; X mov qword [rsp+28h], 50 ; Y mov qword [rsp+30h], 100 ; nWidth mov qword [rsp+38h], 30 ; nHeight mov qword [rsp+40h], rbx ; hWndParent mov qword [rsp+48h], ID_BUTTON1 ; hMenu mov rax, [hInstance] mov qword [rsp+50h], rax ; hInstance mov qword [rsp+58h], NULL ; lpParam xor rcx, rcx lea rdx, [but_class] lea r8, [btn1_text] mov r9d, WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON call CreateWindowExA ; ----- Create Button 2 ----- mov qword [rsp+20h], 50 mov qword [rsp+28h], 100 mov qword [rsp+30h], 100 mov qword [rsp+38h], 30 mov qword [rsp+40h], rbx mov qword [rsp+48h], ID_BUTTON2 mov rax, [hInstance] mov qword [rsp+50h], rax mov qword [rsp+58h], NULL xor rcx, rcx lea rdx, [but_class] lea r8, [btn2_text] mov r9d, WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON call CreateWindowExA xor eax, eax jmp .return .wm_command: mov eax, r8d and eax, 0FFFFh cmp eax, ID_BUTTON1 je .btn1 cmp eax, ID_BUTTON2 je .btn2 jmp .default .btn1: xor rcx, rcx ; hWnd = NULL lea rdx, [msg1] ; lpText lea r8, [msg_title] ; lpCaption mov r9d, MB_OK ; uType call MessageBoxA xor eax, eax jmp .return .btn2: xor rcx, rcx lea rdx, [msg2] lea r8, [msg_title] mov r9d, MB_OK call MessageBoxA xor eax, eax jmp .return .wm_destroy: xor rcx, rcx call PostQuitMessage xor eax, eax .return: add rsp, 68h pop rbx pop rbp ret
Пруфы а студию. Ложь, клевета и провокация. Я его лично на своём компьютере компилировал и запускал. Так что не получится у вас принизить мои способности в NASM x64.
Разработчики Visual Studio вероятно не в курсе ваших умозаключений. Нужно им об этом обязательно сообщить. Если вы окажитесь правы - вас непременно ждёт немалое денежное вознаграждение. Так что поторопитесь, пока я вас не опередил.
В смысле с кодом что-то не так? Или вы намекаете на, то какой я молодец, что исправил все ошибки Дипсика?
Research, вот шутки шутками, но мне интересна оценка этого кода. Вдруг правда у меня там какие-нибудь недочеты и просчеты, но я вроде все проверил и в том числе под отладчиком. А господину Ахимову я не доверяю - у него на всё ПРЕДВЗЯТОЕ МНЕНИЕ И ВЗГЛЯД на почти любые вещи, ну кроме тех, которые он сам программировал на MASM 32 под Windows XP. P.S. А вообще, код для NASM x64 делался с учебными целями, поэтому хотелось бы знать про недостатки и недочеты. Вдруг я правда где-то "накосячил".
GRAFik, Ты поудалял оберку апи, сделав приложение зависящим от фазы луны. Вызвать анстаб это вся проделанная работа, кури матчасть!
Я помню в коде для FASM64 Микл делал в своём коде, то же самое - убирал принудительно - последствия макроса. И пояснял это тем, что от этого будет только лучше. В том числе и для производительности кода, т.к. уменьшается кол-во выполняемых инструкций. Вы и его можете покритиковать. Нужно будет поискать тот код на Сайбер (или Кибер) форуме, когда он был там модератором.
GRAFik, Никак на профиль гуя эти инструкции не влияют, обнаружить их наличие по таймингу физически невозможно, в общем конечно, только если кусок вырезать и профильнуть. Это не мсдос
Ahimov, вы только поймите меня правильно. Я не хочу тут умничать и возвышать себя из-за кода для NASM x64. Ничего там сверхсложного нет. Ну возьмите исправьте, скомпилируйте и ткните носом - я буду только рад - если это будет правильно и объективно. В противном случае - это пустопорожний трёп.
Специально попросил одного специалиста, который хорошо знает NASM x64 проконсультировать по поводу замечаний Ахимова. Вот что он ответил, после проверки моего кода: Вы можете смело ответить ему следующее: "Спасибо за замечание про Shadow Space, правило действительно строгое! Однако в данном коде стек не портится, потому что Shadow Space выделяется не перед каждым call, а один раз в прологе функции. В WinMain инструкция sub rsp, 60h резервирует 96 байт. Нижние 32 байта по адресам от [rsp] до [rsp+1Fh] как раз и выступают в роли постоянного Shadow Space для ВСЕХ вызовов внутри функции, а область выше [rsp+20h] используется для передачи аргументов через стек (например, для CreateWindowExA). Это стандартная оптимизация, которую делает компилятор MSVC, она исключает лишние операции add/sub rsp и сохраняет строгое выравнивание стека по 16 байтам." Так что не переживайте, код надежен, как швейцарские часы, дисциплина x64 соблюдена на 100%, и никакого риска порчи стека там нет.