Программирование на языке Assembler
Программирование на языке ассемблера (Assembler) — это создание программ, которые представляют команды процессора в виде, доступном для чтения человеком. Это язык программирования низкого уровня, максимально приближённый к аппаратному обеспечению компьютера.
Программы на ассемблере пишутся в виде набора мнемонических инструкций, каждая из которых соответствует определённой команде процессора. Эти инструкции затем транслируются (ассемблируются) в машинный код — набор двоичных чисел, которые понимает центральный процессор и выполняет соответствующие операции.
Команды чаще всего состоят из двух частей:
Мнемоники — сокращённого слова или предложения, описывающего выполняемую операцию.
Операндов — списка из 0–3 элементов, описывающих то, на что влияет операция. Операнды могут быть ячейками оперативной памяти или регистрами — внутренней памятью процессора.
Метки позволяют присвоить конкретным командам человекочитаемые имена, повышают понятность кода и позволяют ссылаться на эти команды из других частей программы.
Ассемблерные файлы обычно имеют расширение .s или .asm и разделены на три части: data (определяют константы и инициализированные переменные), bss (определяют неинициализированные переменные), text (вводят код).
Точка с запятой (;) — символ комментария: то, что идёт после него, не будет исполняться.
-
Assembler - язык неограниченных возможностей
Говорят, что ассемблер трудно выучить. Любой язык программирования трудно выучить. Легко выучить С или Delphi после Паскаля, потому что они похожи. А попробуйте освоить Lisp, Forth или Prolog, и окажется, что ассемблер в действительности даже проще, чем любой совершенно незнакомый язык программирования.
Говорят, что программы на ассемблере трудно понять. Разумеется, на ассемблере легко написать неудобочитаемую программу... точно так же, как и на любом другом языке! Если вы знаете язык и если автор программы не старался ее запутать, то понять программу будет не сложнее, чем если бы она была написана на Бейсике.
Первый вопрос, который задает себе
Биты, байты и слова
Числа со знаком
Что потребуется для работы с ассемблером
Двоичная система счисления
Коды символов
Логические операции
Организация памяти
Представление данных в компьютерах
Шестнадцатеричная система счисления
Коды символов
Организация памяти
Процессоры Intel в реальном режиме
Адресация по базе с индексированием
Адресация по базе с индексированием и масштабированием
Адресация по базе со сдвигом
Арифметические операции ММХ
Базовая арифметика FPU
Числа с плавающей запятой
Десятичная арифметика
Другие команды
Двоичная арифметика
Исключения FPU
Команды передачи управления
Команды пересылки данных FPU
Команды пересылки данных ММХ
Команды преобразования типов ММХ
Команды сравнения FPU
Команды сравнения ММХ
Команды управления FPU
Команды управления состоянием ММХ
Константы FPU
Косвенная адресация
Косвенная адресация с масштабированием
Логические операции
Логические операции ММХ
Непосредственная адресация
Операции над битами и байтами
Основные непривилегированные команды
Пересылка данных
Прямая адресация
Процессоры Intel в реальном режиме
Расширение AMD 3D
Расширение IА ММХ
Регистр флагов
Регистровая адресация
Регистры FPU
Регистры ММХ
Регистры общего назначения
Регистры процессора
Сдвиговые операции
Сдвиговые операции ММХ
Сегментные регистры
Способы адресации
Стек
Строковые операции
Типы данных FPU
Типы данных ММХ
Трансцендентные операции FPU
Управление флагами
Загрузка сегментных регистров
Директивы и операторы ассемблера
Глава 3. Директивы и операторы ассемблера
Структура программы
Псевдокоманды определения переменных
Структуры
Сегменты
Модели памяти и упрощенные директивы определения сегментов
Порядок загрузки сегментов
Процедуры
Конец программы
Директивы задания набора допустимых команд
Директивы управления программным счетчиком
Глобальные объявления
Условное ассемблирование
Выражения
Макроопределения
Блоки повторений
Макрооператоры
Другие директивы, используемые в макроопределениях
Управление файлами
Управление листингом
Комментарии
Основы программирования для MS-DOS
Чтение и запись в файл
Интерфейс EMS
Интерфейс XMS
Командные параметры и переменные среды
Область памяти HMA
Область памяти UMB
Обычная память
Основы программирования для MS-DOS
Параллельный порт
Поиск файлов
Последовательный порт
Прямая работа с видеопамятью
Программа типа ЕХЕ
Программа типа СОМ
Работа с файлами
Работа с мышью
Работа с SVGA-режимами
Работа с VGA-режимами
Системный таймер
Создание и открытие файлов
Средства BIOS
Средства DOS
Управление файловой системой
Загрузка и выполнение программ
Закрытие и удаление файла
Более сложные приемы программирования
Блочные устройства
Более сложные приемы программирования
Целочисленная арифметика повышенной точности
Часы реального времени и CMOS-память
Циклы
Деление
Динамик
Драйверы устройств в DOS
Джойстик
Генераторы случайных чисел
Клавиатура
Команды DSP
Команды инициализации
Команды управления
Конечные автоматы
Контроллер DMA
Контроллер прерываний
Локальные переменные
Мультиплексорное прерывание
Обработчики прерываний
Параллельный порт
Пассивная резидентная программа
Передача параметров
Передача параметров отложенным вычислением
Передача параметров по имени
Передача параметров по результату
Передача параметров по ссылке
Передача параметров по возвращаемому значению
Передача параметров по значению
Передача параметров в блоке параметров
Передача параметров в глобальных переменных
Передача параметров в потоке кода
Передача параметров в регистрах
Передача параметров в стеке
Перехват прерываний
Полурезидентные программы
Последовательный порт
Повторная входимость
Прерывания от внешних устройств
Процедуры и функции
Программирование на уровне портов ввода-вывода
Регистры графического контроллера (03CEh– 03CFH)
Регистры контроллера атрибутов (03C0h– 03C1h)
Регистры контроллера CRT (03D4h– 03D5H)
Регистры синхронизатора (03C4h– 03C5h)
Регистры VGA DAC (03C6h– 03C9h)
Резидентные программы
Символьные устройства
Сложение и вычитание
Сортировки
Сравнение
Структуры CASE
Структуры IF.. THEN... ELSE
Таймер
Трансцендентные функции
Умножение
Видеоадаптеры VGA
Вложенные процедуры
Вложенные процедуры с дисплеями
Вложенные процедуры со статическими ссылками
Внешние регистры контроллера VGA (03C2h – 03CFh)
Вычисления с фиксированной запятой
Вычисления с плавающей запятой
Выгрузка резидентной программы из памяти
Взаимодействие между процессами
Звуковые платы
Программирование в защищенном режиме
Адресация в защищенном режиме
Функции DPMI управления дескрипторами
Интерфейс DPMI
Интерфейс VCPI
Обработчики прерываний
Передача управления между режимами в DPMI
Переключение в защищенный режим
Пример программы
Программирование в защищенном режиме
Расширители DOS
Способы объединения программы с расширителем
Управление памятью в DPMI
Вывод на экран через линейный кадровый буфер
Программирование для Windows 95 и Windows NT
Диалоги
Динамические библиотеки
Драйверы устройств
Программирование для Windows 95 и Windows NT
Консольные приложения
Меню
Окна
Окно типа MessageBox
Первая программа
Полноценное приложение
Ассемблер и языки высокого уровня
Ассемблер и языки высокого уровня
Передача параметров
Конвенция Pascal
Конвенция С
Смешанные конвенции
Искажение имен
Встроенный ассемблер
Встроенный ассемблер в Pascal
Встроенный ассемблер в С
Оптимизация
Оптимизация
Высокоуровневая оптимизация
Оптимизация на среднем уровне
Вычисление констант вне цикла
Перенос проверки условия в конец цикла
Выполнение цикла задом наперед
Разворачивание циклов
Общие принципы низкоуровневой оптимизации
Основные рекомендации
Команда LEA
Выравнивание
AGI
Обращение к частичному регистру
Префиксы
Выполнение команд
Кэш-память
Очередь предвыборки
Конвейер FPU
Конвейер ММХ
Особенности архитектуры процессоров PentiumPro и Pentium II
Выполнение команд
Кэш-память
Очередь предвыборки
Предсказание переходов
Процессоры Intel в защищенном режиме
Дескрипторы
Машинно-специфичные регистры
Механизм защиты
Модель памяти в защищенном режиме
Нереальный режим
Обработка прерываний и исключений
Отладочные регистры
Переключение задач
Если происходит прерывание или исключение
Пример программы
Процессоры Intel в защищенном режиме
Проверка лимитов
Проверка привилегий
Проверка типа сегмента
Регистры
Регистры управления памятью
Регистры управления процессором
в которой флаг VM регистра
Сегмент состояния задачи
Селектор
Системные флаги
Системные и привилегированные команды
Страничная адресация
Управление задачами
Вход и выход из защищенного режима
В режиме V86 текущий уровень
Выполнение привилегированных команд
Защита на уровне страниц
Программирование на ассемблере в среде UNIX
Программирование на ассемблере в среде UNIX
Синтаксис AT&T
Основные правила
Запись команд
Адресация
Операторы ассемблера
Префиксные, или унарные операторы
Инфиксные, или бинарные операторы
Директивы ассемблера
Директивы определения данных
Директивы управления символами
Директивы определения секций
Директивы управления разрядностью
Директивы управления программным указателем
Директивы управления листингом
Директивы управления ассемблированием
Блоки повторения
Макроопределения
Программирование с использованием libc
Программирование без использования libc
Заключение
Символы ASCII
последовательность блоков процессора, которая задействуется
превращение циклов, выполняющихся известное число
Кодировки второй половины ASCII
Коды символов расширенного ASCII
Команды процессоров Intel 8088– Pentium II
Общая информация о скоростях выполнения
Общий формат команды процессора Intel
Префиксы
В этом приложении приведены скорости
Символы ASCII
Скан-коды клавиатуры
Список используемых сокращений
Управляющие символы ASCII
Значения полей кода команды
Значения поля ModRM
Значения поля SIB
-
Assembler для начинающих
Assembler для начинающих
Почему вас могло бы заинтересовать программирование на языке ассемблера? Cегодня повсюду используются такие языки высокого уровня как Бэйсик, Фортран и Паскаль . Возможно, вы уже знакомы по крайней мере с одним языком высокого уровня. Если вы постоянно пльзуютесь персональным компьютером IBM, то вы знаете, что интерпритатор Бэйсика является частью системы. Зачем же возиться еще с одним языком программирования, тем более с таким, который сулит определенные трудности? Очевидно, даже располагая современными могучими языками, вы все еще нуждаетесь в ассемблере из-за его
эффективности и точности.
Ассемблерные программы могут быть очень эффективными. Из программистов, с равными навыками и способностями, работающий на языке ассемблера создаст программу более компактную и быстродействущую, чем такая же программа, написанная на языке высокого уровня. Это так практически для всех небольших или средних программ. К сожалению, по мере возрастания размеров, программы на языке ассемблера теряют часть своих преимуществ. Это происходит из-за необходимого в ассемблерной программе внимания к деалям. Как вы увидите, язык ассемблера требует от вас планирования каждого действия компьютера. В небольших программах это позволяет оптимизировать работу программы с аппаратными средствами. В больших же
программах огромное количество деталей может помешать вам эффективно работать над самой программой, даже если отдельные компоненты
программы окажутся очень неплохими. Безусловно, программирование на языке ассемблера отвечает потребностям не каждой программы.
Персональный компьютер фирмы IBM (IBM PC)
Об этой книге
Основы компьютерных вычислений
Двоичная арифметика
Принципы работы компьютера
Процедуры
Стек
Прерывания
Двоичное дополнение
Шестнадцатиричное представление
Машинный язык и язык Ассемблера
Синаксис языка Ассемблера
Принципы работы Ассемблера
Биты байты и слова
Нумерация бит
Набор символов
Модель программирования 8088
Модель программирования 8088
Сегментные регистры
Предназначение сегментов
Оператор Segment
Оператор Assume
Управляющие рагистры
Указатель команд
Флаг захвата
Флаг прерываний
Флаг направления
Указатель стека
Регистр флагов
Флаг знака
Флаг нуля
Флаг четности
Флаг переноса
Дополнительный флаг переноса
Флаг переполнения
Векторы прерываний
Регистры общего назначения
Регистры адресации
Прямая адресация
Вычисление адресов
Адресация через базу и смещение
База + индекс + смещение
Байт MOD RM
Физическая адресация
Команды управления микропроцессором
Команды управления микропроцессором
Установка флагов
Специальные команды
Пересылка данных
Команда пересылки
Команда замены
Команды ввода и вывода
Загрузка исполнительного адреса
Загрузка указателя
Пересылка флагов
Перекодировка
Операции со стеком
Передача параметров
Арифметические команды
Сложение
Символьная коррекция деление
Команда преобразования
Вычитание
Арифметика с одним операндом
Сравнение
Десятичная коррекция
Симовльная коррекция сложение и вычитание
Умножение
Символьная коррекция умножение
Команда деления
Арифметический пример
Логические операции
Операции сдвига и поворота
Команды обработки строк
Загрузка и запись
Префикс REP
Пересылка строки
Команды сканирования и сравнения
Команды передачи управления
Близкие и далекие переходы
Адресация переходов
Безусловные переходы
Переходы по условию
Проверки кода условия
Управление циклами
Dos и Ассемблер
Дисковая операционная система
Редактор связей
Многомодульность
EXTRN и PUBLIC
Операция редактирования связей
Карта связей
Отладчик DEBUG
Преодразование файла типа exe в файл типа com
Файловая система
Имена файлов
Командный процессор
Функции DOS
Блок управления файлом (FCB)
Файлы com и exe
Создание программы на языке Ассемблера
Ассемблер и макроассемблер
Таблица символических имен
Перекрестные ссылки
Свойства Макроассемблера
Макроопределения
Аргументы макрокоманд
Ассемблирование по условию
Макрокоманды повторения
Макрооператоры
Команды INCLUDE
Сегменты
Структуры
Записи
Математический сопроцессор 8087
Работа 8087
Типы данных 8087
Представление данных с плавающей точкой
Форматы действительных чисел
Определение действительных чисел
Модель программирования 8087
Регистровый стек
Управляющее слово
Слово состояния
Набор команд сопроцессора 8087
Команды пересылки данных
Команды управления
Арифметические команды
Команды сравнения
Степенные и тригонометрические функции
Примеры
Степени десяти
Десять в степени X
Изображение чисел с плавающей точкой
Квадратное уравнение
Синус угла
Отладка программ с использованием 8087
Персональный компьютер IBM
Системное оборудование
Адаптер дисковода
Прямой доступ у памяти
Динамик
Клавиатура
Время суток
Возможности системы
Видеоадаптеры
Адаптер монохромного дисплея и принтера
Адаптер цветного графического монитора
Текстовый режим
Графический режим
Цвета в режиме APA 320*200
Графика высокого разрешения
Адаптер параллельного принтера
Адаптер синхронных коммуникаций
Адаптер управления играми
Базовая система ввода/вывода
Замечания по листингу ROM BIOS
Кассета
Дискета
Области данных драйвера BIOS дискеты
Команды чтения и записи
Команда проверки
Команда форматирования
Дисплей
Области данных дисплея
Функции вводавывода дисплея
Установка режима
Сдвиг изображения
Чтение и запись символов
Текст в графических режимах
Графика
Выдача на телетайп
Самотестирование при включении питания
Прерывания ROM BIOS
Драйверы доступа
Процедуры пользователя
Блоки параметров
Область данных ROM BIOS
Прогарммы драйверов устройств
Системный сервис
Принтер и асинхронные коммуникации
Клавиатура
Данные клавиатуры
Процедура BIOS клавиатуры изнутри
Расширения системы и подпрограммы на языке Ассемблера
Расширение системы BIOS
Возврат программы в DOS с сохранением ее резидентности
Загрузка в верхнюю часть памяти
Процедуры на языке Ассемблера
Процедура Бэйсика BLOAD
Вставка короткой программы
Компилируемые языки высокого уровня
Заключение
Заключение
-
Turbo Assembler 3.0. Руководство пользователя
Турбо Ассемблер работает на компьютерах семейства IBM PC, включая модели XT, AT и PS/2, а также на полностью совместимых с ними компьютерах. Для работы Турбо Ассемблера требуется операци- онная система MS-DOS (версии 2.0 или более поздняя) и не менее 256К оперативной памяти.
Турбо Ассемблер генерирует инструкции процессоров 8086, 80186, 80286, 80386 и i486, а также инструкции с плавающей точкой для арифметических сопроцессоров 8087, 80287 и 80387. (Подробнее об инструкциях процессором семейства 80х86/80х87 рассказывается в книгах фирмы Intel.)
Требования к программному и аппаратному обеспечению
Поддержка DPMI
О данной документации
Руководство пользователя
Соглашения по обозначениям
Как обратиться за помощью к фирме Borland
Ресурсы вашего пакета
Возможности фирмы Borland
Глава 1. Начало работы на Турбо Ассемблере
Установка Турбо Ассемблера в системе
Текстовые справочные файлы
Файл README
Файл HELPME!.TSM
Файл H2ASH.TSM
Файл TCREF.TSM
Оперативный справочник
Ваша первая программа на Турбо Ассемблере
Ассемблирование вашей первой программы
Компоновка программы
Запуск вашей первой программы
Что происходит?
Модификация вашей первой программы на Турбо Ассемблере
Вывод информации на устройство печати
Ваша вторая программа на Турбо Ассемблере
Запуск программы REVERSE.ASM
Литература по языку Ассемблера
Глава 2. Использование директив и параметров
Запуск Турбо Ассемблера из DOS
Параметры командной строки
Параметр /A
Параметр /B
Параметр /C
Параметр /D
Параметр /E
Параметр /H или /?
Параметр /I
Параметр /J
Параметр /KH
Параметр /L
Параметр /LA
Параметр /M
Параметр /ML
Параметр /MU
Параметр /MV#
Параметр /MX
Параметр /N
Параметр /O
Параметр /OP
Параметр /P
Параметр /Q
Параметр /R
Параметр /S
Параметр /T
Параметр /V
Параметр /W
Параметр /X
Параметр /Z
Параметр /ZD
Параметр /ZI
Параметр /ZN
Косвенные командные файлы
Файлы конфигурации
Глава 3. Общие принципы программирования
Режим Ideal Турбо Ассемблера
Для чего используется режим Ideal?
Переключение в режим Ideal и выход из него
Отличия режима Ideal и режима MASM
Выражения и операнды
Операции
Подавление корректировок
Операнд инструкции BOUND
Сегменты и группы
Доступ к данным в сегменте, принадлежащем группе
Доступ к данным в сегменте, принадлежащем группе - 2
Комментарии в программах
Комментарии в конце строки
Директива COMMENT
Продолжение строки
Использование включаемых файлов
Предопределенные идентификаторы
Присваивание идентификаторам значений
Общая структура модуля
Директива VERSION
Директива NAME
Директива END
Вывод сообщения в процессе ассемблирования
Вывод предупреждающих сообщений
Вывод нескольких сообщений об ошибках
Глава 4. Объектно-ориентированное программирование
Терминология
Для чего в Турбо Ассемблере используются объекты?
Что такое объект?
Пример объекта
Описание объектов
Описание процедуры методa
Таблица виртуальных методов
Инициализация таблицы виртуальных методов
Вызов метода объекта
Вызов статического метода
Вызов виртуального метода
Вызов виртуальных методов "предков"
Кое-что еще о вызове методов
Создание экземпляра объекта
Программирование с объектами
Пример из области программирования
Глава 5. Использование выражений и значений идентификаторов
Константы
Числовые константы
Изменение используемого по умолчанию основания
Строковые константы
Идентификаторы
Имена идентификаторов
Типы идентификаторов
Адресные подтипы данных
Описание сложного адресного подтипа
Выражения
Точность в выражениях
Константы в выражениях
Идентификаторы в выражениях
Регистры
Стандартные значения идентификаторов
Значения простых идентификаторов
Унарная операция LENGTH
Унарная операция WIDTH
Унарная операция MASK
Общие арифметические операции
Простые арифметические операции
Логические арифметические операции
Поразрядные операции сдвига
Операции сравнения
Задание адресного подтипа выражения
Получение типа выражения
Переопределение сегментной части адресного выражения
Получение сегмента и смещения адресного выражения
Создание адресного выражения, использующего счетчик инструкций
Определение характеристик выражения
Ссылки на структуры, объединения и смещения элементов в таблице
Описание содержимого адреса
Подразумеваемое сложение
Подразумеваемое сложение
Получение значения старшего или младшего байта выражения
Задание 16- или 32-разрядных выражений
Глава 6. Директивы выбора процессора и идентификаторы процессора
Директивы процессоров iAPx86
Предопределенные идентификаторы
Идентификатор @Cpu
Идентификатор @WordSize
Директивы сопроцессора 8087
Директивы эмуляции сопроцессора
Глава 7. Использование моделей памяти программы и сегментации
Директива MODEL
Идентификаторы, генерируемые директивой MODEL
Идентификатор @Model
Идентификатор @32Bit
Идентификатор @CodeSize
Идентификатор @DataSize
Идентификатор @Interface
Упрощенные сегментные директивы
Идентификаторы, создаваемые упрощенными директивами сегментации
Директива STARTUPCODE
Идентификатор @Startup
Директива EXITCODE
Определение общих сегментов и групп
Директива SEGMENT
Атрибут комбинирования сегментов
Атрибут класса сегмента
Атрибут выравнивания сегмента
Атрибут размера сегмента
Атрибут доступа к сегменту
Директива ENDS
Директива GROUP
Директива ASSUME
Переопределение сегмента
Изменение упорядочивания сегментов в модуле
Директива .ALPHA
Директива .SEQ
Директива DOSSEG: упорядочивание сегментов в порядке DOS
Изменение размера стека
Глава 8. Определение типов данных
Определение перечислимых типов данных
Определение записей с битовыми полями
Определение структур и объединений
Открытие определения структуры или объединения
Задание элементов структуры и объединения
Определение меток элементов структур с помощью директивы LABEL
Выравнивание элементов структуры
Закрытие определения структуры или объединения
Вложенные структуры и объединения
Включение одной именованной структуры в другую
Использование имен структур в выражениях
Определение таблиц
Переопределение элементов таблицы
Определение именованного типа
Определение объекта
Директива TBLPTR
Идентификаторы, определяемые расширенной директивой STRUC
Глава 9. Задание и использование счетчика адреса
Идентификатор счетчика адреса $
Директивы счетчика адреса $
Директива ORG
Директивы EVEN и EVENDATA
Директива ALIGN
Определение меток
Операция :
Директива LABEL
Директива ::
Глава 10. Описание процедур
Синтаксис определения процедур
Описание процедур NEAR или FAR
Описание языка процедуры
Задание модификатора языка
Определения аргументов и локальных переменных
Синтаксис директив ARG и LOCAL
Область действия аргументов и имен локальных переменных
Сохранение регистров
Вложенные процедуры и правила области действия
Описание процедур методов для объектов
Глава 11. Управление областью действия идентификаторов
Переопределяемые идентификаторы
Область действия в границах блока
Директивы LOCALS и NOLOCALS
Область действия в границах блока в MASM
Локальные метки в стиле MASM
Глава 12. Определение данных
Простые директивы определения данных
Создание экземпляра структуры или объединения
Инициализация экземпляра структуры или объединения
Создание экземпляра записи
Инициализация экземпляров записи
Создание экземпляра данных перечислимого типа
Инициализация экземпляра перечислимого типа данных
Создание экземпляра таблицы
Инициализация экземпляров таблицы
Создание и инициализация экземпляра именованного типа данных
Создание экземпляра объекта
Создание экземпляра таблицы виртуальных методов объекта
Глава 13. Расширенные инструкции
Эффективная генерация кода: директивы SMART и NOSMART
Расширенные инструкции перехода
Дополнительные инструкции цикла процессора 80386
Дополнительные инструкции ENTER и LEAVE
Дополнительные инструкции возврата
Расширенные инструкции PUSH и POP
Инструкции PUSH и POP с несколькими операндами
Использование в инструкциях PUSH и POP указателей
Занесение в стек константа (процессор 8086)
Расширенные инструкции сдвига
Принудительное переопределение сегментов: инструкции SEGxx
Дополнительные инструкции работы с флагами
Дополнительные инструкции работы с битами полей
Инструкция GETFIELD
Дополнительная быстрая инструкции непосредственного умножения
Расширение необходимых инструкций для процессора 80386
Вызов процедур с кадрами стека
Вызываемые процедуры, содержащие RETURNS
Вызов процедур методов для объектов: CALL.METHOD
Остаточная рекурсия для методов объектов: инструкция JMP.METHOD
Дополнительные инструкции для объектного программирования
Глава 14. Использование макрокоманд
Текстовые макрокоманды
Определение текстовых макрокоманд с помощью директивы EQU
Директивы макрокоманд работы с текстовыми строками
Директива CATSTR
Директива SUBSTR
Директива INSTR
Директива SIZESTR
Примеры макрокоманд работы с текстом
Макрокоманды, состоящие из нескольких строк
Тело макрокоманды, состоящей из нескольких строк
Непосредственная макродиректива %
Непосредственная макродиректива %
Включение расширения макрокоманды в файл листинга
Глава 15. Использование условных директив
Синтаксис условных директив
Директива условного ассемблирования IFxxx
Директивы условного ассемблирования ELSEIFxxx
Директивы генерации сообщений об ошибке ERRxx
Безусловные директивы генерации сообщений об ошибке
Условные директивы с выражениями
Условные директивы с идентификатором
Условные директивы с текстовыми строками
Условия выполнения прохода Ассемблером
Включение условных директив в файл листинга
Глава 16. Интерфейс с компоновщиком
Описание внешних идентификаторов
Соглашения для конкретного языка
Описание общедоступных идентификаторов
Описание идентификаторов библиотеки
Определение внешних идентификаторов
Описание глобальных идентификаторов
Определение общих переменных
Включение библиотеки
Глава 17. Генерация листинга
Формат листинга
Общие директивы управления листингом
Директивы листинга включаемых файлов
Директивы вывода блоков условного ассемблирования
Директивы вывода в файл листинга макрокоманд
Директивы вывода листинга перекрестных ссылок
Параметры изменения формата листинга
Глава 18. Интерфейс Турбо Ассемблера и Borland C++
Вызов из Borland C++ функций Турбо Ассемблера
Основные моменты в интерфейсе Турбо Ассемблера и Borland C++
Компоновка ассемблерных модулей с С++
Использование Extern "C" для упрощения компоновки
Модели памяти и сегменты
Упрощенные директивы определения сегментов и Borland C++
Старые директивы определения сегментов и Borland C++
Значения по умолчанию: когда необходимо загружать сегменты?
Общедоступные и внешние идентификаторы
Подчеркивания и язык Си
Различимость строчных и прописные символов в идентификаторах
Типы меток
Внешние дальние идентификаторы
Командная строка компоновщика
Взаимодействие между Турбо Ассемблером и Borland C++
Передача параметров
Сохранение регистров
Возврат значений
Вызов функции Турбо Ассемблера из Borland C++
Написание на языке Ассемблера функций-элементов С++
Соглашения по вызовам, использующиеся в Паскале
Вызов Borland C++ из Турбо Ассемблера
Компоновка с кодом инициализации С++
Задание сегмента
Выполнение вызова
Вызов из Турбо Ассемблера функции Borland C++
Глава 19. Интерфейс Турбо Ассемблера с Турбо Паскалем
Директива компилятора $L и внешние подпрограммы
Директива PUBLIC
Директива EXTRN
Ограничения при использовании объектов типа EXTRN
Использование корректировок сегментов
Устранение неиспользуемого кода
Соглашения Турбо Паскаля по передаче параметров
Параметры-значения
Скалярные типы
Вещественные значения
Типы Single, Double, Extended и Comp и типы сопроцессора 8087
Указатели
Строки
Записи и массивы
Множества
Параметры-переменные
Обеспечение стека
Доступ к параметрам
Использование для адресации к стеку регистра BP
Директива ARG
Турбо Паскаль и директива .MODEL
Использование другого базового или индексного регистра
Результаты функции в Турбо Паскале
Выделение пространства для локальных данных
Выделение статической памяти
Выделение временной памяти
Примеры подпрограмм на Ассемблере для Турбо Паскаля
Подпрограмма шестнадцатиричного преобразования общего назначения
Пример обмена содержимого двух переменных
Пример анализа операционной среды DOS
Новые средства Турбо ассемблера версии 3.1
Исправления и добавления к "Руководству пользователя по Турбо ассемблеру"
Приложение A. Замечания по программированию
Упрощенные директивы определения сегмента
Программы DOS
Замечания по программам формата EXE
Замечания по программам формата COM
Программы Windows
Замечания по динамически компонуемым библиотекам Windows
Замечания по прикладным программам Windows
Приложение B. Обзор синтаксических правил Турбо Ассемблера
Лексическая грамматика
Грамматика выражений в режиме MASM
Грамматика выражений в режиме Ideal
Старшинство ключевых слов
Старшинство операций в режиме Ideal
Старшинство операций в режиме MASM
Ключевые слова и предопределенные идентификаторы
Ключевые слова директив
Приложение C. Вопросы совместимости
Одно- и двухпроходные режимы ассемблирования
Переменные операционной среды
Формат фирмы Microsoft для двоичных чисел с плавающей точкой
Приложение D. Утилиты Турбо Ассемблера
Утилита-преобразователь H2ASH
Приложение E. Сообщения об ошибках
Информационные сообщения
Предупреждающие сообщения и сообщения об ошибках
Bit segment not allowed without .386
Argument needs type override
Argument to operation or instruction has illegal size
Arithmetic overflow
ASSUME must be segment register
Bad keyword in SEGMENT statement
Can't add relative quantities
Can't address with currently ASSUMEd segment registers
Can't convert to pointer
Can't emulate 8087 instruction
Can't make variable public
Can't override ES segment
Can't subtract dissimilar relative quantities
Can't use macro name in expression
Can't use this outside macro
Code or data emission to undeclared segment
Code or data emission to undeclared segment
Constant assumed to mean Immediate const
Constant too large
CS not correctly assumed
CS override in protected mode
CS unreachable from current segment
Declaration needs name
Directive ignored in Turbo Pascal model
Directive not allowed inside structure definition
Duplicate dummy arguments:_
ELSE or ENDIF without IF
Expecting METHOD keyword
Expecting offset quantity
Expecting offset or pointer quantity
Expecting pointer type
Expecting record field name
Expecting register ID
Expecting scalar type
Expecting segment or group quantity
Extra characters on line
Forward reference needs override
Global type doesn't match symbol type
ID not member of structure
Illegal forward reference
Illegal immediate
Illegal indexing mode
Illegal instruction
Illegal instruction for currently selected processor(s)
Illegal local argument
Illegal local symbol prefix
Illegal mаcro argument
Illegal memory reference
Illegal number
Illegal origin address
Illegal override in structure
Illegal override register
Illegal radix
Illegal register for instruction
Illegal register multiplier
Illegal segment address
Illegal use of constant
Illegal use of register
Illegal use of segment register
Illegal USES register
Illegal version ID
Illegal warning ID
Instruction can be compacted with override
Invalid model type
Invalid operand(s) to instruction
Labels can't start with numeric characters
Line too long - truncated
Location counter overflow
Method call requires object name
Missing argument list
Missing argument or
Missing argument size variable
Missing COMM ID
Missing dummy argument
Missing end quote
Missing macro ID
Missing module name
Missing or illegal language ID
Missing or illegal type specifier
Missing table member ID
Missing term in list
Missing text macro
Model must be specified first
Module is pass-dependant - compatibility pass was done
Name must come first
Near jump or call to different CS
Need address or register
Need angle brackets for structure fill
Need colon
Need expression
Need file name after INCLUDE
Need left parenthesis
Need method name
Need pointer expression
Need quoted string
Need register in expression
Need right angle bracket
Need right curly bracket
Need right parenthesis
Need right square bracket
Need stack argument
Need structure member name
Not expecting group or segment quantity
One non-null field allowed per union expansion
Only one startup sequence allowed
Open conditional
Open procedure
Open segment
Open structure definition
Operand types do not match
Operation illegal for static table member
Pass-dependant construction encountered
Pointer expression needs brackets
Positive count expecting
Record field too large
Record member not found
Recursive definition not allowed for EQU
Register must be AL or AX
Register must be DX
Relative jump out of range by __ bytes
Relative quantity illegal
Reserved word used as symbol
Rotate count must be constant or CL
Rotate count out of range
Segment alignment not strict enough
Segment attributes illegally redefined
Segment name is superfluous
String too long
Symbol already defined:__
Symbol already different kind
Symbol has no width or mask
Symbol is not a segment or already part of a group
Text macro expansion exceeds maximum line length
Too few operands to instruction
Too many errors or warnings
Too many initial values
Too many register multipliers in expression
Too many registers in expression
Too many USES registers
Trailling null value assumed
Undefined symbol
Unexpected end of file (no END directive)
Unknown character
Unmatched ENDP:_
Unmatched ENDS:_
User-generated error
Value out of range
Сообщения о фатальных ошибках -----------------------------------------------------------------
Bad switch
Can't find @file __
Сan't locate file __
Error writing to listing file
Error writing to object file
File not found
File was changed or deleted while assembly in progress
Insufficient memory to process command line
Internal error
Invalid command line
Invalid number after _
Out of hash space
Out of memory
Out of string space
Too many errors found
Unexpected end of file (no END directive)
-
Иллюстрированный самоучитель по Assembler
Самоучитель по Assembler
Микропроцессоры корпорации Intel и персональные компьютеры на их базе прошли не очень длинный во времени, но значительный по существу путь развития, на протяжении которого кардинально изменялись и возможности и даже сами принципы их архитектуры. В то же время, внос в микропроцессор принципиальные изменения, разработчики были вынуждены постоянно иметь в виду необходимость обеспечения совмести мости новых моделей со старыми, чтобы не отпугивать потенциального покупателя перспективой полной замены освоенного или разработанного им программного обеспечения. В результате современные микропроцессоры типа Pentium, обеспечивая такие возможности, как 32-битную адресацию почти неограниченных объемов памяти, многозадачный режим с одновременным выполнением нескольких программ, аппаратных средства защиты операционной системы и прикладных программ друг друга, богатый набор дополнительных эффективных команд и способе адресации, в то же время могут работать (и часто работают) в режиме первых микропроцессоров типа 8086, используя всего лишь 1 мегабайт оперативной памяти, 16-разрядные операнды (т. е. числа в диапазоне до 216 - 1 = 65535) и ограниченный состав команд. Поскольку программирование на языке ассемблера напрямую затрагивает аппаратные возможности микропроцессора, прежде всего следует выяснить, в какой степени программист может использовать новые возможности микропроцессоров в своих программах и какие проблемы программной несовместимости могут при этом возникнуть.
Распределение адресного пространства
Регистры процессора
Сегментная структура программ
Стек
Система прерываний
Index7
Иллюстрированный самоучитель по Assembler
Краткое содержание
Процесс подготовки и отладки программы
Представление данных
Описание данных
Структуры
Способы адресации
Переходы
Вызовы подпрограмм
Макросредства ассемблера
Иллюстрированный самоучитель по Assembler
Краткое содержание
Организация приложений MS-DOS
Циклы
Обработка строк
Использование подпрограмм
Пример 3-8. Вызов подпрограммы без параметров
Двоично-десятичные числа
Пример 3-9. Чтение и обработка показаний часов реального времени
Программирование аппаратных средств
Иллюстрированный самоучитель по Assembler
Краткое содержание
Система команд процессоров Intel
HLT Останов
Команды предназначены для ввода
INT Программное прерывание
MP Безусловный переход
LEAVE Выход из процедуры высокого уровня
Р+ LGDT Загрузка регистра таблицы глобальных дескрипторов
LOCK Запирание шины
LODSD Загрузка двойного слова из строки
Р+ LTR Загрузка регистра задачи TR
MOVS Пересылка данных из строки в строку
ААА ASCII-коррекция регистра АХ после сложения
MUL Умножение целых чисел без знака
OUTS Вывод строки в порт
POP Извлечение слова из стека
PUSH Занесение операнда в стек
RCR Циклический сдвиг вправо через бит переноса
RET Возврат из процедуры
ROL Циклический сдвиг влево
SBB Целочисленное вычитание с займом
SETcc Установка байта по условию
P+ SIDT Сохранение в памяти содержимого регистра таблицы дескрипторов прерываний
ADC Целочисленное сложение с переносом
AND Логическое И
STI Установка флага прерывания
P+ STR Сохранение содержимого регистра состояния задачи
XADD Обмен и сложение
BSF Прямое сканирование битов
Пример 4
BTR Проверка и сброс бита
CLC Сброс флага переноса
СМР Сравнение
CMPXCHG Сравнение и обмен
DAA Десятичная коррекция в регистре AL после сложения
-
Сборник по задачам и примерам Assembler
Профессия программиста удивительна и уникальна. Давно уже настало время настоящего философского осмысления этой сферы человеческой деятельности, действительно обладающей какими-то особенными, для людей непосвященных чуть ли не магическими, свойствами. Если не брать в рассмотрение коммерческую сторону, то можно сказать, что чужих людей в этой области профессиональной деятельности нет. В чем же ее особенность? Наиболее точно по этому поводу высказался Фредерик Брукс в главе «Пятьдесят лет удивления, восхищения и радости» своей книги «Мифический человеко-месяц, или как создаются программные системы>: «Немногим Бог дает право зарабатывать на жизнь тем, чем они с радостью занимались бы по собственной воле, по увлечению. Я благодарен судьбе». И далее: «Область связанных с компьютерами знаний претерпела взрыв, как и соответстующая технология. Будучи аспирантом в середине 50-х, я мог прочесть все журналы и труды конференций. Я мог оставаться на современном уровне во всей научной дисциплине.
Глава 1. Программирование целочисленных арифметических операций
Программирование целочисленных арифметических операций
Двоичные числа
Сложение чисел размером 1 байт без учета знака
Сложение чисел размером N байт без учета знака
Сложение чисел размером 1 байт с учетом знака
Сложение с учетом знака чисел размером N байт
Вычисление дополнения числа размером N байт
Вычисление модуля числа размером N байт
Вычитание двоичных чисел
Вычитание чисел размером N байт без учета знака
Вычитание чисел размером 1 байт с учетом знака
Вычитание чисел размером N байт с учетом знака
Умножение двоичных чисел
Умножение чисел размером 1 байт без учета знака
Умножение чисел размером N и М байт без учета знака
Умножение чисел размером 1 байт с учетом знака
Умножение чисел размером N и М байт с учетом знака
Умножение N-байтного числа на число размером М байт с учетом знака
Вычисление дополнения числа размером N байт (реверсивное)
Вычисление модуля числа размером N байт (реверсивное)
Деление двоичных чисел
Деление без учета знака значения размером 2 байта на значение размером 1 байт
Деление с учетом знака значения размером 2 байта на значение размером 1 байт
Деление (N+М)-разрядного беззнакового целого на число размером М байт
Двоично-десятичные числа (BCD-числа)
Неупакованные BCD-числа
Сложение неупакованных BCD-чисел (макрокоманда)
Вычитание неупакованных BCD-чисел (макрокоманда)
Умножение неупакованных BCD-чисел (макрокоманда)
Деление N-разрядного беззнакового
Преобразование упакованного BCD-числа размером N байт в неупакованное BCD-число (макрокоманда)
Генерация последовательности случайных чисел
Конгруэнтный метод генерации последовательности случайных чисел
Мультипликативный конгруэнтный метод генерации последовательности случайных чисел
Смешанный конгруэнтный метод генерации последовательности случайных чисел
Аддитивный генератор случайных чисел
Сборник по задачам и примерам Assembler
Глава 2. Сложные структуры данных
Сложные структуры данных Сутью
Основные понятия
Способы распределения памяти
Механизм виртуальной памяти Windows
Механизм работы с кучами Windows
Множество
Массив
Описание массивов
Работа с массивами
Сортировка массивов
Поиск в массивах
Неупорядоченный поиск
Упорядоченный поиск
Действия с матрицами
Транспонирование прямоугольной матрицы
Структура
Вложенные структуры
Массивы структур — таблицы
Поиск в таблице
Список
Последовательные списки
Стек
Очередь
Дека
Связные списки
Односвязные списки
Двусвязные списки
Сеть
Создание односвязного списка переходов для состояния конечного автомата
Дерево
Представление дерева в памяти
Построение двоичного дерева
Обход узлов дерева
Лексикографическое дерево
Элементы компиляции программ
Формальное описание языка программирования
Описание процесса трансляции программы
Лексический анализ
Выделение классов лексем
Синтаксический анализ
Сборник по задачам и примерам Assembler
Глава 3. Процедуры в программах ассемблера
Процедуры в программах ассемблера
Реализация рекурсивных процедур
Реализация вложенных процедур
Разработка динамических (DLL) библиотек
Шаг 1. Разработка текста DLL-библиотеки
Шаг 2. Трансляция и компоновка исходного текста DLL-библиотеки
Шаг 3. Создание lib-файла
Шаг 4. Сборка приложения с использованием DLL-библиотеки
Шаг 5. Проверка работоспособности приложения с использованием DLL-библиотеки
Сборник по задачам и примерам Assembler
Глава 4. Обработка цепочек элементов
Обработка цепочек элементов
Прямой поиск в текстовой строке
Поиск с предварительным анализом искомой подстроки
Сборник по задачам и примерам Assembler
Глава 5. Работа с консолью в программах на ассемблере
Работа с консолью в программах на ассемблере
Функции BIOS для работы с консолью
Функции BIOS для работы с клавиатурой
Проверка наличия символа (01h, 11h, 21h int 16h)
Получение состояния флагов клавиатуры (02h, 12h, 22h int 16h)
Запись символа в буфер клавиатуры (05h int 16h)
Функции BIOS для работы с экраном
Установка видеорежима (00h int 10h)
Установка позиции курсора (02h int 10h)
Получение позиции курсора (03h int 10h)
Запись символа и его атрибута в видеопамять (09h int 10h)
Чтение символа и его атрибута из видеопамяти (08h int 10h)
Запись символа в видеопамять (0Ah int 10h)
Запись символа в режиме телетайпа (0Eh int 10h)
Вывод строки (13h int 10h)
Перемещение в окне вверх (06h int 10h)
Функции MS DOS для работы с консолью
Функции MS DOS для ввода данных с клавиатуры
Чтение с эхом символа с клавиатуры (10h int 21h)
Прямой ввод с эхом символа с клавиатуры (06h int 21h)
Чтение без эха символа с клавиатуры (07h int 21h)
Чтение без эха символа с клавиатуры (08h int 21h)
Ввод строки символов с клавиатуры (0ah int 21h)
Получить состояние клавиатуры (0Bh int 21h)
Ввод с клавиатуры с предварительной очисткой буфера (ОСh int 21h)
Функции MS DOS для вывода данных на экран
Вывод символа на экран (02h int 21h)
Прямой вывод символа на экран (06h int 21h)
Вывод строки на экран (09h int 21h)
Работа с консолью в среде Windows
Организация ввода-вывода в консольном приложении Windows
Организация ввода-вывода в консольном приложении Windows - 2
Минимальная программа консольного приложения
Организация низкоуровнего консольного ввода-вывода
Сборник по задачам и примерам Assembler
Глава 6. Преобразование чисел
Преобразование чисел
Преобразование чисел - 2
Ввод чисел с консоли
Ввод целых десятичных чисел из диапазона 0..99
Ввод целых десятичных чисел из диапазона 0..999 999 999 999 999 999
Ввод целых десятичных чисел из диапазона 0..до бесконечности
Ввод вещественных чисел
Вывод чисел на консоль
Вывод целых десятичных чисел из диапазона 0..99
Вывод целых десятичных чисел из диапазона от 0 до бесконечности
Вывод целых десятичных чисел из диапазона 0..999 999 999 999 999 999
Вывод вещественных чисел
Сборник по задачам и примерам Assembler
Глава 7. Работа с файлами в программах на ассемблере
Работа с файлами в программах на ассемблере
Работа с файлами в MS DOS (имена 8.3)
Создание, открытие, закрытие и удаление файла
Создание файла с усечением существующего до нулевой длины
Открытие или создание файла с расширенными возможностями
Закрытие файла
Чтение, запись, позиционирование в файле
Установка текущей файловой позиции
Запись в файл или устройство
Чтение из файла или устройства
Получение и изменение атрибутов файла
Получить атрибуты файла
Установить атрибуты файла
Переименовать файл
Установить дату и время создания или последней модификации файла
Получить номер заданного по умолчанию дисковода
Работа с файлами в MS DOS (длинные имена)
Создание, открытие, закрытие и удаление файла
Открытие или создание файла
Удаление файла
Получить дату и время создания файла
Установить дату последней модификации файла
Установить дату и время создания или последней модификации файла
Получить атрибуты файла
Установить атрибуты файла
Переименовать файл
Работа с дисками, каталогами и организация поиска файлов
Получить информацию о томе
Создание каталога
Изменить текущий каталог
Получение текущего каталога
Получить полный путь
Получить полный путь с краткими именами (в формате 8.3)
Получить полный путь с длинными именами
Получить информацию о файле по описателю
Получить информацию о файле по описателю - 2
Создать псевдоним
Поиск файлов и каталогов
Файловый ввод-вывод в Win32
Обработка ошибок
Создание, открытие, закрытие и удаление файла
Закрытие файла
Копирование файла
Перемещение файла
Переименование файла
Удаление файла
Чтение, запись, позиционирование в файле
Установка текущей файловой позиции
Получение и изменение атрибутов файла
Работа с дисками, каталогами и организация поиска файлов
Получить информацию о свободном дисковом пространстве
Создание и удаление каталога
Определение и изменение текущего каталога
Поиск файлов
Поиск файлов с помощью функции SearchPath
Файлы, отображаемые в память
Сборник по задачам и примерам Assembler
Глава 8. Профайлер
Профайлер
Расширение традиционной архитектуры Intel
Команды RDMSR и WRMSR
Команда CPUID — получение информации о текущем процессоре
Использование счетчика меток реального времени TSC
Сборник по задачам и примерам Assembler
Глава 9. Вычисление CRC
Вычисление CRC
CRC-арифметика
Прямой алгоритм вычисления CRC
Основы
Прямой табличный алгоритм CRC16
Прямой табличный алгоритм CRC32
«Зеркальный» табличный алгоритм CRC32
Сборник по задачам и примерам Assembler
Глава 10. Программирование ХММ-расширения
Программирование ХММ-расширения
Программирование ХММ-расширения
Описание упакованных и скалярных данных
Примеры использования команд ХММ-расширения
Сложение и умножение двух упакованных ХММ-значений
Умножение матрицы на вектор
Умножение матрицы 4x4 на четырехмерный вектор (стандартный сопроцессор)
Препроцессор команд ХММ-расширения
Поддержка ХММ-команд в файле iaxmm.inc
Язык описания команд ассемблера
Выделение классов лексем
Классы литер
«Склеивание» конечных автоматов для всех классов лексем
Синтаксический анализ
-
Статьи по Assembler
Всякий сколько-нибудь значительный программный проект содержит сотни, а то и тысячи идентификаторов. Как у программистов хватает фантазии их придумывать - это отдельная тема для исследования, пока что ждущая своего Фрейда, или Павлова, или Кастанеду, или, на худой конец, Маркеса
Рунет : win32asm
Рунет : ассемблер
Рунет : братские сайты
Internet : win32asm
Internet : assembler
Избранное : форумы
Избранное : документы
Избранное : разное
Программы
Mycall (c++)
Mycall (ассемблер)
Пакет logcount
Артефакты
Ms devstudio - среда разработки asm
Минимальное приложение
Параметры функции WinMain
Browse info для ассемблера
Старт и завершение приложений
Зачем он нужен, этот ассемблер?
Main.cpp для mycall (c++)
Main.asm для mycall (ассемблер)
Main.h для mycall (c++)
Mycall.rc для mycall
@Struct.inc для mycall (ассемблер)
Windows.inc для mycall (ассемблер)
Main.inc для mycall (ассемблер)
Инструкция программиста mycall
Обсуждение статьи "Зачем он нужен, этот ассемблер?"
Зачем нужен ассемблер - дополнение Геннадия Майко
Компиляция файлов .asm
Вызов функций api
Шаблон оконного приложения
Минимальная stub-программа
Взаимодействие экземпляров приложения
Взаимодействие экземпляров приложения (вариант)
Ошибки при вызове функций api
Взаимодействие экземпляров приложения (вариант)
Настоящий ли вы ассемблерщик?
Как смотреть assembler.ru локально
Лептонный стиль программирования
Лептонный стиль программирования - реализация
Как писать на masm в строчку
Иллюстрация
Иллюстрация
Можно ли зарабатывать на жизнь shareware?
Сколько зарабатывают системные программисты?
Впечатления от "сегоднячко"
Правильная история компьютера
Так в каком же веке мы живем?
Классификация информации
Пролетая над миллионом баксов
Догадка гольдбаха (версия 2.1)
Догадка Гольдбаха (версия Тима Туманного)
О пользе монополий
Cardiotonic pills
Инструкция оксикардин
Описание препарата оксикардин
Эффективность препарата оксикардин
Как починить hewlett packard
О формате pcx
Как изменить способности компьютера
Макросы first и second
-
Win32asm обучение
Сначала краткое введение в этот туториал. Win32asm не очень популярный язык программирования, и есть только несколько (хороших) туториалов. Большинство туториалов сосредотачивается на программировании win32 (т.е. Win API, использование стандартных windows методов), а не программирование на самом ассемблере, используя коды операций, регистры и т.д. Хотя Вы можете найти это и в других туториалах, они обычно объясняют программирование под DOS. Они, конечно, помогут вам изучить ассемблер, но для программирования под windows, вам не нужно знать о DOS прерываниях и о функциях ввода\вывода в порты. В windows, есть функции Win API, которые вы можете использовать в своих программах, но об этом позже. Цель этого туториала состоит в том, чтобы объяснить, как программировать на ассемблере под win32.
Урок 1 - Ассемблер
Урок 10 - Преимущества MASM
Урок 11 - Основы ассемблера в windows
Урок 12 - Первая программа
Урок 13 - Окна в windows
Урок 14 - В стадии разработки
Урок 2 - Начало
Урок 3 - Основы ассемблера
Урок 4 - Память
Урок 5 - Коды операции
Урок 6 - Структура файла
Урок 7 - Условные переходы
Урок 8 - Кое-что о числах
Урок 9 - Еще о кодах операций
-
Архитектура x86-64 под скальпелем ассемблерщика
64- битный лейбл звучит возбуждающе, но в практическом плане это всего лишь хитрый маркетинговый трюк, скрывающий не только достоинства, но и недостатки. Нам дарованы 64-битные операнды и 64-битная адресация. Казалось бы, лишние разряды карман не тянут и если не пригодятся, то по крайней мере не помешают
разрядный лейбл, для разнообразия на китайском
Что нам понадобиться?
реакция 64-битного Линуха
Листинг1 сборка BOCHS'а с поддержкой эмуляции x86-64
Листинг2 сборка BOCHS'а для компиляции Microsoft Visual C++
специальная сборка BOCHS'а
загрузка 64-разрядного Дебиана под эмулятором QEMU
битная версия Windows в стадии начальной загрузки
Обзор x86-64
регистры, доступные в x86-64 режиме
Листинг3 загрузка опкода следующей машинной команды в классическом x86
Листинг4 загрузка опкода следующей машинной команды на x86-64
Листинг5 абсолютная адресация в классическом x86
Листинг6 использование фиктивного базирования на x86-64 для абсолютной адресации
Врезка переход в 64-разрдяный режим
Hello world на x86-64
Листинг 8 пример вызова API-функции с пятью параметрами по соглашению x86-64
Листинг9 простейшая 64-битная программа
Листинг10 дизассемблерный листинг простейшей 64-битной программы
битный файл — первый полет
реакция 32-битной Windows на попытку запуска 64-битного PE-файла
Листинг12 дизассемблерный листинг 64-битного приложения "hello, world!"
дизассемблирование 64-битного PE-файла 32-битной версий IDA Pro
Листинг13 дизассемблерный листинг 32-битного приложения "hello, world!"
Листинг14 64-битное приложение "hello, world" под Windows на MASM'е
Заключение
-
Ассемблер - экстремальная оптимизация
Апеллируя к житейской мудрости пса Фафика, пришедшего к выводу, что есть колбасу, иметь колбасу и пахнуть колбасой— это три большие разницы, мы можем сказать: изучать ассемблер, программировать на ассемблере и хвастаться знаниями ассемблера — совсем не одно и тоже!
Готовые функции на блюдечке
некоторые программисты
Листинг1 запуск процесса на выполнение через win32 API – 12 команд и 73h байта
Листинг2 запуск процесса на выполнение
кто-то предпочитает
Листинг3 запуск процесса на выполнение
настоящие программисты
Врезка вызов API-функций из ассемблерный вставок
Листинг 5 "логичный", но неправильный способ вызова API-функций
Листинг6 дизассемблер показываем
дизассемблер IDA Pro – мощное средство выявления ошибок в программах
Листинг7 "не логичный", но правильный способ вызова API-функций
Листинг8 косвенный вызов функции CreateProcess с явным заданием суффикса W
Листинг9 а вот его дизассемблерный листинг — вызывается именно та функция, которая была указана
Листинг10 косвенный вызов функции
Листинг11 компилятор выбрал ASCII-вариант, что соответствует его настройкам по умолчанию
Листинг12 косвенный вызов статически линкуемых функций приводит к краху
Выделение памяти на стеке
Листинг 13 трюкаческий пример
в отладчике хорошо видно
в отладчике хорошо видно
Листинг16 трюкаческий пример, портированный на 286+ процессоры
Листинг17 пример программы на
Листинг18 при выделении большого
Все аргументы в одном месте
Листинг 19 демонстрация передачи аргументов cdecl-функциям через однократно выделяемый блок памяти
Заключение
-
Ассемблер и Win32
Программирование на ассемблере под Win32 воспринимается весьма не однозначно. Считается, что написание приложений слишком сложно для применения ассемблера. Собственно обсуждению того насколько оправдана такая точка зрения и посвящена данная статья. Она не ставит своей целью обучение программированию под Win32 или обучение ассемблеру
Пример 1. Программа работы с диалогом
Краткие комментарии к программе
Пример 2. Динамическая библиотека
Краткие комментарии к динамической библиотеке
Пример 3. Оконное приложение
Комментарии к программе
Макроопределения
Пример макроопределений
Комментарии к макроопределениям
Приложение 1. Файлы, необходимые для первого примера
Приложение 2. Файлы, необходимые для второго примера
Приложение 3. Файлы, необходимые для третьего примера
-
Ассемблер и программирование для IBM PC
Написание ассемблерных программ требует знаний организа ции всей системы компьютера. В основе компьютера лежат понятия бита и байта. Они являются тем средством, благодаря которым в компьютерной памяти представлены данные и команды. Программа в машинном коде состоит из различных сигментов для определения данных, для машинных команд и для сигмента, названного стеком, для хранения адресов. Для выполнения ариф метических действий, пересылки данных и адресации компьютер имеет ряд регистров. Данная глава содержит весь необходимый материал по этим элэментам компьютера, так что вы сможете продвинутся к главе 2 к вашей первой программе на машинном языке.
ГЛАВА 2. Выполнение программ
ГЛАВА 3. Требования языка ассемблер
ГЛАВА 4. Ассемблирование и выполнение программ
ГЛАВА 5. Определение Данных
ГЛАВА 6. Программы в COM-файлах
ГЛАВА 7. Логика и Организация Программы
ГЛАВА 8. Экранные операции I: Основные свойства
ГЛАВА 9. Экранные операции II: Расширенные возможности
ГЛАВА 10. Экранные операции III: Цвет и графика
ГЛАВА 11. Команды обработки строк
ГЛАВА 12. Арифметические операции I: Обработка двоичных данных
ГЛАВА 13. Арифметические операции II:
ГЛАВА 14. Обработка таблиц
ГЛАВА 15. Дисковая память I: Организация
Ассемблер и программирование для IBM PC
ГЛАВА 16. Дисковая память II: Функции базовой версиии DOS
ГЛАВА 17. Дисковая память III: Расширенные функции DOS
ГЛАВА 18. Дисковая память IV: Функции BIOS
ГЛАВА 19. ПЕЧАТЬ
ГЛАВА 20. Макросредства
ГЛАВА 20. Макросредства - 12
ГЛАВА 21. Компановка программ
ГЛАВА 22. Программный загрузчик
ГЛАВА 23. Прерывания BIOS и DOS
-
Ассемблер — это просто хадкорный ассемблер
Хакер, не знающий ассемблера, все равно, что гребец без весла. На языках высокого уровня далеко не уплывешь. Чтобы взломать приложение, исходные тексты которого недоступны (а в подавляющем большинстве случаев дело обстоит именно так), необходимо проанализировать его алгоритм, растворенный в абракадабре машинного кода
Ассемблер— это не только ценный мех
Философия ассемблера
Объяснение ассемблера на сишных примерах
Ассемблерные вставки как тестовый стенд
О планах на будущее
Врезка. инструментарий
-
АССЕМБЛЕР. Компоновщик. Загрузчик. Макрогенератор
Сначала будем предполагать, что транслируемая программа состоит только из одного модуля, т.е. в ней нет внешних и общих имен, а позже (в 1.5) рассмотрим, какие изменения надо внести в работу ассемблера, чтобы учесть особенности многомодульных программ. Отметим также, что ассемблер работает после макрогенератора
Основная идея ассемблирования.
Проблема ссылок вперед. Два прохода ассемблера.
ТАБЛИЦЫ АССЕМБЛЕРА.
Таблица директив.
Таблица мнемокодов.
Таблица имен (ТИ).
Таблица сегментов (ТС).
Таблица распределения сегментных регистров (ТРСР).
ПЕРВЫЙ ПРОХОД АССЕМБЛЕРА.
ASSUME: ASSUME S2:DATA, CS:S3, SS:S1
Особые случаи на первом проходе.
ВТОРОЙ ПРОХОД АССЕМБЛЕРА.
GMENT: S2 SEGMENT 'DATA'
ASSUME: ASSUME DS:S2, CS:S3, SS:S1
КОМПОНОВЩИК
Основные задачи компоновщика.
Объединение модулей.
Редактирование межмодульных связей
Построение заголовка загрузочного модуля.
ЗАГРУЗЧИК.
Загрузка программы.
Настройка программы на место.
Запуск программы на счет.
МАКРОГЕНЕРАТОР.
Обработка макроопределений.
Обработка макрокоманд.
ОБРАБОТКА БЛОКОВ ПОВТОРЕНИЯ.
ОБРАБОТКА IF-БЛОКОВ.
-
Ассемблерные головоломки или может ли машина понимать естественный язык
Всякая письменность начинается с алфавита. Для кодирования в "текстовой" форме мы должны отчетливо представлять структуру машинной команды со всеми полями, префиксами и прочими превратностями судьбы, которые ее окружают. В этом нам поможет электронный справочник TECH HELP, который в частности можно найти на многих хакерских сайтах
Алфавит
внешний вид электронного помощника TECH HELP!
Матрица команд
Таблица2 однобайтовые команды первой группы
Таблица3 двух и трех байтовые команды второй группы
Листинг1 дизассемблерный листинг "HELLO,WORLD!$" с моими комментариями
Извращения начинаются
Листинг 2 ассемблерная программа
Листинг3 подготовка регистра AH в работе (предварительный вариант)
Листинг4 подготовка регистра AH в работе (окончательный вариант)
проверка работоспособности фрагменты программы под отладчиком
Листинг 5подготовка регистра AH в работе (улучшенный вариант)
Листинг6 формирование инструкции INT 21h с помощью самомодифицирующегося кода
Заключение
-
Ассемблерные извращения - натягиваем стек
Довольно расточительное (в плане процессорных тактов) решение, особенно если функция вызывается многократно. При этом операнды команды PUSH перегоняются из секции .text (находящейся в кодовой кэш-памяти первого уровня) в область стека, находящейся в кэш-памяти данных.
Турбопередача стековых аргументов
Листинг 1 классический способ передачи стековых аргументов
Листинг2 оптимизированный способ передачи аргументов
Листинг3 дизассемблерный листинг оптимизированного варианта передачи аргументов
передача стековых аргументов напрямую без их фактической засылки в стек
Листинг4 вызов функции с предопределенным адресом возврата командой JMP
Повторное использование кадра стека
Листинг 5 вызов функции с заранее подготовленными аргументами и локальными переменными
Защита адреса возврата от переполнения
Листинг 6 передача и использование аргументов при раздельных стеках
реакция soft-ice на
-
Ассемблирование без секретов
Свою программистскую карьеру мыщъх начинал с микрокомпьютера "Правец-8D", оснащенного довольно экзотической версией Бейсика и нехилым руководством с кучей конкретных примеров (правда, на болгарском языке). Процесс освоения буржуинской техники происходил приблизительно так. Набрал программу. Запустил. Помедитировал над листингом. Попробовал что-нибудь изменить. Запустил. Посмотрел на реакцию. Осмыслил. Что-то еще изменил. И вот так, шаг за шагом мыщъх разобрался во всех операторах языка и научился писать эффективные программы, в которых нет ничего лишнего.
Лицо асматика в ASCII
памятный блокнот с записями начинающего асматика
Зоопарк ассемблеров
Зоопарк ассемблеров - 2
Определение целевой платформы
Метод ассемблерных вставок
Листинг 1 классический пример
Листинг2 законченная программа anti-debug.c
anti-debug.exe без отладчика
anti-debug.exe под отладчиком
Листинг3 ассемблерный фрагмент
Листинг4 программа hello_global.c, с "глобализацией" ассемблерных перемнных
окно, созданное ассемблерной вставкой
Листинг5 программа hello_local.c с "локализацией" ассемблерных переменных
MASM, TASM и FASM
Листинг 6 пример простейшей программы hello.c которую мы собираемся ассемблировать всю целиком
Листинг7 линковка не удалась
hex-редактор показывает истинное лицо MessageBoxA
Листинг8 ассемблерная программа подготовленная к трансляции MASM'ом
Листинг9 ассемблирование программ на TASM'е
Листинг10 программа hello.asm портированная в FASM
Заключение
-
Война миров - ассемблер против си
Любовь хакеров к ассемблеру вполне понятна и объяснима. Разве не заманчиво знать язык, которым владеют немногие? Ассемблер окружен мистическим ареалом — это символ причастности к хакерским кругам, своеобразный пропуск в клан системных программистов, вирусописателей и взломщиков
Эффективность кодогенерации си компиляторов
Листинг 1 ключевой фрагмент демонстрационной программы CRC.c
Листинг2 результат трансляции crc() компилятором MS VC++ 6.0
Листинг3 ручная ассемблерная реализация crc()
набор ассемблерной программы в редакторе TSE Pro
Листинг4 результат трансляции crc() компилятором GCC 2.95
IDA Pro за работой
Листинг5 результат трансляции crc() компилятором GCC 3.4.2
влияние кратности разворота цикла на производительность на различных типах процессоров
Листинг6 оптимизированный вариант crc() с развернутым циклом
Листинг7 пример неправильного разворота цикла
Заключение
-
Программирование на Ассемблере
В настоящее время нет языка, полностью удовлетворяющего этим свойствам. Всем требованиям, кроме последнего, удовлетворяет машинный язык и близкий к нему язык Ассемблера. Последнему требованию удовлетворяют языки высокого уровня, но они не удовлетворяют первым трем требованиям, поэтому при создании системных программ используют и язык Ассемблер и язык высокого уровня (язык С, С++). И, хотя для систем, поддерживающих работу с процессорами разных типов, например, WINDOWS NT, драйверы пишутся на языке высокого уровня, значимость ассемблера не падает, так как знание принципов выполнения команд и их хранение в памяти помогает писать «хорошие» программы на любом языке.
Цель курса.
Характеристика языков системного программирования
История развития ассемблера. Характеристика машинного языка
Структура 4-х адресной команды
Структура 2-х адресной команды
Структура 1 адресной команды.
Структура безадресных команд
Сравнительный анализ команд с различной адресностью для современных процессоров
Пример программирования в машинных кодах.
Система команд
Распределение памяти
Программа вычисления
Характеристика языков ассемблерного типа
Пример программы на ассемблере для 16 битного приложения (DOS приложение)
Пример программы на ассемблере для 32 - битного приложения
ВВЕДЕНИЕ В АРХИТЕКТУРУ INTEL ПРОЦЕССОРОВ
Арифметико-логический блок
Прогнозирование переходов
Память
Регистровая память.
Кэш память
Блок с плавающей точкой
Особенности MMX процессоров
Перспективы разработки процессоров
Классификация простейших конструкций
Константы
Целые двоичные данные
Целые десятичные числа
Константы с плавающей точкой
Символьные и строковые константы
Однобайтовая кодировка
Двухбайтовая кодировка
Идентификаторы
Адреса
Внутреннее представление адреса для реального режима
Внутреннее представление адреса для защищенного режима
Внешнее представление адресов.
Выражения
Классификация операторов
Директивы для определения констант
Директива EQU
Директива =
Директивы выделения памяти
Классификация команд
Команда MOV
Использование данных разной длины
Команды обмена
Команды пересылки для работы с адресами
Использование команды lea для арифметических вычислений
Особенности команд пересылки для работы со стеком
Использование команд mov
Использование специальных команд
Классификация арифметических команд
Правила использования арифметических команд
Основные арифметические команды
Специальные команды
Организация вычислений с многократной точностью
Дополнительные арифметические команды
Команды безусловного перехода
Коды условий
Команды условного перехода
Специальные команды
Организация вложенных циклов
Монотонное изменение индекса
Немонотонное изменение параметра цикла
Использование команд для работы с блоками
Задание двухмерного массива
Монотонное изменение индекса
Метод связанных индексов
Метод связанных индексов - 2
Использование 2-х мерного массива при немонотонном изменении индекса
Многомерные массивы
Использование метода связных индексов для многомерных массивов
Использование метода приведенных индексов для многомерных массивов
Структуры
Задание типа структуры
Выделение памяти под структуру
Инициализация полей структуры
Особенности инициализации строк и массивов
Обращение к полям структуры
Объединения
Особенности инициализации полей объединения
Перечисления
Основные команды для работы с битами
Классификация команд
Кодировка команд сдвига
Общий вид команд сдвига
Примеры использования команд сдвига.
Дополнительные команды
Группа команд: проверить и изменить
Команды длинного сдвига
Определение типа битовой структуры
Выделение памяти под битовую структуру
Особенности использования битовых структур
Пример использования битовой структуры
Типы программ
Одномодульные программы
Использование функций
Классификация параметров. Способы передачи параметров процедурам
Передача параметров через регистры
Передача параметров через общую область памяти
Передача в списке параметров простых переменных
Передача в списке параметров одномерных массивов
Передача в списке параметров многомерных массивов
Передача в списке параметров структур
Передача в списке параметров функций
Составление функций с переменным списком параметров
Составление рекурсивных функций на ассемблере
Особенности использования внешних функций
Использование общих областей памяти
Реентерабельное программирование
Использование локальных областей памяти
Особенности использования команд ENTER и LEAVE
Директива ARG
Директива LOCAL
Стыковка с языками высокого уровня
Вставка в Си команд на ассемблере
Использование отдельных функций на ассемблере
Использование отдельных функций на ассемблере - 2
Особенности создания функций для включения их в DLL
Особенности использования ассемблерных функций в качестве функций – членов классов
Недостатки функций
Макросы
Простейшие макросы
Основные определения
Макроопределение (м/о)
Макрокоманда (м/к)
Макрорасширение (м/р)
Правила записи параметров
Определение внутренних меток
Использование фактических параметров со специальными знаками
Вложенные и рекурсивные макросы
Обзор средств условной трансляции
Директивы условной трансляции
Формирование сообщений об ошибках
Безусловное повторение
Директива IRP
Директива IRPC
Директива WHILE
Обзор средств ввода-вывода
Программирование на Ассемблере
Обработка ошибок с помощью функции GetLastError
Составление пользовательских функций со стандартной обработкой ошибок
Обзор системных вызовов для организации ввода-вывода
Функции ввода-вывода для стандартных устройств
Функция MessageBox
Функции и константы для работы с консолью
Ввод/вывод числовых данных
Обзор функций WINDOWS API для работы с файлами
Дополнительные функции для работы с файлами
Удаление файлов
Копирование или перемещение файлов
Блокирование участков файлов
Функции для поиска файлов
Функция FindFirstFile
Функция FindNextFile
Функция FindClose
Создание временных файлов
Позиционирование файла
ОСОБЕННОСТИ ПРОГРАММИРОВАНИЯ ДЛЯ MMX
Особенности процессоров с MMX технологией с точки зрения программиста
Обзор команд для MMX
Арифметические команды
Команды сравнения
Команды преобразования
Логические крманды
Команды сдвига
Команды пересылки
Управление режимами работы процессора
Использование команд MMX в приложениях
Особенности использования режима MMX для многозадачных OS
Операционные системы, сохраняющие состояние MMX/FPU
Отладка программ с MMX командами
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
-
Программирование на Ассемблере под DOS
Когда-то автор этого текста хотел осветить все вопросы низкоуровневого программирования, начиная от процессора 8086 до p3, от DOS'а до W2000 и линуха. Однако практика показала, что при таких черепашьих темпах написания... к тому времени когда дойдет очередь хотя бы до w3.11 - windows-2000 уже станет вчерашним днем
Задача 2.
Задача 3.
Задача 4.
Задача 5
Задача 6
Несколько "тупых" процедурок
Задача 2.
Задача 3.
Задача 4.
Задача 5.
Задача 6.
Печать "шестнадцатеричных циферек"
Задача 2.
Задача 3.
Задача 4.
Задача 5.
Задача 6.
Задача 7.
Задача 8.
Печать десятичных циферек
Задача 2.
Задача 3.
Задача 4.
Hello, world! или Изврат-2
Задача 2.
Задача 2. - 2
Задача 3.
Диагноз
-
Разное IDE для больших проектов на ассемблере
Итак, сначала небольшое введение, посвященное тому, зачем мне (в частности) вообще нужно IDE. Дело в том, что наличие IDE практически необязательно для проектов с небольшим размером. Под проектами с небольшим размером я подразумеваю проекты с количеством строк, меньшим 1000. Как правило такая программа состоит из одного файла
Требования в IDE
Некоторые примеры IDE
Заключение
-
Секреты ассемблирования дизассемблерных листингов
Обычно дизассемблер используется для реконструкции алгоритма подопытной программы, который после этого переписывается на Си/Си++ или в двоичном файле правится тот нехороший jx, который не дает приложению работать, если не найден ключевой файл или демонстрационный период давно истек
Первое боевое крещение
Листинг 1 исходный текст программы demo_comsole.c
успешно дизассемблированный файл
ассемблеры, поддерживаемые IDA Pro 4.7 (слева), и IDA Pro 5.0 (справа)
результат непосредственной трансляции дизассемблерного листинга
критическая ошибка при попытке ассемблирования листинга, сгенерированного IDA Pro
Листинг2 транслятор не может найти имена библиотечных функций в листинге
Листинг3 сколлапсированные функции остаются сколлапсированными и в ассемблерном листинге!
Листинг4 реакция транслятора на отсутствие объявления структур
Листинг5 сколлапсированные структуры в ассемблерном файле
Листинг6 транслятор по прежнему не может определить развернутые структуры
Листинг7 камень преткновения всех структур
трансляция ассемблерного листинга в режиме совместимости с MASM 5.1
Листинг8 здесь возникает ошибка типа "отсутствующий оператор"
автоматическая замена всех "large fs" на "fs" в FAR'e
Листинг9 перечень ошибок, выявленных ассемблером при очередном сеансе трансляции
Листинг10 очередная обитель зла на подступах к успешной трансляции
Листинг11 "потерянные метки" легко обнаруживаются контекстным поиском
Листинг12 IDA Pro поместила обращения
Листинг13 исправленный вариант, позволяющий транслятору обнаружить "недостающие метки"
Листинг14 список ошибок, обнаруженных
Листинг15 оригинальный код, сгенерированный IDA Pro, который не хочет транслироваться
Листинг16 исправленный вариант
Листинг17 IDA Pro сгенерировала неработоспособный листинг для парной функции strcpy/strcat
Листинг18 дважды определенный символ Locale
Заключение
-
Справка по Ассемблеру для AVR
Компилятор транслирует исходные коды с языка ассемблера в объектный код. Полученный объектный код можно использовать в симуляторе ATMEL AVR Studio, либо в эмуляторе ATMEL AVR In-Circuit Emulator. Компилятор также генерирует код, который может быть непосредственно запрограммирован в микроконтроллеры AVR
Исходные коды
Примеры:
Инструкции процессоров AVR
Арифметические и логические инструкции
Инструкции ветвления
Инструкции передачи данных
Инструкции работы с битами
Директивы ассемблера
BYTE - Зарезервировать байты в ОЗУ
CSEG - Программный сегмент
DB - Определить байты во флэш или EEPROM
DEF - Назначить регистру символическое имя
DEVICE - Определить устройство для которого компилируется программа
DSEG - Сегмент данных
DW - Определить слова во флэш или EEPROM
ENDMACRO - Конец макроса
EQU - Установить постоянное выражение
ESEG - Сегмент EEPROM
EXIT - Выйти из файла
INCLUDE - Вложить другой файл
LIST - Включить генерацию листинга
LISTMAC - Включить разворачивание макросов в листинге
MACRO - Начало макроса
NOLIST - Выключить генерацию листинга
ORG - Установить положение в сегменте
SET - Установить переменный символический эквивалент выражения
Выражения
Операнды
Операторы
Логическое отрицание
Побитное отрицание
Минус
Умножение
Деление
Суммирование
Вычитание
Сдвиг влево
Сдвиг вправо
Меньше чем
Меньше или равно
Больше чем
Больше или равно
Равно
Не равно
Побитное И
Побитное исключающее ИЛИ
Побитное ИЛИ
Логическое И
Логическое ИЛИ
Функции
Использование программы
Открытие файлов
Сообщения об ошибках
Опции
-
Справочник по Ассемблеру
Это ассемблеpная диpектива, говоpящая ассемблеpу использовать набоp опеpаций для пpоцессоpа 80386. Вы также можете использовать .486, .586, но самый безопасный выбоp - именно .386. Также есть два пpактически идентичных выбоpа для каждого ваpианта CPU. .386/.386p, .486/.486p. Эти "p"-веpсии необходимы только когда ваша пpогpамма использует пpивилигиpованные инстpукции
-
Справочник по языку Ассемблера IBM PC
Интересно проследить, начиная со времени появления первых компьютеров и заканчивая сегодняшним днем, за трансформациями представлений о языке ассемблера у программистов.
Когда-то ассемблер был языком, без знания которого нельзя было заставить компьютер сделать что-либо полезное. Постепенно ситуация менялась. Появлялись более удобные средства общения с компьютером. Но, в отличие от других языков, ассемблер не умирал, более того он не мог сделать этого в принципе. Почему? В поисках ответа попытаемся понять, что такое язык ассемблера вообще.
Если коротко, то язык ассемблера — это символическое представление машинного языка.
Все процессы в машине на самом низком, аппаратном уровне приводятся в действие только командами (инструкциями) машинного языка. Отсюда понятно, что, несмотря на общее название, язык ассемблера для каждого типа компьютера свой. Это касается и внешнего вида программ, написанных на ассемблере, и идей, отражением которых этот язык является.
О книге
Урок 2. Архитектура персонального компьютера
Урок 4. Создание программы на ассемблере
Урок 5. Структура программы на ассемблере
Урок 13. Макросредства языка ассемблера
Урок 14. Модульное программирование
Урок 15. Прерывания
Урок 16. Защищенный режим работы микропроцессора
Урок 17. Обработка прерываний в защищенном режиме
Author
Микропроцессоров Intel
Порядок описания команд будет следующим:
Для описания команд приняты обозначения:
AAA
AAD
AAM
AAS
ADC
ADD
AND
BOUND
BSF
BSR
BSWAP
BT
BTC
BTR
BTS
CALL
CBW/CWDE
CLC
CLD
CLI
CMC
CMP
CMPS/CMPSB/CMPSW/CMPSD
CMPXCHG
CWD
CDQ
DAA
DAS
DEC
DIV
ENTER
HLT
IDIV
IMUL
IN
INC
INS/INSB/INSW/INSD
INT
INTO
IRET/IRETD
JCC JCXZ/JECXZ
JMP
LAHF
LDS/LES/LFS/LGS/LSS
LEA
LEAVE
LGDT
LIDT
LODS/LODSB/LODSW/LODSD
LOOP
LOOPE/LOOPZ LOOPNE/LOOPNZ
MOV
MOVS/MOVSB/MOVSW/MOVSD
MOVSX
MOVZX
MUL
NEG
NOP
NOT
OR
OUT
OUTS/OUTSB/OUTSW/OUTSD
POP
POPA
POPAD
POPF
POPFD
PUSH
PUSHA
PUSHAD
PUSHF
PUSHFD
RCL
RCR
REP/REPE/REPZ/REPNE/REPNZ
RET/RETF
ROL
ROR
SAHF
SAL
SAR
SBB
SCAS/SCASB/SCASW/SCASD
SETcc
SGDT
SIDT
SHL
SHLD
SHR
SHRD
STC
STD
STI
STOS/STOSB/STOSW/STOSD
SUB
TEST
XADD
XCHG
XLAT/XLATB
XOR
Программная модель микропроцессора
Пользовательские регистры
Регистры общего назначения
Сегментные регистры
Регистры состояния и управления
Системные регистры микропроцессора
Регистры управления
Регистры системных адресов
Регистры отладки
Типы данных
Массивы
Описание и инициализация массива в программе
Доступ к элементам массива
Двухмерные массивы
Типовые операции с массивами
Структуры
Описание шаблона структуры
Определение данных с типом структуры
Методы работы со структурой
Объединения
Записи
Описание записи
Определение экземпляра записи
Работа с записями
Записи: дополнительные возможности обработки
Справочник по языку Ассемблера IBM PC
Структура машинной команды
Способы задания операндов команды
Прямая адресация
Косвенная базовая (регистровая) адресация
Косвенная базовая (регистровая) адресация со смещением
Косвенная индексная адресация со смещением
Косвенная базовая индексная адресация
Косвенная базовая индексная адресация со смещением
Справочник по языку Ассемблера IBM PC
Обзор группы арифметических команд и данных
Целые двоичные числа
Десятичные числа
Арифметические операции над целыми двоичными числами
Сложение двоичных чисел без знака
Сложение двоичных чисел со знаком
Пример 1.
Пример 2.
Пример 3.
Пример 4.
Вычитание двоичных чисел без знака
Пример 5.
Пример 6.
Вычитание двоичных чисел со знаком
Пример 7.
Пример 8.
Вычитание и сложение операндов большой размерности
Умножение чисел без знака
Умножение чисел со знаком
Деление чисел без знака
Деление чисел со знаком
Вспомогательные команды для целочисленных операций
Команды преобразования типов
Другие полезные команды
Арифметические операции над двоично-десятичными числами
Пример 9.
Пример 10.
Пример 10. - 2
Вычитание неупакованных BCD-чисел
Пример 11.
Пример 12.
Умножение неупакованных BCD-чисел
Деление неупакованных BCD-чисел
Арифметические действия над упакованными BCD-числами
Сложение упакованных BCD-чисел
Пример 13.
Вычитание упакованных BCD-чисел
Пример 14.
Справочник по языку Ассемблера IBM PC
Логические команды
Логические данные
Логические команды
Команды сдвига
Команды линейного сдвига
Команды циклического сдвига
Дополнительные команды сдвига
Справочник по языку Ассемблера IBM PC
Команды передачи управления
Безусловные переходы
Команда безусловного перехода jmp
Процедуры
Условные переходы
Команда сравнения cmp
Команды условного перехода и флаги
Команды условного перехода и регистр ecx/cx
Организация циклов
Справочник по языку Ассемблера IBM PC
Цепочечные команды
Операция пересылки цепочек
Команда movs:
Операция сравнения цепочек
Команда cmps
Операция сканирования цепочек
Команда scas
Загрузка элемента цепочки в аккумулятор
Команда lods
Перенос элемента из аккумулятора в цепочку
Команда stos
Ввод элемента цепочки из порта ввода-вывода
Вывод элемента цепочки в порт ввода-вывода
Справочник по языку Ассемблера IBM PC
Директивы управления листингом
Общие директивы управления листингом
Директивы вывода текста включаемых файлов
Директивы вывода блоков условного ассемблирования
Директивы вывода макрорасширений
Директивы вывода листинга перекрестных ссылок
Директивы изменения формата листинга
Сообщения об ошибках
Сообщения о фатальных ошибках
Макросредства языка ассемблера
Псевдооператоры equ и =
Макрокоманды
Макродирективы
Директивы WHILE и REPT
Директива IRP
Директива IRPC
Директивы условной компиляции
Директивы компиляции по условию
Директивы IF и IFE
Директивы IFDEF и IFNDEF
Директивы IFB и IFNB
Директивы IFIDN, IFIDNI, IFDIF и IFDIFI
Вложенность директив условной трансляции
Директивы генерации ошибок
Безусловная генерация пользовательской ошибки
Условная генерация пользовательской ошибки
Директивы .ERRB (ERRIFB) и .ERRNB (ERRIFNB)
Директивы .ERRDEF (ERRIFDEF) и .ERRNDEF (ERRIFNDEF)
Директивы .ERRDIF (ERRIFDIF) и .ERRIDN (ERRIFIDN)
Директивы .ERRE (ERRIFE) и .ERRNZ (ERRIF)
Константные выражения в условных директивах
Дополнительное управление трансляцией
Опции транслятора TASM и редактора связей TLINK
Опции транслятора TASM
Опции компоновщика (редактора связей) TLINK
Структура программы на ассемблере
Синтаксис ассемблера
Директивы сегментации
-
Сравнение ассемблерных трансляторов
Писать о культовых проектах, не затронув чувства верующих и сохранив при этом здоровую долю скептицизма и объективизма не так-то просто, особенно если ты сам являешься апологетом веры, за которую готов если не отдать жизнь, то уж точно порвать любого критика на куски, а потом прихлопнуть дампам памяти или своп файлом
Основополагающие критерии
MASM
TASM
FASM
NASM
YASM
Заключение
Врезка сводные характеристики разных ассемблеров
Врезка ссылки на упомянутые продукты
-
Obj файлы на топчане или...
Освежая в памяти события давно минувших дней (уже листья успели облететь за это время), напомним, что исправив кучу багофичей IDA Pro (перечисление которых заняло бы слишком много места) мы дошли до файла demo_3.asm, который нас удалось ассемблировать MASM'ом
Битва за API
Колдование макроса
Непонятки с ___imp_RtlUnwind
Линковка
Запуск файла или отложенное заключение
Врезка "не ассемблируется aam 16"
-
Эльфы большие и маленькие
Классические трансляторы ассемблера (такие, например, как GAS – GNU Assembler) придерживается AT&T синтаксиса, совершенно несовместимого с "официальным" x86 синтаксисом, декларируемым самой фирмой Intel (достаточно сказать, что порядок операндов поменялся местами и всюду торчат эти жуткие суффиксы и префиксы #, $,%, l и проч. дребедень)
Врезка кто есть где
Таблица 1 версии программных продуктов, используемые в статье
Программирование с libc— семейная идиллия
Листинг1 простейшая ассемблерная программа elf_libc.S
Листинг2 сборка нашей первой программы
Листинг3 обрезание символьной информации
Листинг4 "ручная" сборка
реакция Linux'а на попытку ручкой сборки по типу BSD
Листинг5 "полуручная", "полуавтоматическая" сборка
Отладка ассемблерных программ— ночной кошмар
отладка ассемблерной программы без символьной информации
Листинг6 автоматическая сборка ассемблерной программы с отладочной информацией под Linux
отладка ассемблерной программы на уровне исходных текстов
Листинг7 ручная сборка ассемблерной программы с отладочной информацией под Linux и BSD
Программирование без libc— штурм ядра
Листинг8 макет программы, определяющей номера системных вызовов в Linux и BSD
Листинг9 ассемблерная программа
Листинг10 ручная сборка файла elf_80h.S под Linux и BSD
Листинг11 запуск файла elf_80h под BSD в режиме эмуляции
Конструирование elf'а своими руками
внутри elf-файла находится просто море пустоты
Листинг12 ассемблерный файл elf_tiny.asm, сконструированный голыми руками
Листинг13 ручная сборка и запуск файла elf_tiny.asm под Linux
Экстремальная оптимизация или гонка на виражах
Листинг 14 оптимизированный файл elf_tinix.asm с перекрывающимися заголовками
BSD 4.5 не поддерживает elf-файлы с перекрывающимися заголовками
Листинг15 фрагмент файла elf_tinyh.asm, оптимизированного Юрием Хароном
Врезка график похудания elf-файла
Заключение
-
Ассемблер для Windows
Прежде всего, как и полагается в предисловии, отвечу на возможное замечание: зачем нужен ассемблер в Windows, если есть, например, Си и другие языки. Зачем нужен ассемблер, я уже писал в упомянутой выше книге. Позволю себе процитировать ее: "Зачем нужен язык ассемблера? - спросят меня. Самой простой и убедительный ответ на поставленный вопрос такой - затем, что это язык процессора и, следовательно, он будет нужен до тех пор, пока будут существовать процессоры. Более пространный ответ на данный вопрос содержал бы в себе рассуждение о том, что ассемблер может понадобиться для оптимизации кода программ, написания драйверов, трансляторов, программирования некоторых внешних устройств и т.д. Для себя я, однако, имею и другой ответ: программирование на ассемблере дает ощущение власти над компьютером, а жажда власти - один из сильнейших инстинктов человека".
Предисловие
Часть I Основы битного программирования в Windows
Вводная информация
Схема трансляции ассемблерного
"Ничего не делающая" программа
Пример использование директивы INCLUDE
Перейдем теперь к вопросу о подсоединении других объектных модулей
Модуль PROG ASM процедура которого PROC будет вызываться из основного модуля
Модуль PROG ASM с вызовам процедуры из модуля PROG ASM
Обратимся теперь к директиве INVOKE
Пример использования оператора INVOKE
Вопрос об использовании данных
Модуль содержащий переменную ALT которая используется в другом модуле (PROG ASM)
Модуль использующий переменную ALT определенную в другом модуле (PROG ASM)
Объединение модулей
Пример программы использующей упрощенную сегментацию
Краткий обзор ряда других программ
Редакторы
Отладчики
Дизассемблеры
Пример дизассемблированш программы
Компиляторы ресурсов
Редакторы ресурсов
Глава Основы программирования в операционной системе Windows
Int MessageBox
Регистрация класса окон
Создание окна
Цикл обработки очереди сообщений
Процедура главного окна
"Скелет" оконной
Приступим теперь к разбору конкретных примеров
Простой пример программы для Windows (MASM)
После разбора программы
Простой пример программы для Windows (TASM)
Вопрос о передачи параметров через стек
Схема передачи параметров в процедуру
Глава Примеры простых программ на языке ассемблера
Свойства конкретного окна
Приступаем к разбору следующего примера
Второй пример касается использования окна редактирования
Пример окна со строкой редактирования
Работа программы со строкой редактирования (Программа на Рисунок ) IV
Экскурс в битное программирование
Пример битного приложения
Глава Ассемблеры MASM и TASM
Программа ML EXE
Программа LINK EXE( bit)
Программа TLINK EXE
Включение в исполняемый файл отладочной информации
Получение консольных и GUI приложений
Окно TD EXE с отлаживаемой программой
Автоматическая компоновка
Примеры простейших программ
Часть II Более подробное описание программирования в среде Windows
Глава Примеры простейших программ
Если вы только начинаете программировать под Windows
Пример простейшей программы с текстом
Текстовая строка все время в середине окна
Рассмотрим теперь вопрос о том как выводить текстовую информацию
Фрагмент программы выводящей текст с заданным шрифтом (см Рисунок )
Процедура копирования одной
Этот раздел главы посвящается графике
Простая программа для демонстрации графики
Результат работы программы на Рисунок
Рассмотрим несколько простых консольных функций
Данный раздел будет поевящен обработке команд мыши и клавиатуры
Таймеры в консольном приложении
Глава Понятие ресурса Редакторы и трансляторы ресурсов
В данном разделе мы займемся изучением языка ресурсов
Меню
Акселераторы
Трансляция при помощи пакета TASM
Глава Примеры программ использующих ресурсы
Пример простейших манипуляций с меню
Пример манипуляции с меню
Итак продолжим рассматривать ресурсы
Пример использования горячих клавиш с диалоговым окном
Данный раздел посвящен диалоговому окну с двумя списками
Пример программы с двумя списками
Глава Управление файлами
Битная FAT Характеристики файлов
Атрибут файла
Файл имеет три временные характеристики
Длина файла
Кроме указанных характеристик
Поиск файлов
Пример простой программы которая осуществляет поиск файлов и выводит их название на экран
Пример программы которая осуществляет рекурсивный поиск по дереву каталогов
Трансляция программы в TASM
Приемы работы с двоичными файлами*
Вывод на консоль содержимого текстового файла Первый способ
Вывод на консоль содержимого текстового фаша Второй способ
Пример обработки текстового файла
Глава Макросредства ассемблера и программирование в Windows
Большая часть данной главы будет носить справочный характер
Метки
Структура
Условное ассемблирование
Вызов процедур
Макроповторения
Макроопределения
Некоторые другие директивы транслятора ассемблера
Конструкции времени исполнения программы
Сейчас мы рассмотрим вопрос о написании программ
Пример использования условного ассемблирования для написания совместимой программы
Структура исполняемых модулей
Отладка анализ кода программ драйверы
Структура исполняемых модулей
Структура ЕХЕпрограммы для MS DOS
Общая структура РЕмодуля
Общая структура РЕзаголовка
Фрагмент РЕзаголовка
Описание заголовка РЕ
Секция экспорта ( edata) Общая структура
Вызов импортируемой функции
Таблица директория импорта
Формат входа в каталог импорта
Локальная область данных цепочек (потоков)
Таблица разделов потоков
Секция ресурсов ( rdata)
Каталог ресурсов (Resource Directory Table)
Вход в таблицу ресурсов (Resource Entry Item)
Таблица настроек адресов
Структура элемента массива настроек
Отладочная информация ( debug$S debug$T)
Отладочный каталог
Глава Обзор отладчиков и дизассемблеров
EDITBIN EXE
DUMPBIN EXE
Часть дизассемблированиого
DUMPPE EXE
HIEW EXE
Внешний вид программы HIEW EXE
Дизассемблированный код программы на Рисунок
DEWIN EXE
IDA PRO
Пример дизассемблирования программы с помощью самого мощного дизассемблера IDA PRO (под Windows)
Часть программы содержащей данные дизассемблированная при помощи IDA PRO
Пример командного файла IDA PRO
Отладчик фирмы Borland
Запуск отлаживаемого приложения
Выполнить программу до строки где находится курсор
Выполнить единичную команду
Выполнение команды с переходом через процедуру
Выполнить процедуру
Выполнение с задержкой
Текст программы можно увидеть на экране
Если отладочную информацию в исполняемом модуле
Окно CPU отладчика Turbo Debugger
Окно слежения за переменными
Окно стека
Окно точек останова
Окно регистрации (Log)
Окно переменных
Окно файлов
Окно отображения памяти
Окно сопроцессора
Окно истории выполнения (Execution History)
Окно иерархии (Hierarchy)
Пример окна Turbo Debugger отображающего иерархию классов
Окно потоков
Окно сообщений
Окно буфера обмена
Поговорим теперь об отладке программ
Программа расположенная на Рисунок в окне отладчика
Пример простой консольной программы
Основной целью отладчика Turbo Debugger является отладка программы
Глава Описание работы с дизассемблером WDasm и отладчиком ICE
Программа WDasm
Начало работы
Внешний вид программы WDasm
Фрагмент дизассемблированного текста Передвижение по дизассемблированному тексту
Данные
Окно ссылок на строки
Импортированные и экспортированные функции
Ресурсы
Операции с текстом
Загрузка программ для отладки
Фрагмент списка импортированных модулей и функций
Первое информационное окно отладчика
Работа с динамическими библиотеками
Точки останова
Второе управляющее окно отладчика
Модификация кода данных и регистров
Окно модификации отлаживаемого кода
Поиск нужного места в программе
Окно модификации регистров и ячеек памяти Дополнительные возможности для работы с API
Отладчик SoftIce
Начальная установка
Загрузка программы для отладки
Вид загрузчика SoftIce (LOADER EXE) Окно настройки запуска модуля в отладчике Softice
Обзор команд отладчика
Основы анализа кода программ
Переменные и константы
Функция main консольного приложения
Окончательный вариант программы
Классические структуры языка Си
Условные конструкции
Оператор switch или оператор выбора
Циклы
Локальные переменные
Пример задания двух локальных массивов Взят из отладчика IDA PRO
Как выглядит фрагмент программы представленный на Рисунок в окне дизассемблера WDasm
Функции и процедуры
Оптимизация кода
Вот как выглядит ассемблерный код
Дизассемблированный текст программы (Рисунок ) Транслятор Borland C++
Скорость или объем
Оптимизация условных переходов
Оптимизация вызовов процедур
Объектное программирование
Программа на Си++ использующая объекты
Дизассемблированный код функции main с Рисунок Дизассемблер IDA PRO
Дизассемблированный код функции
Исправление исполняемых модулей
Allscreen программа
Окно появляющееся при запуске
Сообщение об истечении времени работы программы
Фрагмент кода осуществляющего в частности задержку
Фрагмент кода проверки количества запусков
Поиск процедуры окна
Будем искать функцию последнего
Начало функции окна
Структура и написание драйверов VXD
VxDдрайвер
Начнем с содержимого DEFфайла
Файл VXD DEF используемый для
Содержимое файла VXD MAP
Динамические виртуальные драйверы
Программа загружающая использующая и выгружающая динамический драйвер
Пример динамического драйвера
Структура содержащая значения
Примеры программ использующих таймер
Часть III Более сложные примеры программирования в Windows
Глава Примеры программ использующих таймер
Первый пример
Пример реализации простейшего таймера
Следующая программа несколько сложнее предыдущей
Пример использования двух таймеров
В данном разделе мы рассмотрим весьма интересный вопрос о всплывающих подсказках
Пример диалогового окна с всплывающими подсказками
Диалоговое окно с всплывающими подсказками
Глава Многозадачное программирование
Под процессом будем понимать объект
Пример создания процесса
Теперь пришла пора вплотную заняться потоками
Пример создания потока
Поговорим теперь о многопотоковой программе
Семафоры
События
Критические секции
Пример синхронизации двух потоков посредством критической секции
Взаимоисключения
Использование динамических библиотек
Иллюстрация понятия связывания
Перейдем теперь к разбору программных примеров динамических библиотек
Простейшая DLLбиблиотека
Вызов динамической библиотеки Явное связывание
Мы здесь рассмотрим только вызывающую программу
Вызов динамической библиотеки Неявное связывание
Текст динамической библиотеки и программы
Основной модуль и динамическая библиотека Передача параметров
З З Пример загрузки ресурса из динамической библиотеки
Рассмотрим теперь вопрос о том как используют динамическую библиотеку
Пример использования разделяемой памяти в динамической библиотеке
Глава Взаимодействие с ресурсами локальной сети
В прикладном программировании часто возникает вопрос определения сетевых устройств
Простой пример определения типа устройств
Результат работы программы
Программа осуществляющая соединение с сетевым ресурсам
Рекурсивный поиск сетевых ресурсов в локальной сети
Что осталось за бортом?
Глава Разрешение некоторых проблем программирования в Windows
В Как сделать так чтобы при минимизации окна значок его помещался бы на системную панель?
Демонстрация процедуры помещения иконки на системную панель
В Есть ли дополнительные средства упрощающие файловую обработку?
В Можно ли контролировать ввод информации в окне редактирования?
Пример использования подклассов
В Возможны ли какиелибо способы взаимодействия и обмен информацией между запущенными приложениями?
Пример взаимодействия с консольным процессом через PIPE
В Можно ли не допустить многократный запуск одного и того же приложения?
В Имеет ли операционная система
В Как отправить данные на печатающее устройство?
В Может ли приложение узнать какие программы в настоящее время запущены?
Программа поиска процессов
Пример работы программы на Рисунок
Глава Некоторые вопросы системного программирования в Windows
О страничной и сегментной адресации
Схема преобразования логического
Преобразование линейного адреса
Адресное пространство процесса
Управление памятью
Пример программы с выделением динамической памяти
Фильтры (HOOKS)
Простой пример построения глобального фильтра
Глава Использование ассемблера с языками высокого уровня
Согласование вызовов
Согласование имен
Согласование параметров
В данном разделе рассматривается простой модуль на языке ассемблера
) Borland C++
Пример использования процедуры из внешнего модуля Используется транслятор BORLAND C++
Visual C++
Модуль на языке ассемблера для компоновки с помощью пакета Visual C++
) Delphi
Пример подключения объектного модуля к программе на Delphi
В этом разделе используется другой тип вызова быстрый
Пример регистрового соглашения вызова процедуры
Вызываемая ассемблерная процедура
Консольная программа на C++
Пример использования в ассемблерном модуле APIфункций и ресурсов
Здесь рассматривается пример простейшего калькулятора
Симодуль для программы простейшего
Пример работы программыкалькулятора (Рисунок ) V
Пример использования директивы
Пример использования директивы
Динамическая библиотека созданная на Delphi
Пример динамической библиотеки написанной на Delphi
Пример программы на языке
Приложения
Приложение Справочник APIфункций и сообщений Windows
Таблица Функции API
Таблица Сообщение операционной системы Windows
Приложение Справочник по командам и архитектуре Pentium
Регистры общего назначения
Регистр флагов
Сегментные регистры
Регистр CR
Системные адресные регистры
Регистры отладки
Команды пересылки данных
Команды вводавывода
Инструкции работы со стеком
Инструкции целочисленной арифметики
Логические операции
Сдвиговые операции
Строковые операции
Команды управления флагами
Команды передачи управления
Команды поддержки языков высокого уровня
Команды прерываний
Команды синхронизации процессора
Команды обработки цепочки бит
Команды управления защитой
Команды обмена с управляющими регистрами
Команды идентификации и управления архитектурой
Команды управления кэшированием
Команды арифметического сопроцессора
Команды передачи данных
Команды сравнения данных
Арифметические команды
Трансцендентные функции
Команды управления сопроцессором
Расширение MMX
Команды MMX расширения
Приложение Защищенный режим микропроцессора Pentium
Дескриптор кода и данных
Другие дескрипторы
Переключение задач
Четырехуровневая система привилегий
Страничное управление памятью
-
Создание операционной системы на Ассемблере
В своей работе я буду использовать:
Ассемблер nasm, который мне очень нравится из-за своей многоплатформенности (есть версии для UNIX, DOS и Windows), поддержкой команд практически всех современных процессоров и многообразием понимаемых форматов.
На Си мы будем писать не много, и для наших целей подойдет практически любой ANSI C компилятор. (ANSI C - это стандарт Си, дорабатывался последний раз в 1989 году, и практически все компиляторы ему соответствуют).
Немного углублюсь в аппаратные возможности компьютеров.
Теперь немного поподробнее про устройство ядра.
Вопросы к подписчикам
Как процессор работает с памятью?
Страничная организация памяти.
Многозадачность.
Что из всего этого следует?
Заключение.
Загрузка Linux.
Загрузка FreeBSD.
Загрузка DOS.
Загрузка Windows 9x.
Загрузка Windows NT.
А теперь давайте разбираться, как это все работает.
История организации памяти.
Защита.
Дескрипторы сегментов.
И снова защита.
Эпилог.
Возвращаясь к прошлым выпускам
Шлюзы
Виртуальный режим процессора 8086.
Исключения защищенного режима.
Микроядерные системы.
Основные принципы файловых систем.
Файловые системы на базе FAT (File Allocation Table).
Ext2fs (Расширенная файловая система версия 2)
Чтение ext2fs
Формат ELF.
Загрузка формата ELF.
Формат PE.
Загрузка формата PE.
Системные особенности.
Процесс загрузки.
Загрузка с диска дополнительной части кода и служебной информации файловой системы.
Загрузка с диска файла сценария (конфигурации) загрузки.
Загрузка с диска ядра и модулей.
Переход в защищенный режим.
Передача управления ядру.
Новости.
Определение количества памяти через BIOS.
Определение размера памяти другими способами:
Динамическое распределение памяти.
-
Как написать игру для ZX Spectrum на ассемблере
Эта книга адресована в первую очередь тем, кого уже перестал удовлетворять несколько ограниченный и неповоротливый Бейсик и кто мечтает наконец научиться писать программы на ассемблере. Книга рассчитана на достаточно подготовленного читателя, прошедшего «боевое крещение» Бейсиком, а новичкам в программировании мы можем порекомендовать первую книгу из серии «Как написать игру для ZX Spectrum». Надеемся также, что и профессионалы смогут найти здесь для себя некоторые зерна истины.
Как и в предшествующей книге, речь здесь пойдет преимущественно об игровых программах, однако хотим вас предупредить заранее, что ассемблер - штука серьезная и нам не раз придется погружаться в пучины мудреных понятий и терминов. Но со своей стороны мы обещаем сделать эти погружения не слишком головокружительными, смягчив суровую необходимость занимательными примерами.
Возможно, вас несколько смутили только что прочитанные строки, да и раньше вам, быть может, не раз приходилось слышать, мол, писать программы на ассемблере невероятно сложно. Но, право, не так страшен ассемблер, как его малюют, а что касается сложностей, так вспомните свои первые шаги в том же Бейсике.
ГЛАВА ПЕРВАЯ,
ЗАСТАВКА
Загрузочная картинка к игре JUGGERNAUT
Меню программы EAGLES NEST
ИГРОВОЕ ПРОСТРАНСТВО
Игровое пространство программы DIZZY4
ВЗАИМОДЕЙСТВИЕ С ИГРАЮЩИМ
ОЦЕНКА ИГРОВОЙ СИТУАЦИИ
Оценка игровой ситуации в игре GUN FRIGHT
ЗВУКОВОЕ СОПРОВОЖДЕНИЕ ИГРЫ
ГЛАВА ВТОРАЯ,
МАШИННЫЕ КОДЫ И АССЕМБЛЕР
ЧТО МОЖЕТ МИКРОПРОЦЕССОР Z80?
ЧТО МОЖЕТ МИКРОПРОЦЕССОР Z80? - 2
ПРЕИМУЩЕСТВА И НЕДОСТАТКИ ЯЗЫКА АССЕМБЛЕРА - 2
ОРГАНИЗАЦИЯ ПАМЯТИ
ПЗУ и ОЗУ
Распределение областей памяти
Системные области
Строение экрана
Строение экрана
РЕГИСТРЫ И РЕГИСТРОВЫЕ ПАРЫ
ПРОСТЕЙШАЯ ПРОГРАММА В МАШИННЫХ КОДАХ
ГЛАВА ТРЕТЬЯ,
ЗАГРУЗКА GENS4
СТРУКТУРА АССЕМБЛЕРНОЙ СТРОКИ
ВВОД СТРОКИ
ПРОСМОТР ТЕКСТА
ТРАНСЛЯЦИЯ ПРОГРАММЫ
ВЫХОД ИЗ GENS
ВНЕСЕНИЕ В ТЕКСТ ИЗМЕНЕНИЙ
Редактирование строки в GENS4
СОХРАНЕНИЕ И ЗАГРУЗКА ТЕКСТОВ И ПРОГРАММ
УДАЛЕНИЕ ТЕКСТА
ГЛАВАЧЕТВЕРТАЯ,
ВЫВОД БУКВЕННЫХ И ЦИФРОВЫХ СИМВОЛОВ
ПОДГОТОВКА ЭКРАНА К РАБОТЕ ИЗ АССЕМБЛЕРА
ПЕЧАТЬ ЦЕЛЫХ ЧИСЕЛ
РИСОВАНИЕ ГРАФИЧЕСКИХ ПРИМИТИВОВ
Точки
Прямые линии
Дуги
Окружности
СТАТИЧЕСКИЕ ЗАСТАВКИ
Пример статической заставки
Элементы углов рамки
ИЗГОТОВЛЕНИЕ НОВЫХ НАБОРОВ СИМВОЛОВ (ФОНТОВ)
Полный набор латинских символов
Полный набор русских символов
Правила игры
ГЛАВА ПЯТАЯ,
ОРГАНИЗАЦИЯ ЦИКЛОВ В АССЕМБЛЕРЕ
Простые циклы
Вложенные циклы
Проверка условий. Флаги
Биты флагов
Условные и безусловные переходы
Операция сравнения
Длинные циклы
Логические операции
ПЕРЕМЕЩЕНИЯ СИМВОЛОВ
Печатающий квадрат
Бегущая строка
Выполнение команд сдвига аккумулятора
Выполнение команд сдвига регистров
Волна
Растворение символов
Ответ на задачу
ОКНА
Формирование окна
Окна в игре MICRONAUT ONE
Динамическое окно
Размножающиеся окна
Цепочка окон
СПРАЙТЫ (ПРОГРАММА ПРЫГАЮЩИЙ ЧЕЛОВЕЧЕК)
Фазы движения человечка
МУЛЬТИПЛИКАЦИОННАЯ ЗАСТАВКА
Мультипликационная заставка
ГЛАВА ШЕСТАЯ,
СОЗДАНИЕ ПРОСТЕЙШИХ ЗВУКОВ
МАНИПУЛЯЦИИ С БУКВАМИ
Печать символов высотой в два знакоместа
Действие процедуры BIGSYM
Печать символов шириной в два знакоместа
Действие процедуры DBLSYM
Перемещения битов
КАК СДЕЛАТЬ НАЗВАНИЕ ИГРЫ
Название для игры НАРДЫ
Построение буквы Д
СКРОЛЛИНГИ ОКОН
Правила игры
Раскрытие ворот замка скроллингом окон
ВВОД ЭЛЕМЕНТА СЛУЧАЙНОСТИ
Программа МИШЕНЬ
МНОГОКАДРОВАЯ ЗАСТАВКА
Многокадровая заставка
ГЛАВА СЕДЬМАЯ,
Как написать игру для ZX Spectrum на ассемблере
БЫСТРЫЙ ВЫВОД СПРАЙТОВ
Спрайт из игры FIST
СПРАЙТ-ГЕНЕРАТОР
МУЛЬТИПЛИКАЦИЯ
Перемещение спрайта скроллингом окна
Изготовление маски спрайта
ПОСТРОЕНИЕ ПЕЙЗАЖЕЙ
ФОРМИРОВАНИЕ ИЗОБРАЖЕНИЯ В ПАМЯТИ
Вывод изображения из теневого экрана
ГЛАВА ВОСЬМАЯ,
УПРАВЛЕНИЕ СПОМОЩЬЮ КЛАВИАТУРЫ
Ввод имени играющего
УПРАВЛЕНИЕ ДЖОЙСТИКОМ
СОВМЕСТНОЕ УПРАВЛЕНИЕ КЛАВИАТУРОЙ ИДЖОЙСТИКОМ
Спрайт вертолет
ГЛАВА ДЕВЯТАЯ,
ПОДСЧЕТ КОЛИЧЕСТВЕННЫХ ВЕЛИЧИН
РАБОТА СКАЛЬКУЛЯТОРОМ
КОНТРОЛЬ ВРЕМЕНИ (РАБОТА СПРЕРЫВАНИЯМИ)
ГЛАВА ДЕСЯТАЯ,
ПОЛУЧЕНИЕ ЧИСТОГО ТОНА
СОЗДАНИЕ ЗВУКОВЫХ ЭФФЕКТОВ
МУЗЫКАЛЬНЫЙ СОПРОЦЕССОР
Программа БИТВА С НЛО
МУЗЫКАЛЬНЫЙ РЕДАКТОР WHAMFX
Режим редактирования
Ноты пьесы
Формирование огибающей
Редактирование шумовых эффектов
ГЛАВА ОДИННАДЦАТАЯ,
ФУНКЦИЯ ПОИСКА/ЗАМЕНЫ
УПРАВЛЕНИЕ ТРАНСЛЯЦИЕЙ
Ключи ассемблирования
Установка размера таблицы меток
ТРАНСЛЯЦИЯ БОЛЬШИХ ПРОГРАММ
МАКРООПРЕДЕЛЕНИЯ
ДИРЕКТИВЫ УСЛОВНОЙ ТРАНСЛЯЦИИ
КОМАНДЫ АССЕМБЛЕРА
НЕКОТОРЫЕ НЕДОКУМЕНТИРОВАННЫЕ КОМАНДЫ
ЛИТЕРАТУРА