Быстрый поиск
Введите фрагмент названия статьи для поиска
Магнитное (липкое) окно на Ассемблере
12.05.2009 | Категория: Образ мышления: Assembler | Автор: ManHunter
Еще один интересный трюк при работе с окнами - так называемые "липкие" или "магнитные" окна, которые прилипают к границам экрана при перемещении. Это реализуется достаточно просто, но выглядит очень эффектно. Для перехвата перемещения окна надо обрабатывать сообщение WM_MOVING. В параметре lParam передается адрес структуры RECT, которая содержит значения конечных координат окна после отпускания курсора мыши. Чтобы при изменении координат окна не возникало неприятного эффекта моргания, их надо менять сразу же в передаваемой структуре. Обработчик WM_MOVING выглядит следующим образом:Code (Assembler) : Убрать нумерацию
- ; Обработчик сообщения WM_MOVING
- MAX_GRID = 20 ; Размер магнитной сетки
- ; Получить размер рабочей области экрана
- invoke SystemParametersInfo,SPI_GETWORKAREA,NULL,coord,FALSE
- ; В регистре EDI указатель на структуру координат окна
- mov edi,[lparam]
- ; Проверить положение левой границы окна
- mov edx,[edi+RECT.left]
- sub edx,[coord.left]
- mov eax,edx
- jns @f
- neg edx
- @@:
- cmp edx,MAX_GRID
- ja @f
- sub [edi+RECT.right],eax
- sub [edi+RECT.left],eax
- @@:
- ; Проверить положение правой границы окна
- mov edx,[edi+RECT.right]
- sub edx,[coord.right]
- mov eax,edx
- jns @f
- neg edx
- @@:
- cmp edx,MAX_GRID
- ja @f
- sub [edi+RECT.right],eax
- sub [edi+RECT.left],eax
- @@:
- ; Проверить положение верхней границы окна
- mov edx,[edi+RECT.top]
- sub edx,[coord.top]
- mov eax,edx
- jns @f
- neg edx
- @@:
- cmp edx,MAX_GRID
- ja @f
- sub [edi+RECT.top],eax
- sub [edi+RECT.bottom],eax
- @@:
- ; Проверить положение нижней границы окна
- mov edx,[edi+RECT.bottom]
- sub edx,[coord.bottom]
- mov eax,edx
- jns @f
- neg edx
- @@:
- cmp edx,MAX_GRID
- ja @f
- sub [edi+RECT.top],eax
- sub [edi+RECT.bottom],eax
- @@:
- mov eax,TRUE
- jmp finish
Читать статью целиком »
Просмотров: 5344 | Комментариев: 11
Расчет CRC32 на Ассемблере
27.04.2009 | Категория: Образ мышления: Assembler | Автор: ManHunter
Алгоритм вычисления контрольной суммы (CRC, англ. cyclic redundancy code, циклический избыточный код) - способ цифровой идентификации некоторой последовательности данных, который заключается в вычислении контрольного значения ее циклического избыточного кода. Алгоритм CRC32 основан на примитивном полиноме 0EDB88320h и применяется в архиваторах, системах шифрования, протекторах исполняемых файлов и многих других программах. Он прост в реализации и с большой вероятностью может подтверждать неизменность данных, причем чем меньше размер контролируемой информации, тем выше эта вероятность. Для расчета CRC32 требуется сперва подготовить так называемую таблицу инициализации. В сегменте данных таблица резервируется как 256 двойных слов, по одному dword на каждый возможный байт:Code (Assembler) : Убрать нумерацию
- ; Сегмент данных
- section '.data' data readable writeable
- ; Таблица инициализации для расчета CRC32
- crc32table rd 256
Code (Assembler) : Убрать нумерацию
- ;-----------------------------------------------------------------------
- ; Функция создания таблицы инициализации для расчета CRC32
- ;-----------------------------------------------------------------------
- proc init_CRC32
- push eax ebx ecx edi
- mov edi,crc32table ; Указатель на выделенную под таблицу память
- xor ebx,ebx ; Расчитать значения для всех 256 байт
- calc_crc32table:
- mov eax,ebx
- mov ecx,8
- do_polynom:
- shr eax,1 ; Проверить четность байта
- jnc @f ; XOR выполняется только если байт нечетный
- xor eax,0EDB88320h
- @@:
- loop do_polynom ; Следующий бит
- stosd ; Записать полученный dword в таблицу
- inc ebx
- cmp ebx,256
- jb calc_crc32table ; Следующий байт
- pop edi ecx ebx eax
- ret
- endp
Читать статью целиком »
Просмотров: 13265 | Комментариев: 9
Перехват ввода и вывода консольных программ
13.04.2009 | Категория: Образ мышления: Assembler | Автор: ManHunter
Перехват ввода и вывода консольных программ бывает нужен, когда требуется получить результат их работы для обработки в нашем приложении. Также мы получаем возможность передавать консольным программам собственные данные. Как обычно в FASM'е готовых решений нет, пришлось разбираться самому и портировать с языков высокого уровня. Технически перехват ввода и вывода консоли выполняется с использованием специальных структур, называемых "Pipe". По принципу действия они и вправду похожи на трубы: в один конец информация "вливается", из другого "выливается", а перехват является просто подключением нашего "крана" к тому или иному концу трубы. Для перехвата требуется переопределить стандартные дескрипторы ввода и вывода консольного приложения на наши. Создать новые дескрипторы можно при помощи функции CreatePipe, а затем прописать в структуру STARTUPINFO запускаемого приложения. После этого новые дескрипторы будут доступны для чтения и записи как обычный файл.В сегменте данных родительского приложения требуется определить следующие переменные и структуры:
Code (Assembler) : Убрать нумерацию
- ; Сегмент данных
- section '.data' data readable writeable
- ; Данные для перехвата консоли
- newstdin dd ? ; Новый дескриптор стандартного ввода
- newstdout dd ? ; Новый дескриптор стандартного вывода
- read_stdout dd ? ; Дескриптор для использования ReadFile
- write_stdin dd ? ; Дескриптор для использования WriteFile
- bytestoread dd ? ; Всего байт в буфере консоли
- available dd ? ; Счетчик байт, доступных для чтения из консоли
- ; Эта структура по умолчанию не определена, сделаем это сами
- struct SECURITY_ATTRIBUTES
- nLength dd ?
- lpSecurityDescriptor dd ?
- bInheritHandle dd ?
- ends
- ; Описание структур для запуска консольной программы и настройки дескрипторов
- sinfo STARTUPINFO
- sattr SECURITY_ATTRIBUTES
- pinfo PROCESS_INFORMATION
- ; Дополнительно зарезервируем буфер для чтения информации
- buff rb 1024
Читать статью целиком »
Просмотров: 10756 | Комментариев: 11
Воспроизведение музыки в программах на Ассемблере
24.03.2009 | Категория: Образ мышления: Assembler | Автор: ManHunter
Использование музыки в ваших программах несомненно добавит им привлекательности. Особенно если речь идет о компьютерных играх или кейгенах :) Для различных форматов музыки используются различные библиотеки, в том числе и самописные. Самописные, как правило, приватные и доступны только ограниченному кругу лиц, а качественных и удобных из числа публичных всего две - BASS и uFMOD.Для качественной музыки используется внешняя библиотека BASS, последняя версия 2.4.2. Это кроссплатформенная библиотека для воспроизведения потоковой музыки (MP3, MP2, MP1, OGG, WAV, AIFF), трекерной (XM, IT, S3M, MOD, MTM, UMX), Internet-вещания (HTTP, FTP), а также некоторых других форматов через внешние модули расширения. При всем богатстве функционала библиотека занимает всего около 100 килобайт на диске. Библиотека обычно используется в аудиоплеерах и компьютерных играх. Скачать последнюю версию можно с офсайта, в архиве имеется подробнейшая документация по всем API библиотеки. Дополнительные модули расширения можно скачать оттуда же с офсайта. Для нас особый интерес представляет пример использования API библиотеки BASS на Flat Assembler'е, скачать его можно также с офсайта. Это плеер с минимальными функциями, но в архиве содержатся необходимые inc-файлы, которые надо будет поместить в соответствующие папки FASM для использования в других проектах. Минусы использования библиотеки BASS в том, что в любом случае приходится таскать за собой 100-килобайтный файл bass.dll. Для больших проектов это погоды не сделает, а для небольших может оказаться критичным. Конечно, можно хранить файл bass.dll внутри исполняемого файла и записывать в системную директорию по мере надобности (именно так и поступает патчер dUP2), но многие антивирусы расценят подобную активность как подозрительную. Со всеми вытекающими. Также к недостаткам можно отнести закрытый код библиотеки и навешанный на нее протектор.
Читать статью целиком »
Просмотров: 13533 | Комментариев: 7
Разбор параметров командной строки
03.03.2009 | Категория: Образ мышления: Assembler | Автор: ManHunter
Наконец-то добрался до полезной практической задачи по корректному разбору параметров командной строки. На языках высокого уровня это делается чуть ли не одной командой, а на Ассемблере как обычно приходится все делать самостоятельно. Решение получилось универсальным, подходит как для консольных, так и для GUI-приложений. Для использования функции ParseCmdLine в сегменте данных надо предварительно определить следующую структуру:Code (Assembler) : Убрать нумерацию
- ; Структура для командной строки
- struct CMDLINE
- nCount dd ? ; Количество аргументов
- lpArgs dd ? ; Указатель на массив адресов строк
- lpArgStr dd ? ; Указатель на массив строк
- ends
Читать статью целиком »
Просмотров: 11853 | Комментариев: 16