
Образ мышления: Assembler
То, что не удается запрограммировать на Ассемблере, приходится паять
Образ мышления: Assembler - RSS-канал
Образ мышления: Assembler - Карта сайта

Перехват ввода и вывода консольных программ
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
Читать статью целиком »
Просмотров: 10283 | Комментариев: 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), но многие антивирусы расценят подобную активность как подозрительную. Со всеми вытекающими. Также к недостаткам можно отнести закрытый код библиотеки и навешанный на нее протектор.
Читать статью целиком »
Просмотров: 12407 | Комментариев: 7

Разбор параметров командной строки
03.03.2009 | Категория: Образ мышления: Assembler | Автор: ManHunter
Наконец-то добрался до полезной практической задачи по корректному разбору параметров командной строки. На языках высокого уровня это делается чуть ли не одной командой, а на Ассемблере как обычно приходится все делать самостоятельно. Решение получилось универсальным, подходит как для консольных, так и для GUI-приложений. Для использования функции ParseCmdLine в сегменте данных надо предварительно определить следующую структуру:Code (Assembler) : Убрать нумерацию
- ; Структура для командной строки
- struct CMDLINE
- nCount dd ? ; Количество аргументов
- lpArgs dd ? ; Указатель на массив адресов строк
- lpArgStr dd ? ; Указатель на массив строк
- ends
Читать статью целиком »
Просмотров: 11320 | Комментариев: 15

Использование иконок разных размеров в ресурсах
12.02.2009 | Категория: Образ мышления: Assembler | Автор: ManHunter
Большим плюсом Flat Assembler является то, что при разработке создается минимальное количество файлов. Описания ресурсов хранятся прямо в исходнике ASM, что тоже очень удобно. Например, в официальной документации и исходниках описание главной иконки в ресурсах исполняемого файла выглядит примерно так:Code (Assembler) : Убрать нумерацию
- section '.rsrc' resource data readable
- directory RT_ICON, icons,\
- RT_GROUP_ICON, group_icons
- resource icons,\
- 1, LANG_NEUTRAL, icon_data
- resource group_icons,\
- 1, LANG_NEUTRAL, main_icon
- ; Описание одиночной иконки
- icon main_icon, icon_data, 'main_icon.ico'
Code (Assembler) : Убрать нумерацию
- section '.rsrc' resource data readable
- directory RT_ICON, icons,\
- RT_GROUP_ICON, group_icons
- resource icons,\
- 1, LANG_NEUTRAL, icon_data1,\
- 2, LANG_NEUTRAL, icon_data2,\
- 3, LANG_NEUTRAL, icon_data3
- resource group_icons,\
- 1, LANG_NEUTRAL, main_icon
- ; Описание иконок разных размеров, объединенных в одну
- icon main_icon,\
- icon_data1, 'icon_16x16_32bit.ico',\
- icon_data2, 'icon_32x32_32bit.ico',\
- icon_data3, 'icon_48x48_32bit.ico'
Читать статью целиком »
Просмотров: 7350 | Комментариев: 5

Программное выключение монитора
08.02.2009 | Категория: Образ мышления: Assembler | Автор: ManHunter
Выключить монитор из программы можно, но только если он совместим со стандартом EnergyStar. Об этом можно не беспокоиться, все современные мониторы удовлетворяют этому условию. Беспокоиться надо о другом. По непонятной причине с сайта на сайт упорно копируют один и тот же код на разных языках программирования, который якобы должен выключить монитор. Вот его вариант на Ассемблере:Code (Assembler) : Убрать нумерацию
- ; ВНИМАНИЕ! Это НЕПРАВИЛЬНЫЙ код!!!
- invoke GetDesktopWindow
- invoke SendMessage, eax, WM_SYSCOMMAND, SC_MONITORPOWER, 0
Но хватит о грустном. Правильный код программного выключения монитора будет таким:
Code (Assembler) : Убрать нумерацию
- ;-------------------------------------------------
- ; Правильный код выключения монитора
- ;-------------------------------------------------
- ; В FASM не определена константа HWND_BROADCAST, сделаем это самостоятельно
- HWND_BROADCAST = 0FFFFh
- ; Выключить монитор
- invoke SendMessage, HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 2
Читать статью целиком »
Просмотров: 13944 | Комментариев: 20
