Сборник по задачам и примерам Assembler


Лучший аромат в мире

Сборник по задачам и примерам Assembler

Профессия программиста удивительна и уникальна. Давно уже настало время настоящего философского осмысления этой сферы человеческой деятельности, действительно обладающей какими-то особенными, для людей непосвященных чуть ли не магическими, свойствами. Если не брать в рассмотрение коммерческую сторону, то можно сказать, что чужих людей в этой области профессиональной деятельности нет. В чем же ее особенность? Наиболее точно по этому поводу высказался Фредерик Брукс в главе «Пятьдесят лет удивления, восхищения и радости» своей книги «Мифический человеко-месяц, или как создаются программные системы>: «Немногим Бог дает право зарабатывать на жизнь тем, чем они с радостью занимались бы по собственной воле, по увлечению. Я благодарен судьбе». И далее: «Область связанных с компьютерами знаний претерпела взрыв, как и соответстующая технология. Будучи аспирантом в середине 50-х, я мог прочесть все журналы и труды конференций. Я мог оставаться на современном уровне во всей научной дисциплине.

Введение
Эту книгу можно рассматривать как своеобразную форму программного продукта. Даже беглое ее пролистывание показывает, как много в ней программного кода. Более того, так как ассемблерный код неэк'ономичен с точки зрения использования поверхности листа бумаги для его записи, то в тексте книги приведены лишь значимые для каждого конкретного контекста изложения фрагменты программ. Полные тексты этих программ содержатся на дискете. Некоторые наиболее объемные по размеру исходного текста программы целиком вынесены на дискету без приведения их фрагментов в тексте книги. Для эффективной работы с ними читателю следует внимательно следить за ссылками на них и соответствующими пояснениями.

Структура раздела
Структура раздела - 2
Структура раздела - 3
Структура раздела - 4

Программирование целочисленных арифметических операций
Всякое математическое доказательство, за которым мы можем следить, выразимо конечным числом символов. Эти символы, правда, могут быть связаны с понятием бесконечности, но связь эта такова, что ее можно установить за конечное число шагов. Так, когда в случае математической индукции мы доказываем теорему, зависящую от параметра n, мы доказываем ее сначала для n=0 и затем устанавливаем, что случай, когда параметр имеет значение n+1, вытекает из случая, когда параметр имеет значение n.

Двоичные числа
Сложение чисел размером 1 байт без учета знака
Сложение чисел размером N байт без учета знака
Сложение чисел размером 1 байт с учетом знака
Сложение с учетом знака чисел размером N байт
Вычисление дополнения числа размером N байт
Вычисление модуля числа размером N байт
Вычитание двоичных чисел
Вычитание чисел размером N байт без знака
Вычитание чисел размером 1 байт с учетом знака

Сложные структуры данных
Процесс разработки программы на ассемблере традиционно осложняется тем, что в этом языке ограничены средства описания данных, привычные для языков программирования высокого уровня. В уроке 12 «Сложные структуры данных» учебника были рассмотрены средства, которые поддерживает ассемблер для работы с данными. Но это деление весьма условно и не дает представления о том, как реализуется общая концепция понятий «данное», «тип данных» и «структура данных» в контексте программирования на языке ассемблера.

Основные понятия
Основные понятия - 2
Основные понятия - 3
Основные понятия - 4
Способы распределения памяти
Механизм виртуальной памяти Windows
Механизм работы с кучами Windows
Механизм работы с кучами Windows - 2
Множество
Множество - 2

Процедуры в программах ассемблера
В учебнике достаточно полно был рассмотрен вопрос организации работы с процедурами, но некоторые проблемы остались за кадром. В этой главе мы остановимся на трех из них: реализации рекурсивных и вложенных процедур на ассемблере, а также разработке динамических (DLL) библиотек.

Реализация рекурсивных процедур
Реализация рекурсивных процедур - 2
Реализация рекурсивных процедур - 3
Реализация рекурсивных процедур - 4
Реализация вложенных процедур
Реализация вложенных процедур - 2
Реализация вложенных процедур - 3
Разработка динамических (DLL) библиотек
Разработка текста DLL-библиотеки
Разработка текста DLL-библиотеки - 2

Обработка цепочек элементов
Материал этой главы является дополнением к уроку 11 «Цепочечные команды» учебника. Из этого урока следуют выводы о том, что, во-первых, цепочечные команды являются мощным инструментом обработки последовательностей элементов размером 1/2/4 байт и, во-вторых, это единственное средство микропроцессора для обработки данных по схеме память-память. В процессе разработки программ для учебника и этой книги мы достаточно часто использовали команды микропроцессора этой группы.

Обработка цепочек элементов
Прямой поиск в текстовой строке
Прямой поиск в текстовой строке - 2
Прямой поиск в текстовой строке - 3
Прямой поиск в текстовой строке - 4
Поиск с анализом искомой подстроки

Работа с консолью в программах на ассемблере
На практике редко возникает необходимость разработки программы как «вещи в себе». В подавляющем большинстве случаев программа должна взаимодействовать с пользователем, получая от него данные посредством клавиатуры и выдавая результаты своей работы на экран. При знакомстве с новым языком программирования одним из первых вопросов, на которые ищет ответа программист, является выяснение средств этого языка для выполнения операций обмена с консолью (консоль — клавиатура и монитор). Что касается языка ассемблера, то собственных средств обмена с консолью у него нет.

Функции BIOS для работы с консолью
Функции BIOS для работы с клавиатурой
Проверка наличия символа
Получение состояния флагов клавиатуры
Запись символа в буфер клавиатуры
Функции BIOS для работы с экраном
Установка видеорежима
Установка позиции курсора
Получение позиции курсора
Запись символа и его атрибута в видеопамять

Преобразование чисел
Отдельный предмет обсуждения при этом — процесс ввода-вывода числовой информации. В каждом языке программирования он реализован по-своему. Одна из целей, к которой стремятся разработчики компиляторов, — по возможности сделать этот процесс прозрачным для программиста. Язык ассемблера в отличие от языков высокого уровня не обладает средствами такого прозрачного ввода-вывода числовой информации. Но в этом и состоит его достоинство, так как при определенном опыте и квалификации программиста появляется хорошая возможность повышения эффективности конечного кода.

Ввод чисел с консоли
Ввод целых десятичных чисел 0..99
Ввод целых десятичных чисел 0..99 - 2
Ввод целых десятичных чисел 0..999 999
Ввод целых десятичных чисел 0..999 999 - 2
Ввод целых десятичных 0..до бесконечности
Ввод целых десятичных 0..до бесконечности - 2
Ввод вещественных чисел
Вывод чисел на консоль
Вывод чисел на консоль - 2

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

Создание, открытие, закрытие и удаление файла
Создание файла с усечением существующего
Открытие файла с расширенными возможностями
Закрытие файла
Чтение, запись, позиционирование в файле
Установка текущей файловой позиции
Запись в файл или устройство
Запись в файл или устройство - 2
Запись в файл или устройство - 3
Запись в файл или устройство - 4

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

Профайлер
Расширение традиционной архитектуры Intel
Команды RDMSR и WRMSR
CPUID — информация о текущем процессоре
CPUID — информация о текущем процессоре - 2
CPUID — информация о текущем процессоре - 3
Счетчик меток реального времени TSC
Счетчик меток реального времени TSC - 2
Счетчик меток реального времени TSC - 3
Счетчик меток реального времени TSC - 4

Вычисление CRC
В своей практической работе каждый пользователь наверняка сталкивался с ситуацией, когда неблагоприятные условия перемещения файлов (любым способом) приводили к порче последних. Типичное проявление этой ситуации — сообщение об ошибке при попытке чтения некоторого файла. Причина — внесенная извне техническая ошибка, приведшая к нарушению целостности исходной информации. Существует много методов для исправления подобных ошибок, но прежде чем исправлять, необходимо эти ошибки обнаружить

Вычисление CRC
Вычисление CRC - 2
Вычисление CRC - 3
Вычисление CRC - 4
CRC-арифметика
CRC-арифметика - 2
CRC-арифметика - 3
CRC-арифметика - 4
CRC-арифметика - 5
CRC-арифметика - 6

Программирование ХММ-расширения
В этой главе мы рассмотрим практические вопросы программирования ХММ-расширения микропроцессора Pentium III. Программирование целочисленного MMX-расширения рассмотрено в уроке 20 «ММХ-технология микропроцессоров Intel» учебника. Там же рассмотрены архитектура и система команд ХММ-расширения, но остались «за бортом» вопросы организации практической работы с ними. Кроме учебника архитектура и система команд ХММ-расширения рассмотрены в литературе.

Программирование ХММ-расширения
Программирование ХММ-расширения
Программирование ХММ-расширения - 2
Программирование ХММ-расширения - 3
Описание упакованных и скалярных данных
Описание упакованных и скалярных данных - 2
Примеры использования команд ХММ-расширения
Сложение и умножение ХММ-значений
Умножение матрицы на вектор
Умножение матрицы 4x4 на вектор

Справочник по языку Ассемблера IBM PC

Интересно проследить, начиная со времени появления первых компьютеров и заканчивая сегодняшним днем, за трансформациями представлений о языке ассемблера у программистов.
Когда-то ассемблер был языком, без знания которого нельзя было заставить компьютер сделать что-либо полезное. Постепенно ситуация менялась. Появлялись более удобные средства общения с компьютером. Но, в отличие от других языков, ассемблер не умирал, более того он не мог сделать этого в принципе. Почему? В поисках ответа попытаемся понять, что такое язык ассемблера вообще.
Если коротко, то язык ассемблера — это символическое представление машинного языка.
Все процессы в машине на самом низком, аппаратном уровне приводятся в действие только командами (инструкциями) машинного языка. Отсюда понятно, что, несмотря на общее название, язык ассемблера для каждого типа компьютера свой. Это касается и внешнего вида программ, написанных на ассемблере, и идей, отражением которых этот язык является.

Об ассемблере
Программист или любой другой пользователь может использовать любые высокоуровневые средства, вплоть до программ построения виртуальных миров и, возможно, даже не подозревать, что на самом деле компьютер выполняет не команды языка, на котором написана его программа, а их трансформированное представление в форме скучной и унылой последовательности команд совсем другого языка — машинного. А теперь представим, что у такого пользователя возникла нестандартная проблема или просто что-то не заладилось.

Author
Микропроцессоров Intel
Порядок описания команд будет следующим:
Для описания команд приняты обозначения:
AAA
AAD
AAD - 2
AAM
AAS
ADC

Директивы управления листингом
Директивы управления листингом делятся на следующие группы: При рассмотрении директив обращайте внимание на то, что их формат отличается для режимов работы транслятора MASM и IDEAL: директивам режима MASM предшествует точка; директивам режима IDEAL предшествует знак “%”.

Общие директивы управления листингом
Директивы вывода текста включаемых файлов
Директивы вывода условного ассемблирования
Директивы вывода макрорасширений
Директивы вывода листинга перекрестных ссылок
Директивы изменения формата листинга
Директивы изменения формата листинга - 2
Сообщения об ошибках
Сообщения об ошибках - 2
Сообщения об ошибках - 3

Структура машинной команды
Префиксы. Необязательные элементы машинной команды, каждый из которых состоит из одного байта или может отсутствовать. В памяти префиксы предшествуют команде. Назначение префиксов — модифицировать операцию, выполняемую командой.

Структура машинной команды
Структура машинной команды - 2
Структура машинной команды - 3
Структура машинной команды - 4
Способы задания операндов команды
Способы задания операндов команды - 2
Способы задания операндов команды - 3
Прямая адресация
Прямая адресация - 2
Косвенная базовая (регистровая) адресация

Команды пересылки данных
Для удобства практического применения и отражения их специфики команды данной группы удобнее рассматривать в соответствии с их функциональным назначением, согласно которому их можно разбить на следующие группы команд

Команды пересылки данных
Команды пересылки данных - 2
Команды ввода-вывода в порт
Команды работы с адресами
Команды работы с адресами - 2
Команды преобразования данных
Команды преобразования данных - 2
Команды работы со стеком
Команды работы со стеком - 2
Команды работы со стеком - 3

Обзор группы арифметических команд и данных
Группа арифметических целочисленных команд работает с двумя типами чисел: целыми двоичными числами. Числа могут иметь знаковый разряд или не иметь такового, то есть быть числами со знаком или без знака; целыми десятичными числами.

Целые двоичные числа
Десятичные числа
Арифметические операции над двоичными
Сложение двоичных чисел без знака
Сложение двоичных чисел без знака - 2
Сложение двоичных чисел со знаком
Пример 1.
Пример 2.
Пример 3.
Пример 4.

Логические команды
Наряду со средствами арифметических вычислений, система команд микропроцессора имеет также средства логического преобразования данных. Под логическими понимаются такие преобразования данных, в основе которых лежат правила формальной логики. Формальная логика работает на уровне утверждений истинно и ложно. Для микропроцессора это, как правило, означает /b> и /b> соответственно.

Логические команды
Логические данные
Логические данные - 2
Логические команды
Логические команды - 2
Логические команды - 3
Логические команды - 4
Логические команды - 5
Команды сдвига
Команды линейного сдвига

Команды передачи управления
На предыдущих уроках мы познакомились с некоторыми командами, из которых формируются линейные участки программы. Каждая из них в общем случае выполняет некоторые действия по преобразованию или пересылке данных, после чего микропроцессор передает управление следующей команде. Но очень мало программ работают таким последовательным образом. Обычно в программе есть точки, в которых нужно принять решение о том, какая команда будет выполняться следующей

Безусловные переходы
Команда безусловного перехода jmp
Процедуры
Условные переходы
Команда сравнения cmp
Команды условного перехода и флаги
Команды условного перехода и регистр ecx/cx
Организация циклов

Цепочечные команды
Эти команды также называют командами обработки строк символов. Названия почти синонимичны. Отличие в том, что под строкой символов здесь понимается последовательность байт, а цепочка — это более общее название для случаев, когда элементы последовательности имеют размер больше байта — слово или двойное слово.

Цепочечные команды
Цепочечные команды - 2
Цепочечные команды - 3
Цепочечные команды - 4
Операция пересылки цепочек
Команда movs:
Команда movs: - 2
Операция сравнения цепочек
Команда cmps
Команда cmps - 2

Ассемблер и программирование для IBM PC

Написание ассемблерных программ требует знаний организа ции всей системы компьютера. В основе компьютера лежат понятия бита и байта. Они являются тем средством, благодаря которым в компьютерной памяти представлены данные и команды. Программа в машинном коде состоит из различных сигментов для определения данных, для машинных команд и для сигмента, названного стеком, для хранения адресов. Для выполнения ариф метических действий, пересылки данных и адресации компьютер имеет ряд регистров. Данная глава содержит весь необходимый материал по этим элэментам компьютера, так что вы сможете продвинутся к главе 2 к вашей первой программе на машинном языке.

Введение в семейство персональных компьютеров IBM PC
Для выполнения программ компьютер временно записывает программу и данные в основную память. Это память, которую люди имеют в виду, когда утверждают, что их компьютер имеет, например, 512К памяти. Компьютер имеет также ряд pегистров, которые он использует для временных вычислений. Минимальной единицей информации в компьютере является бит. Бит может быть выключен, так что его значение есть нуль, или включен, тогда его значение равно единице.

Введение в семейство компьютеров IBM PC
Введение в семейство компьютеров IBM PC - 2
Введение в семейство компьютеров IBM PC - 3
Введение в семейство компьютеров IBM PC - 4
Введение в семейство компьютеров IBM PC - 5
Введение в семейство компьютеров IBM PC - 6
Введение в семейство компьютеров IBM PC - 7
Введение в семейство компьютеров IBM PC - 8
Введение в семейство компьютеров IBM PC - 9
Введение в семейство компьютеров IBM PC - 10

Дисковая память II: Функции базовой версиии DOS
Все рассматриваемые операции были введены в первых версиях DOS и возможны во всех последующих версиях. Обработка дисковых файлов в базовой DOS включает определение блока управления файлом (FCB - file control block), который описывает файл и его записи. Передача адреса блока FCB в DOS обязательна для всех дисковых операций ввода-вывода. Новых команд ассемблера в данной главе не потребуется. Управление вводом и выводом осуществляется специальными прерываниями.

Функции базовой версиии DOS
Функции базовой версиии DOS - 2
Функции базовой версиии DOS - 3
Функции базовой версиии DOS - 4
Функции базовой версиии DOS - 5
Функции базовой версиии DOS - 6
Функции базовой версиии DOS - 7
Функции базовой версиии DOS - 8
Функции базовой версиии DOS - 9
Функции базовой версиии DOS - 10


Опционы - перейти
Опционы - перейти
Реальные опционы - перейти
Математика опционов - перейти
Торговые стратегии - перейти
Советы трейдеров - перейти
Стратегии мастеров - перейти
Энциклопедия стратегий - перейти
Delphi для начинающих - перейти
Введение - перейти
Основы программирования - перейти
Управляющие структуры языка Delphi - перейти
Символы и строки - перейти
Консольное приложение - перейти
Массивы - перейти