Рассмотрены основы программирования на языке ассемблера для процессоров ARM на примере Raspberry Pi с операционной системой Raspberry Pi OS. Приведены подробные сведения об архитектуре и особенностях ARM, вызовах операционной системы. Подробно описан синтаксис ассемблера для ARM. Рассмотрены компоновщик GCC, отладка с GDB, использование функций языка С в ассемблере с помощью библиотеки libc. Описаны функции GPIO, система команд ARM Neon и команды Thumb. Все разделы снабжены практическими примерами. Книга ориентирована на начинающих разработчиков, желающих освоить программирование на языке ассемблера для устройств с архитектурой ARM.
Электронный архив на сайте издательства содержит исходный код программ из книги.
Author(s): Брюс Смит
Edition: 4
Publisher: БХВ-Петербург
Year: 2022
Language: Russian
Pages: 320
City: СПб.
Tags: Assembly Language; Raspberry Pi; C; Raspbian OS; GPIO; GCC; AVR Processors
Оглавление
Об авторе
1. Введение
Безграничные возможности
Начинаем экспериментировать
Компилятор GNU С
Учимся на примерах
Что вы узнаете?
Совместимость четвертого издания книги
ОС Raspberry Pi
А что насчет 64-разрядной системы?
Клавиатурные вычисления
Значимость ARM
Raspberry Pi сквозь века
Вычислительные модули
Используемые обозначения
Центр истории вычислительной техники
Веб-сайт и бесплатные книги
Благодарности
2. Начало
Числа со смыслом
Команды ARM
Процесс преобразования
А зачем вообще машинный код?
Языковые уровни
На орбиту!
RISC и наборы команд
Структура ассемблера
Ошибки на пути
Кросс-компиляторы
Чипы Raspberry Pi ARM
3. Проба пера
Командная строкаЗ. Проба пера
Создание исходного файла
Написанное — исполнить!
Ошибки ассемблера
Компоненты
А если нет метки start?
Связывание файлов
Прибираемся
Пара слов о комментариях
Редактор Geany Programmer’s Editor
4. О битах в RISC-машинах
Преобразование двоичных чисел в десятичные
Преобразование десятичных чисел в двоичные
Преобразование двоичного числа в шестнадцатеричное
Преобразуем шестнадцатеричные числа в десятичные и обратно
Двоичное сложение
Вычитание
Дополнительный код
Когда двоичные числа не складываются
Стандартный калькулятор
5. Соглашения ARM
Длина слов
Доступ к памяти по байтам и словам
Регистры
Регистр R15: программный счетчик
Регистр состояния текущей программы
Биты и флаги
Установка флагов
Суффикс 5
R14: регистр ссылок
R13: указатель стека
6. Обработка данных
Команды сложения
Вычитание
Умножение
Теперь о делении
Команды перемещения
Команды сравнения
Сортировка чисел
7. Входы и выходы
Команды SWI и SKC
Вывод на экран
Чтение с клавиатуры
Регистр eax и прочие
Программа Маке
8. Логические операции
Логическое И (AND)
Логическое ИЛИ (OR)
Исключающее ИЛИ (EOR)
Команды логических операций
Команда ORR для преобразования регистра символов
Очистка бита командой BIC
Проверка флагов
Регистры системных вызовов
9. Условное выполнение
Коды состояния с одним флагом
EQ: равно
NE: не равно
VS: переполнение
VC: нет переполнения
MI: знак «минус»
PL: знак «плюс»
CS: имеется перенос (HS: беззнаковое больше или равно)
СС: нет переноса (LO: беззнаковое меньше)
AL: безусловное исполнение
NV: безусловное неисполнение
Коды, проверяющие несколько флагов
HI: беззнаковое больше
LS: беззнаковое меньше или равно
GE: знаковое больше или равно
LT: знаковое меньше
GT: знаковое больше
LE: знаковое меньше или равно
Добавление суффикса S'
10. Ветви и сравнения
Команды ветвления
Регистр ссылок
Использование команд сравнения
Применяем дальновидное мышление
Эффективное использование условных операторов
Обмен ветвей
11. Сдвиги и вращения
Логические сдвиги
Логический сдвиг вправо
Арифметический сдвиг вправо
Вращение
Расширенное вращение
Использование сдвигов и вращений
Прямой постоянный диапазон
Движение вверх
12. Умные числа
Длинное умножение
Умножение с накоплением
Деление и остаток
Умное умножение
Это только начало
13. Программный счетчик R15
Конвейерная обработка
Расчет ветвей
14. Отладка с использованием GDB
Когда все зависло
Сборка с GDB
Дизассемблер
Точки останова
Дамп памяти
Сокращения
Параметры сборки GDB
15. Передача данных
Директива ADR
Косвенная адресация
Команды ADR и LDR
Предварительно индексированная адресация
Доступ к байтам памяти
Обратная запись адреса
Постиндексированная адресация
Байтовые условия
Относительная адресация через регистр PC
16. Передача блока
Обратная запись
Процедура копирования блока
17. Стеки
Тянитолкай;-)
Рост стека
Применение стеков
Работа в фрейме
Указатель фрейма
18. Директивы и макросы
Директивы хранения данных
Выравнивание данных
Макросы
Включение макросов
19. Работа с файлами
Права доступа к файлам
20. Использование библиотеки libc
Использование функций языка С в ассемблере
Структура файла исходного кода
Исследование исполняемого файла
Ввод чисел с помощью функции scanf
Вывод информации
21. Пишем функции
Стандарты функций
Использование регистров
Больше трех
Сохранение ссылок и флагов
Надежные процедуры вывода
Пузырьковая сортировка
22. Дизассемблирование программ на С
GCC — он как швейцарский нож
Простой фреймворк С
Создание файла ассемблера
Строительные блоки
Пример функции print/
Переменные указателя фрейма
Дизассемблирование системных вызовов
23. Функции GPIO
Отображение памяти
Контроллер GPIO
Вводы и выводы GPIO
Сборка кода
Другие функции GPIO
Описание контактов GPIO
24. Числа с плавающей точкой
Архитектура VFP
Регистровый файл
Управление и вывод на экран
Сборка и отладка на VFP с помощью GDB
Загрузка, хранение и перемещение
Преобразование точности
Векторная арифметика
25. Регистр управления VFP
Условное исполнение
Скалярные и векторные операции
Какой тип оператора?
Параметры LEN и STRIDE
26. Сопроцессор Neon
Ассемблер Neon
Команды и типы данных Neon
Режимы адресации
Параметр Stride команд VLD и VST
Загрузка в прочих форматах
Neon Intrinsic
Массивы Neon
Правильный порядок
Матричная математика
Матричное умножение
Пример использования макроса
27. Код Thumb
Различия
Пишем на Thumb
Доступ к старшим регистрам
Операторы стека
Одно- и многорегистровые команды
Функции в Thumb
Команды ARMv7 Thumb
28. Единый язык
Изменения Thumb
Новые команды А32
Сравнение по нулю
Сборка UAL
29. Обработка исключений
Режимы работы
Векторы
Настройка регистров
Обработка исключений
Команды MRS и MSR
Что происходит при возникновении прерывания?
Решения о прерываниях
Возврат из прерываний
Пишем процедуры прерывания
30. System-on-Chip
Микросхема и набор команд ARM
Сопроцессоры
Конвейер
Память и кэши
GPU
Обзор ARMv8
64-разрядная ОС Raspberry Pi
А что в итоге?
Принцип Архимеда
Приложение 1. Коды символов ASCII
Приложение 2. Набор команд ARM
Команды сравнения и проверки
Команды ветвления
Арифметические команды
Логические команды
Команды перемещения данных
Приложение 3. Системные вызовы ROS
Приложение 4. Описание электронного архива
Предметный указатель