Blog. Just Blog

Быстрый поиск

Введите фрагмент названия статьи для поиска

Распаковка данных в формате MegaLZ на Ассемблере

04.09.2021 | Категория: Образ мышления: Assembler | Автор: ManHunter

Распаковка данных в формате MegaLZ на Ассемблере

Алгоритм MegaLZ был разработан участниками демо-группы MAYhEM для AmigaOS, но из открытых исходников можно собрать упаковщик для Windows. Степень компрессии неплохая, особенно на текстовых данных, на бинарных файлах чуть похуже. И при этом MegaLZ работает очень быстро как на упаковку, так и на распаковку, что тоже является его несомненным плюсом.

Читать статью целиком »
Просмотров: 890 | Комментариев: 0

Обработка критических ошибок с помощью VEH

23.08.2021 | Категория: Образ мышления: Assembler | Автор: ManHunter

Обработка критических ошибок с помощью VEH

Продолжение темы, начатой в статье про обработку ошибок, где для этого используется механизм SEH. Принципиальное отличие VEH (Vectored Exception Handling) от SEH (Structured Exception Handling) в том, что обработчики VEH глобальны для процесса и позволяют обрабатывать абсолютно все исключения для всех потоков, тогда как при использовании SEH нужно писать отдельный обработчик на каждый поток.

Читать статью целиком »
Просмотров: 1094 | Комментариев: 3

Генератор xoshiro64 на Ассемблере

19.08.2021 | Категория: Образ мышления: Assembler | Автор: ManHunter
В качестве продолжения статьи про xoshiro128 реализация алгоритма xoshiro64 на Ассемблере. Напомню, что xoshiro (xoroshiro) - семейство высокоскоростных алгоритмов для генерации псевдослучайных чисел. Есть две разновидности xoshiro64, отличающиеся друг от друга только количеством операций умножения. Это, соответственно, версия xoshiro64* и xoshiro64**. Для работы генератор использует буфер размером в 2 DWORD'а.

В оригинальном алгоритме отсутствует функция инициализации, там достаточно просто записать какие-то начальные ненулевые значения в рабочий буфер. Если вам надо инициализировать и "прогреть" генератор, то я сделал для этого функцию по аналогии с xoshiro128. Но это уже моя самодеятельность, в авторском алгоритме ничего такого нет.
  1. ;---------------------------------------------
  2. ; Инициализация генератора случайных чисел
  3. ; stdcall long_jump,seed
  4. ;---------------------------------------------
  5. proc long_jump seed:DWORD
  6.         locals
  7.              s0 dd ?
  8.              s1 dd ?
  9.         endl
  10.  
  11.         pusha
  12.  
  13.         ; Начальное "засеивание" генератора
  14.         mov     edi,s
  15.         mov     eax,[seed]
  16.         rol     eax,1
  17.         xor     eax,0x1C580662
  18.         stosd
  19.         rol     eax,3
  20.         add     eax,0x0B6F099F
  21.         stosd
  22.  
  23.         ; Холостая прокрутка генератора для инициализации
  24.         lea     edi,[s0]
  25.         push    edi
  26.         xor     eax,eax
  27.         stosd
  28.         stosd
  29.  
  30.         xor     ebx,ebx
  31. .loc_for_1:
  32.         xor     ecx,ecx
  33. .loc_for_2:
  34.         mov     eax,[.lj+ebx*4]
  35.         and     eax,1
  36.         shl     eax,cl
  37.         jz      @f
  38.  
  39.         mov     esi,s
  40.         lodsd
  41.         xor     [s0],eax
  42.         lodsd
  43.         xor     [s1],eax
  44. @@:
  45.         stdcall next
  46.  
  47.         inc     ecx
  48.         cmp     ecx,32
  49.         jb      .loc_for_2
  50.  
  51.         inc     ebx
  52.         jnp     .loc_for_1
  53.  
  54.         pop     esi
  55.         mov     edi,s
  56.         movsd
  57.         movsd
  58.  
  59.         popa
  60.         ret
  61.  
  62. .lj:    dd 0xB523952E
  63.         dd 0x0B6F099F
  64. endp
Инициализация выполняет первичное "засеивание" рабочего буфера, а затем делает 264 холостых прогонов генератора с одновременным перемешиванием данных рабочего буфера.

Читать статью целиком »
Просмотров: 912 | Комментариев: 4

Графический курсор (каретка) в поле EDIT

09.08.2021 | Категория: Образ мышления: Assembler | Автор: ManHunter
Сегодня отдохнем от системы и немного поработаем с графикой, будем делать собственный графический курсор в поле EDIT. Какого-то необычайно полезного практического применения этому нет, просто симпатичное дополнение к интерфейсу, например, к окнам нестандартной формы. Ну а что, раз уж наворотили чудо-окна, почему бы не наворотить и чудо-курсор.

Начнем с теории. В отличие от "мышиного" курсора, который может легко принимать любой вид, управлять кареткой, то есть курсором в текстовом поле, не так просто. Функция CreateCaret позволяет только описывать форму для каретки, но не меняет ее изображение. Достаточно один раз попробовать, чтобы убедиться в ее бесполезности. Придется самостоятельно рисовать графическую каретку на холсте поля ввода.
  1.         ; Загрузить из ресурсов картинку
  2.         invoke  GetModuleHandle,0
  3.         invoke  LoadBitmap,eax,1
  4.         mov     [hСaret],eax
  5.  
  6.         ; Выбрать картинку для холста поля ввода
  7.         invoke  GetDlgItem,[hwnddlg],ID_EDIT
  8.         invoke  GetDC,eax
  9.         mov     [hDC],eax
  10.         invoke  CreateCompatibleDC,[hDC]
  11.         mov     [hСaretDC],eax
  12.         invoke  SelectObject,[hСaretDC],[hСaret]
  13.  
  14.         ; Получить цвет угловой точки картинки
  15.         invoke  GetPixel,[hСaretDC],0,0
  16.         mov     [bColor],eax
  17.         ; Создать кисть с этим цветом
  18.         invoke  CreateSolidBrush,[bColor]
  19.         mov     [hBrush],eax
  20.  
  21.         ; Прибраться за собой
  22.         invoke  DeleteObject,[hСaret]
Для простоты реализации рисунок текстового курсора будет храниться в ресурсах. Загружаем его стандартными функциями, затем получаем холст поля ввода и добавляем к нему загруженный рисунок. Теоретически рисунок каретки может быть любого размера, но практически он должен хотя бы по вертикали соответствовать высоте поля ввода, а лучше высоте шрифта.

Читать статью целиком »
Просмотров: 1681 | Комментариев: 7

Работа с кнопкой Help в заголовке окна

28.07.2021 | Категория: Образ мышления: Assembler | Автор: ManHunter
В самом начале развития Windows во многих приложениях очень часто встречалась кнопка "Help" в заголовке окна. Кликнув на нее и переместив курсор на нужный элемент, пользователь мог получить подсказку, например, какие данные надо вводить в конкретное текстовое поле или что получится, если нажать какую-нибудь кнопку. Сейчас UIX-дизайнеры прокачали свои навыки, кнопка справки стала уже не так популярна, по крайней мере я не встречал ее ни в одном современном приложении. Но может быть кому-нибудь будет интересно, как ей пользоваться и как правильно обрабатывать ее сообщения. Начнем с интерфейса. Чтобы в заголовке окна появилась кнопка справки, оно должно быть изначально создано с расширенным стилем WS_EX_CONTEXTHELP. Для динамического управления кнопкой справки можно воспользоваться способом, описанным в этой статье.

Из программной части нам понадобится одна структура, которую почему-то не знает коробочный FASM. Хотя, блин, чему я удивляюсь...
  1. struct HELPINFO
  2.         cbSize       dd ?
  3.         iContextType dd ?
  4.         iCtrlId      dd ?
  5.         hItemHandle  dd ?
  6.         dwContextId  dd ?
  7.         MousePos     POINT
  8. ends
Суть контекстной справки заключается в том, чтобы при выборе пользователем какого-либо элемента диалогового окна, ему была предоставлена информация именно по этому элементу. Для персонализации справки можно назначить конкретному элементу окна контекстный идентификатор справки при помощи функции SetWindowContextHelpId. Это один из вариантов, с помощью которого в дальнейшем можно будет персонализировать справку.
  1. .wminitdialog:
  2.         ; Назначить контекстный идентификатор справки элементу окна
  3.         invoke  GetDlgItem,[hwnddlg],ID_BUTTON_1
  4.         invoke  SetWindowContextHelpId,eax,777
При нажатии кнопки справки в заголовке окна и выборе какого-нибудь элемента диалогового окна, родительскому окну отправляется сообщение WM_HELP, которое мы должны обработать.

Читать статью целиком »
Просмотров: 1162 | Комментариев: 4

01 ... 22 23 24 25 26 27 28 ... 75
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2025
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.08 сек. / MySQL: 3 (0.0152 сек.) / Память: 4.5 Mb
Наверх