Разработка оконных приложений на FASMе

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

Я купил учебник Юрова, но он мне не сильно помог. Данная книга имела два серьезных недостатка.
1. Ассемблер описывался под MS-DOS. Вопрос программирования под Windows освещался очень плохо. Точнее он не освещался совсем. В книге привели дизассемблерный листинг программы, написанной на C и все. Этого явно было мало.
2. В книге мало полноценных примеров. То есть там приводятся примеры использования команд ассемблера, но полных программ, которые можно скопировать, вставить в ассемблер и получить готовую программу очень мало. Имеющийся там пример у меня так и не заработал (не исключаю, что в этом виноваты мои кривые руки).

Я пробовал разные ассемблеры (MASM, NASM и др.) но безрезультатно. Так продолжалось до тех пор, пока я не наткнулся на FASM. Именно в нем мне удалось собрать свою первую программу на ассемблере.

Но тут выяснилось, что ни одна книга по ассемблеру не описывает синтаксис FASM. Да, к нему есть очень неплохая документация (которую кстати перевели на русский язык) и примеры, но этого недостаточно. Тогда я и приступил к написанию справочника по этому ассемблеру чисто для себя. Хотелось иметь под рукой краткое руководство по объявлению секций, ресурсов, таблицы импорта (экспорта), подпрограмм и других составных частей программы.

По мере работы над ним он перерос из простой шпаргалки в полноценную книгу. И встал вопрос что с ней делать. Я обратился в издательства но везде получил отказ. Оставлять ее только для себя было эгоистично. Вдруг она еще кому пригодится. Ведь вполне вероятно что с теми проблемами, с которыми столкнулся я, сталкиваются и другие. Поэтому я выложил ее на торренты, где она лежит и по сей день. Для удобства читателей выкладываю ее и здесь (тем более, что в последнее время наши власти начали активно бороться с торрентами).

Итак. В данной книге описываются основные вопросы программирования на ассемблере с использованием windows API, а именно: создание оконнных и консольных приложений, создание диалоговых окон; работа с файлами, реестром, динамической памятью; создание динамических библиотек dll и многие другие вопросы.

Каждое описание по возможности дано максимально простым языком, без лишних технических подробностей. А также сопровождено большим количеством примеров.
В качестве ассемблера использовался FASM, поэтому в книге так же приводится описание синтаксиса и основных макрокоманд этого замечательного ассемблера.

Оглавление

Глава 1. Первое знакомство с Flatasmом
Почему ассемблер
Что такое Flatasm
Чем отлаживать
Замечания по работе с Flatasmом
Глава 2. Из чего состоит программа на ассемблере
Спецификаторы выходных файлов
Точка входа
Подключаемые файлы
Секции
Таблица импорта
Скелет программы на ассемблере
Глава 3. Данные
Системы счисления
Биты, байты и слова
Где хранить данные
Регистры процессора
Память
Задание данных в секциях
Директива file
Стек
Команда mov
Более сложные варианты команды mov
Команда обмена
Метки
Указатели
Константы
Глава 4. Целочисленная арифметика
Сложение числе
Знаковые и беззнаковые числа
Вычитание
Перемножение
Деление
Команды увеличения размеров чисел
Глава 5. Команды сдвига и логические команды
Команды сдвига
Логический тип данных
Логические команды
Глава 6. Команды передачи управления
Команда jmp
Регистр флагов и команды условного перехода
Команда cmp
Команды call и ret
Соглашения о вызовах
Команды stdcall и invoke
Глава 7. Реализация конструкции языков высокого уровня
Ветвления
Оператор if()
Оператор if()…else
Оператор switch()…case
Циклы
Команда loop
Оператор for()
Оператор while()
Оператор do…while
Сложные типы данных
Перечисление
Массив
Многомерный массив
Структура
Класс
Процедуры и функции
Общие сведения
Чтение параметров из стека
Пролог и эпилог
Макрокоманда proc
Глава 8. Начинаем программировать
Двойственность функции Windows API
Понятие дескриптора
Функция GetModuleHandle(A/W)
Функция MessageBox(A/W)
Пишем Hello World
Дескриптор окна рабочего стола
Глава 9. Окна и сообщения
Общие сведения
Регистрация класса окна
Создание окна. Стили окна
Цикл обработки сообщений
Оконная процедура
Пример оконного приложения
Функции работы с заголовком окна
Глава 10. Диалоговые окна
Что такое диалоговое окно
Диалоговая процедура
Сообщение WM_COMMAND
Описание шаблона диалогового окна в ресурсах
Создание диалогового окна на основе ресурсов
Создание диалогового окна на основе шаблона в памяти
Немодальные диалоговые окна
Глава 11. Элементы управления
Типы элементов управления
Описание элемента управления в ресурсах
Идентификатор и дескриптор
Функции работы с элементами управления
Статический элемент управления
Кнопка
Поле ввода
Флажок
Рамка группы
Группа переключателей
Список
Комбинированный список
Глава 12. Меню
Описание меню в ресурсах
Ручное создание меню
Присоединение меню к окну
Обработка событий меню
Редактирование меню
Глава 13. Взаимодействие с окнами других приложений
Поиск окон
Функция SetWindowPos
Функция MoveWindow
Функция ShowWindow
Глава 14. Работа с динамической памятью
Функции работы с динамической памятью
Пример программы
Что такое куча
Функции работы с кучей
Пример программы
Глава 15. Работа со строками
Что такое строка на самом деле
Функции работы со строками
Пример программы
Unicode строки
Функции конвертирования
Глава 16. Работа с файлами
Создание и открытие файла
Чтение из файла, запись в файл
Навигация в файле
Операции над файлами
Чтение и изменение атрибутов
Директории
Текущая директория
Окно открытия файла
Окно сохранения файла
Переменные окружения
Глава 17. Реестр
Общие сведения
Открытие и закрытие раздела
Создание и удаление раздела
Чтение и изменение значения ключа
Пример программы
Глава 18. Файлы инициализации
Структура файлов инициализации
Чтение параметров
Запись параметров
Пример программы
Глава 19. Клавиатура и мышь
Мышь
Клавиатура
Глава 20. Разработка динамических библиотек
Таблица экспорта
Статическая и динамическая загрузка
Функция dllmain
Таблица перемещаемых элементов
Пример
Глава 21. Разработка консольных приложений
Объявление консольного приложения
Ручное создание консоли
Заголовок окна консоли
Буфер экрана
Стандартные потоки ввода/вывода
Ввод и вывод на консоль
Пример программы
Глава 22. Обработка ошибок
SEH
Пример программы
Функция SetUnhandledExceptionFilter
VEH
Функции GetLastError и FormatMessage
Глава 23. Ресурсы
Типы ресурсов
Идентификатор языка
Изображение
Иконка
Строка
Ресурсы, загруженные из res файла

 

14 ответы на “Разработка оконных приложений на FASMе”

  1. да, по winapi работка сделана немалая! Хорошо, кое-что встретил пригодилось

  2. Попробуйте опубликовать через Амазон. Можете даже перевести на английский, тогда и продажи будут.

  3. Благодарю за труд. Как раз искал инфу по FASM.
    Удивительно, что есть такие сайты, сразу и не найдешь. Буду пробовать изучать. Жаль, что нет напарников для совместного обучения.

  4. Есть ещё такая книга:
    Ассемблер для Windows. Пирогов В.Ю.
    Когда то я купил бумажную — был очень доволен.
    Жаль, что в те времена мне не попалась и ваша книга!

  5. А будет обзор на FASMG? Новое поколение FASM, разрабатываемый Томасом. С 23го февраля 23го поддерживает и OS X)

  6. Обращаю ваше внимание на то, что в качестве множителя может
    выступать только положительное число, являющееся степенью двойки, то
    есть 2, 4, 8 и так далее.
    А вот команда вида:

    mov eax, dword [ebx+2*ecx+4*edx]

    является ошибочными.

    Так 2 — это 2 в степени 1. По идее, не ошибочная ж

  7. Рассмотрим структуру вида:

    rec: record
    a1: integer; //размер 4 байта
    a2: byte; //размер 1 байт
    a3: integer; //размер 4 байта
    end;

    Тогда обращение к a3 может быть записано в виде:

    mov eax, dword [ebx+5] ;5=4+1

    Тут разве не будет задано смещение в 5*4=20 байт? Может, правильнее byte [ebx+5]?

  8. обращение к первому параметру функции может быть выполнено следующим образом:
    mov eax, dword [esp+4]
    Добавляемые 4 байта нужны для того, чтобы пропустить хранящийся на вершине стека адрес возврата.

    Тут у меня в коде вашем мозг вытек, пока понял, наконец:

    ;Создаем свой SEH фрейм и добавляем его в список обработчиков
    push excepthandler
    push dword [fs:00]
    mov [fs:00], esp
    ;вызываем ошибку деления на ноль
    xor edx, edx
    xor ebx, ebx
    div ebx
    ;Удаляем свой SEH фрейм. Приводим список обработчиков к
    первозданному виду
    mov eax, [esp]
    mov [fs:00], eax
    add esp, 8

    Можно обратиться к последнему элементу стека через [esp] при этом не удаляя сам элемент, а можно через [esp+4], удалив его.
    Пока понял это…)

Добавить комментарий для norseev_bonifatsii Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *