Быстрый поиск
Введите фрагмент названия статьи для поиска
Распаковка данных в формате 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. Но это уже моя самодеятельность, в авторском алгоритме ничего такого нет.
Code (Assembler) : Убрать нумерацию
- ;---------------------------------------------
- ; Инициализация генератора случайных чисел
- ; stdcall long_jump,seed
- ;---------------------------------------------
- proc long_jump seed:DWORD
- locals
- s0 dd ?
- s1 dd ?
- endl
- pusha
- ; Начальное "засеивание" генератора
- mov edi,s
- mov eax,[seed]
- rol eax,1
- xor eax,0x1C580662
- stosd
- rol eax,3
- add eax,0x0B6F099F
- stosd
- ; Холостая прокрутка генератора для инициализации
- lea edi,[s0]
- push edi
- xor eax,eax
- stosd
- stosd
- xor ebx,ebx
- .loc_for_1:
- xor ecx,ecx
- .loc_for_2:
- mov eax,[.lj+ebx*4]
- and eax,1
- shl eax,cl
- jz @f
- mov esi,s
- lodsd
- xor [s0],eax
- lodsd
- xor [s1],eax
- @@:
- stdcall next
- inc ecx
- cmp ecx,32
- jb .loc_for_2
- inc ebx
- jnp .loc_for_1
- pop esi
- mov edi,s
- movsd
- movsd
- popa
- ret
- .lj: dd 0xB523952E
- dd 0x0B6F099F
- endp
Читать статью целиком »
Просмотров: 912 | Комментариев: 4
Графический курсор (каретка) в поле EDIT
09.08.2021 | Категория: Образ мышления: Assembler | Автор: ManHunter
Сегодня отдохнем от системы и немного поработаем с графикой, будем делать собственный графический курсор в поле EDIT. Какого-то необычайно полезного практического применения этому нет, просто симпатичное дополнение к интерфейсу, например, к окнам нестандартной формы. Ну а что, раз уж наворотили чудо-окна, почему бы не наворотить и чудо-курсор.Начнем с теории. В отличие от "мышиного" курсора, который может легко принимать любой вид, управлять кареткой, то есть курсором в текстовом поле, не так просто. Функция CreateCaret позволяет только описывать форму для каретки, но не меняет ее изображение. Достаточно один раз попробовать, чтобы убедиться в ее бесполезности. Придется самостоятельно рисовать графическую каретку на холсте поля ввода.
Code (Assembler) : Убрать нумерацию
- ; Загрузить из ресурсов картинку
- invoke GetModuleHandle,0
- invoke LoadBitmap,eax,1
- mov [hСaret],eax
- ; Выбрать картинку для холста поля ввода
- invoke GetDlgItem,[hwnddlg],ID_EDIT
- invoke GetDC,eax
- mov [hDC],eax
- invoke CreateCompatibleDC,[hDC]
- mov [hСaretDC],eax
- invoke SelectObject,[hСaretDC],[hСaret]
- ; Получить цвет угловой точки картинки
- invoke GetPixel,[hСaretDC],0,0
- mov [bColor],eax
- ; Создать кисть с этим цветом
- invoke CreateSolidBrush,[bColor]
- mov [hBrush],eax
- ; Прибраться за собой
- invoke DeleteObject,[hСaret]
Читать статью целиком »
Просмотров: 1681 | Комментариев: 7
Работа с кнопкой Help в заголовке окна
28.07.2021 | Категория: Образ мышления: Assembler | Автор: ManHunter
В самом начале развития Windows во многих приложениях очень часто встречалась кнопка "Help" в заголовке окна. Кликнув на нее и переместив курсор на нужный элемент, пользователь мог получить подсказку, например, какие данные надо вводить в конкретное текстовое поле или что получится, если нажать какую-нибудь кнопку. Сейчас UIX-дизайнеры прокачали свои навыки, кнопка справки стала уже не так популярна, по крайней мере я не встречал ее ни в одном современном приложении. Но может быть кому-нибудь будет интересно, как ей пользоваться и как правильно обрабатывать ее сообщения. Начнем с интерфейса. Чтобы в заголовке окна появилась кнопка справки, оно должно быть изначально создано с расширенным стилем WS_EX_CONTEXTHELP. Для динамического управления кнопкой справки можно воспользоваться способом, описанным в этой статье.Из программной части нам понадобится одна структура, которую почему-то не знает коробочный FASM. Хотя, блин, чему я удивляюсь...
Code (Assembler) : Убрать нумерацию
- struct HELPINFO
- cbSize dd ?
- iContextType dd ?
- iCtrlId dd ?
- hItemHandle dd ?
- dwContextId dd ?
- MousePos POINT
- ends
Code (Assembler) : Убрать нумерацию
- .wminitdialog:
- ; Назначить контекстный идентификатор справки элементу окна
- invoke GetDlgItem,[hwnddlg],ID_BUTTON_1
- invoke SetWindowContextHelpId,eax,777
Читать статью целиком »
Просмотров: 1162 | Комментариев: 4