Сообщение из темы "Экстраполяция."

Тема в разделе "WASM.X64", создана пользователем GRAFik, 26 апр 2026 в 12:17.

  1. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    434
    Ahimov, у меня к вам просьба. Вы можете Депсику дать задание (промт) ? У меня он тупо всё сбрасывает ( видимо, с перепуга -когда видит слово АССЕМБЛЕР ). Может вам что-нибудь ответит. Просто интересно, какой будет ответ и сколько там будет ошибок. Если Депсик что-то ответит, я потом могу проверить у себя его ответ. А вдруг он будет правильным. Чудеса ведь иногда случаются. :)

    ПРОМТ для ДЕПСИКа:
    Операционная система Windows 10 Pro x64.

    Вы можете сгенерировать код для ассемблера NASM x64 ( ABI x64 ) простого окна с двумя кнопками, при нажатии на которые - вызывается функция MessageBoxA ?
     
    Ahimov нравится это.
  2. Research

    Research Active Member

    Публикаций:
    1
    Регистрация:
    6 янв 2024
    Сообщения:
    476
    Зачем создавать на форуме по низк. ур. програмированию хаос из бредовых теорий?

    Подлый и убогий ТТР ничем не доказан. Теория разбитых окон.
     
  3. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    614
    GRAFik,

    вот.

    Ему нужны структуры, без них пытается вычислять, а так нельзя делать, он ошибется или придумает, короче ввод неопределенности :meeting:

    Затем необходимо загрузить сохраненный чат - он полностью не удерживает его в памяти, для проверки.

    ps. В данном случае насм, яп вообще не нужен - он может собрать в дамп, не придерживаясь формата. Тоесть: задача -> спецификация -> хексдамп.
     

    Вложения:

    • _winproc.pdf
      Размер файла:
      1,3 МБ
      Просмотров:
      14
  4. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    434
    Ahimov, в общем, дела с генерацией кода для NASM x64 (ABI x64) обстоят так:

    Если ты точно знаешь - какой дожен быть код, тогда путем небольших корректировок кода для NASM x64 - процесс получения нужного кода с нужной последовательностью инструкций для NASM - немного ускоряется.

    Если ты понятия не имеешь как должен работать код и не знаешь точной последовательности инструкций для ассемблера NASM x64 - можно просидеть над компиляцией и исправлениями много времени и не добиться получения правильно работающего кода.

    Код который сгенерировал Дипсик - почти рабочий. Я его позже чуть подправлю\проверю и выложу в своём посте.
     
  5. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    614
    GRAFik,

    > знаешь точной последовательности инструкций для ассемблера NASM

    Не знаю синтаксис насм. В каком конкретно месте "почти" ?
     
  6. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    434
    Я код подправлю и выложу. Ну и будет ясно и понятно в каких местах у Дипсика "косяки".
    --- Сообщение объединено, 26 апр 2026 в 17:54 ---
    Извиняюсь за задержку.
    Немного запутался с NASM x64, пришлось с отладчиком немного повозится. :)
    Да, класный код сгенерировал Дипсик - у меня аж голова от этой генерации разболелась. :)

    Код (ASM):
    1. ;==============================================================================
    2. ; app.asm (Финальная и рабочая x64 версия)
    3. ; 64-bit Windows GUI application.
    4. ;
    5. ; Assemble: nasm -f win64 app.asm -o app.obj
    6. ; Link:     link /subsystem:windows /entry:WinMain app.obj user32.lib kernel32.lib /out:app.exe
    7. ;==============================================================================
    8.  
    9. default rel  
    10.  
    11. global WinMain
    12.  
    13.     extern GetModuleHandleA
    14.     extern ShowWindow
    15.     extern UpdateWindow
    16.     extern GetMessageA
    17.     extern TranslateMessage
    18.     extern DispatchMessageA
    19.     extern DefWindowProcA
    20.     extern PostQuitMessage
    21.     extern RegisterClassExA
    22.     extern CreateWindowExA
    23.     extern MessageBoxA
    24.  
    25. ;==============================================================================
    26. ; Constants
    27. ;==============================================================================
    28. NULL                    equ 0
    29. CW_USEDEFAULT           equ 80000000h
    30. WS_CHILD                equ 40000000h
    31. WS_VISIBLE              equ 10000000h
    32. BS_PUSHBUTTON           equ 00000000h
    33. WS_OVERLAPPEDWINDOW     equ 00CF0000h
    34. CS_HREDRAW              equ 0002h
    35. CS_VREDRAW              equ 0001h
    36. WM_CREATE               equ 0001h
    37. WM_COMMAND              equ 0111h
    38. WM_DESTROY              equ 0002h
    39. ID_BUTTON1              equ 1001
    40. ID_BUTTON2              equ 1002
    41. MB_OK                   equ 0
    42. SW_SHOW                 equ 5   ; Константа для принудительного показа окна [ Позже разберёмся :) ]
    43. COLOR_WINDOW            equ 5   ; Цвет фона окна
    44.  
    45. ;==============================================================================
    46. ; Structures (align 8 for x64)
    47. ;==============================================================================
    48. struc WNDCLASSEX
    49.     .cbSize             resd 1      ; 0
    50.     .style              resd 1      ; 4 (padding 0)
    51.     .lpfnWndProc        resq 1      ; 8
    52.     .cbClsExtra         resd 1      ; 16
    53.     .cbWndExtra         resd 1      ; 20
    54.     .hInstance          resq 1      ; 24
    55.     .hIcon              resq 1      ; 32
    56.     .hCursor            resq 1      ; 40
    57.     .hbrBackground      resq 1      ; 48
    58.     .lpszMenuName       resq 1      ; 56
    59.     .lpszClassName      resq 1      ; 64
    60.     .hIconSm            resq 1      ; 72
    61. endstruc               ; size = 80
    62.  
    63. struc MSG
    64.     .hwnd               resq 1      ; 0
    65.     .message            resd 1      ; 8
    66.                         resd 1      ; 12 (padding)
    67.     .wParam             resq 1      ; 16
    68.     .lParam             resq 1      ; 24
    69.     .time               resd 1      ; 32
    70.                         resd 1      ; 36 (padding)
    71.     .pt_x               resd 1      ; 40
    72.     .pt_y               resd 1      ; 44
    73. endstruc               ; size = 48
    74.  
    75. ;==============================================================================
    76. ; Data section
    77. ;==============================================================================
    78. section .data
    79.     class_name  db "MyWindowClass",0
    80.     but_class   db "BUTTON",0
    81.     win_title   db "Two Buttons App",0
    82.     btn1_text   db "Button1",0
    83.     btn2_text   db "Button2",0
    84.     msg_title   db "Info",0
    85.     msg1        db "You clicked Button1",0
    86.     msg2        db "You clicked Button2",0
    87.  
    88. ;==============================================================================
    89. ; BSS section
    90. ;==============================================================================
    91. section .bss
    92.     wc:         resb WNDCLASSEX_size
    93.     msg:        resb MSG_size
    94.     hInstance:  resq 1
    95.     hWnd:       resq 1
    96.  
    97. ;==============================================================================
    98. ; Code section
    99. ;==============================================================================
    100. section .text
    101.  
    102. ;-----------------------------------------------------------------------------
    103. ; WinMain(Без параметров, так как CRT отключен)
    104. ;-----------------------------------------------------------------------------
    105. WinMain:
    106.     push rbp
    107.     mov rbp, rsp
    108.     ; Выделяем 96 байт в стеке (Shadow Space + параметры для CreateWindowExA)
    109.     sub rsp, 60h
    110.  
    111.     ; 1. Получаем настоящий hInstance от ОС
    112.     xor rcx, rcx
    113.     call GetModuleHandleA
    114.     mov [hInstance], rax
    115.  
    116.     ; ----- Register window class -----
    117.     mov dword [wc + WNDCLASSEX.cbSize], WNDCLASSEX_size
    118.     mov dword [wc + WNDCLASSEX.style], CS_HREDRAW | CS_VREDRAW
    119.    
    120.     lea rax, [WndProc]                              ; PIC-адресация функции
    121.     mov qword [wc + WNDCLASSEX.lpfnWndProc], rax
    122.    
    123.     mov dword [wc + WNDCLASSEX.cbClsExtra], 0
    124.     mov dword [wc + WNDCLASSEX.cbWndExtra], 0
    125.    
    126.     mov rax, [hInstance]
    127.     mov qword [wc + WNDCLASSEX.hInstance], rax
    128.    
    129.     mov qword [wc + WNDCLASSEX.hIcon], NULL
    130.     mov qword [wc + WNDCLASSEX.hCursor], NULL
    131.     mov qword [wc + WNDCLASSEX.hbrBackground], COLOR_WINDOW
    132.     mov qword [wc + WNDCLASSEX.lpszMenuName], NULL
    133.    
    134.     lea rax, [class_name]                           ; PIC-адресация строки
    135.     mov qword [wc + WNDCLASSEX.lpszClassName], rax
    136.    
    137.     mov qword [wc + WNDCLASSEX.hIconSm], NULL
    138.  
    139.     lea rcx, [wc]
    140.     call RegisterClassExA
    141.     test eax, eax
    142.     jz .exit_fail
    143.  
    144.     ; ----- Create main window -----
    145.     mov eax, CW_USEDEFAULT                 ; Избегаем ошибки 64-bit sign extension
    146.     mov qword [rsp+20h], rax               ; X
    147.     mov qword [rsp+28h], rax               ; Y
    148.     mov qword [rsp+30h], rax               ; nWidth
    149.     mov qword [rsp+38h], rax               ; nHeight
    150.     mov qword [rsp+40h], NULL              ; hWndParent
    151.     mov qword [rsp+48h], NULL              ; hMenu
    152.     mov rax, [hInstance]
    153.     mov qword [rsp+50h], rax               ; hInstance
    154.     mov qword [rsp+58h], NULL              ; lpParam
    155.  
    156.     xor rcx, rcx
    157.     lea rdx, [class_name]
    158.     lea r8, [win_title]
    159.     mov r9d, WS_OVERLAPPEDWINDOW
    160.     call CreateWindowExA
    161.     test rax, rax
    162.     jz .exit_fail
    163.     mov [hWnd], rax
    164.  
    165.     ; ----- Show window -----
    166.     mov rcx, [hWnd]
    167.     mov edx, SW_SHOW                       ; 2. Жестко говорим системе ПОКАЗАТЬ окно
    168.     call ShowWindow
    169.  
    170.     ; ----- Update window -----
    171.     mov rcx, [hWnd]
    172.     call UpdateWindow
    173.  
    174.     ; ----- Message loop -----
    175. .message_loop:
    176.     lea rcx, [msg]
    177.     xor rdx, rdx
    178.     xor r8, r8
    179.     xor r9, r9
    180.     call GetMessageA
    181.     test eax, eax
    182.     jz .exit_ok
    183.  
    184.     lea rcx, [msg]
    185.     call TranslateMessage
    186.  
    187.     lea rcx, [msg]
    188.     call DispatchMessageA
    189.     jmp .message_loop
    190.  
    191. .exit_ok:
    192.     mov eax, [msg + MSG.wParam]
    193.     jmp .exit
    194.  
    195. .exit_fail:
    196.     xor eax, eax
    197.  
    198. .exit:
    199.     add rsp, 60h
    200.     pop rbp
    201.     ret
    202.  
    203. ;-----------------------------------------------------------------------------
    204. ; WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    205. ;-----------------------------------------------------------------------------
    206. WndProc:
    207.     push rbp
    208.     mov rbp, rsp
    209.     push rbx
    210.     ; Выделяем 104 байта. С учетом push rbp(8) и push rbx(8) это дает 120 байт
    211.     ; + 8 байт адреса возврата = 128 байт. Стек идеально выровнен по 16 байтам!
    212.     sub rsp, 68h
    213.  
    214.     mov rbx, rcx                     ; Сохраняем hWnd
    215.  
    216.     cmp edx, WM_CREATE
    217.     je .wm_create
    218.     cmp edx, WM_COMMAND
    219.     je .wm_command
    220.     cmp edx, WM_DESTROY
    221.     je .wm_destroy
    222.  
    223. .default:
    224.     call DefWindowProcA
    225.     jmp .return
    226.  
    227. .wm_create:
    228.     ; ----- Create Button 1 -----
    229.     mov qword [rsp+20h], 50          ; X
    230.     mov qword [rsp+28h], 50          ; Y
    231.     mov qword [rsp+30h], 100         ; nWidth
    232.     mov qword [rsp+38h], 30          ; nHeight
    233.     mov qword [rsp+40h], rbx         ; hWndParent
    234.     mov qword [rsp+48h], ID_BUTTON1  ; hMenu
    235.     mov rax, [hInstance]
    236.     mov qword [rsp+50h], rax         ; hInstance
    237.     mov qword [rsp+58h], NULL        ; lpParam
    238.  
    239.     xor rcx, rcx
    240.     lea rdx, [but_class]
    241.     lea r8, [btn1_text]
    242.     mov r9d, WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON
    243.     call CreateWindowExA
    244.  
    245.     ; ----- Create Button 2 -----
    246.     mov qword [rsp+20h], 50
    247.     mov qword [rsp+28h], 100
    248.     mov qword [rsp+30h], 100
    249.     mov qword [rsp+38h], 30
    250.     mov qword [rsp+40h], rbx
    251.     mov qword [rsp+48h], ID_BUTTON2
    252.     mov rax, [hInstance]
    253.     mov qword [rsp+50h], rax
    254.     mov qword [rsp+58h], NULL
    255.  
    256.     xor rcx, rcx
    257.     lea rdx, [but_class]
    258.     lea r8, [btn2_text]
    259.     mov r9d, WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON
    260.     call CreateWindowExA
    261.  
    262.     xor eax, eax
    263.     jmp .return
    264.  
    265. .wm_command:
    266.     mov eax, r8d
    267.     and eax, 0FFFFh
    268.     cmp eax, ID_BUTTON1
    269.     je .btn1
    270.     cmp eax, ID_BUTTON2
    271.     je .btn2
    272.     jmp .default
    273.  
    274. .btn1:
    275.     xor rcx, rcx                     ; hWnd = NULL
    276.     lea rdx, [msg1]                  ; lpText
    277.     lea r8, [msg_title]              ; lpCaption
    278.     mov r9d, MB_OK                   ; uType
    279.     call MessageBoxA
    280.     xor eax, eax
    281.     jmp .return
    282.  
    283. .btn2:
    284.     xor rcx, rcx
    285.     lea rdx, [msg2]
    286.     lea r8, [msg_title]
    287.     mov r9d, MB_OK
    288.     call MessageBoxA
    289.     xor eax, eax
    290.     jmp .return
    291.  
    292. .wm_destroy:
    293.     xor rcx, rcx
    294.     call PostQuitMessage
    295.     xor eax, eax
    296.  
    297. .return:
    298.     add rsp, 68h
    299.     pop rbx
    300.     pop rbp
    301.  
    302.     ret
     
  7. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    614
    GRAFik,

    Ты его испортил :sarcastic:
     

    Вложения:

    • badstack.pdf
      Размер файла:
      451,6 КБ
      Просмотров:
      14
  8. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    434
    Пруфы а студию. :)

    Ложь, клевета и провокация.

    Я его лично на своём компьютере компилировал и запускал.

    Так что не получится у вас принизить мои способности в NASM x64. :)
     
  9. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    614
    GRAFik,

     
  10. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    434
    Разработчики Visual Studio вероятно не в курсе ваших умозаключений. Нужно им об этом обязательно сообщить. Если вы окажитесь правы - вас непременно ждёт немалое денежное вознаграждение. Так что поторопитесь, пока я вас не опередил. :)
     
  11. Research

    Research Active Member

    Публикаций:
    1
    Регистрация:
    6 янв 2024
    Сообщения:
    476
    Это признак сильного программиста. Посмотрел на этот код, у меня тоже шишка встала.
     
    Последнее редактирование: 26 апр 2026 в 20:25
  12. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    434
    В смысле с кодом что-то не так?
    Или вы намекаете на, то какой я молодец, что исправил все ошибки Дипсика? :)
     
  13. Research

    Research Active Member

    Публикаций:
    1
    Регистрация:
    6 янв 2024
    Сообщения:
    476
    Я о том что это нормальная реакция опытного программиста на сложный код.
     
    Последнее редактирование: 26 апр 2026 в 20:36
  14. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    434
    Research, вот шутки шутками, но мне интересна оценка этого кода. Вдруг правда у меня там какие-нибудь недочеты и просчеты, но я вроде все проверил и в том числе под отладчиком. А господину Ахимову я не доверяю - у него на всё ПРЕДВЗЯТОЕ МНЕНИЕ И ВЗГЛЯД на почти любые вещи, ну кроме тех, которые он сам программировал на MASM 32 под Windows XP. :)

    P.S. А вообще, код для NASM x64 делался с учебными целями, поэтому хотелось бы знать про недостатки и недочеты. Вдруг я правда где-то "накосячил". :)
     
  15. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    614
    GRAFik,

    Ты поудалял оберку апи, сделав приложение зависящим от фазы луны. Вызвать анстаб это вся проделанная работа, кури матчасть!
     
  16. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    434
    Я помню в коде для FASM64 Микл делал в своём коде, то же самое - убирал принудительно - последствия макроса. И пояснял это тем, что от этого будет только лучше. В том числе и для производительности кода, т.к. уменьшается кол-во выполняемых инструкций. Вы и его можете покритиковать. Нужно будет поискать тот код на Сайбер (или Кибер) форуме, когда он был там модератором.
     
  17. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    614
    GRAFik,

    Никак на профиль гуя эти инструкции не влияют, обнаружить их наличие по таймингу физически невозможно, в общем конечно, только если кусок вырезать и профильнуть. Это не мсдос :preved:
     
  18. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    434
    Ahimov, вы только поймите меня правильно. Я не хочу тут умничать и возвышать себя из-за кода для NASM x64. Ничего там сверхсложного нет. Ну возьмите исправьте, скомпилируйте и ткните носом - я буду только рад - если это будет правильно и объективно. В противном случае - это пустопорожний трёп.
     
  19. Research

    Research Active Member

    Публикаций:
    1
    Регистрация:
    6 янв 2024
    Сообщения:
    476
    +
     
  20. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    434
    Специально попросил одного специалиста, который хорошо знает 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%, и никакого риска порчи стека там нет.