Вы находитесь на странице: 1из 69

■■■■■■■■■ ■■■ Raspberry Pi

■■■■■■■■■■■■ ■■■■■■■■■■■
4th Edition ■■■■ ■■■■
Visit to download the full and correct content document:
https://ebookstep.com/download/ebook-44570984/
More products digital (pdf, epub, mobi) instant
download maybe you interests ...

Giáo trình Be Internet Awesome 1st Edition Google

https://ebookstep.com/product/giao-trinh-be-internet-awesome-1st-
edition-google/

I ll Be Your Wife Jho Hyo-Eun

https://ebookstep.com/product/i-ll-be-your-wife-jho-hyo-eun/

Marry Me or Be My Wife Ally Jane

https://ebookstep.com/product/marry-me-or-be-my-wife-ally-jane/

Mon tour du monde en 80 jours 1st Edition Yannick


Bestaven

https://ebookstep.com/product/mon-tour-du-monde-en-80-jours-1st-
edition-yannick-bestaven/
Mon tour du monde en 80 tortues 1st Edition Bernard
Devaux

https://ebookstep.com/product/mon-tour-du-monde-
en-80-tortues-1st-edition-bernard-devaux/

The Way I Used to Be 1st Edition Amber Smith

https://ebookstep.com/product/the-way-i-used-to-be-1st-edition-
amber-smith/

„■■■■ ■■■■ ■ ■■■■■■■■■...“ : ■■■■■■■ ■ ■■■■■ 80-■■■■


■■■■■■■■ ■■■■■■■■■ ■■■■■■■■■ ■■■■■

https://ebookstep.com/download/ebook-56209260/

Orgia dos loucos 1st Edition Ungulani Ba Ka Khosa

https://ebookstep.com/product/orgia-dos-loucos-1st-edition-
ungulani-ba-ka-khosa/

Eine Anleitung zum Glücklichsein - 80 anregende Impulse


zur psychischen Gesundheit 1st Edition Alexander
Hüttner

https://ebookstep.com/product/eine-anleitung-zum-
glucklichsein-80-anregende-impulse-zur-psychischen-
gesundheit-1st-edition-alexander-huttner/
Raspberry Pi OS
ASSEMBLY
LANGUAGE

Hands-on-Guide
Fourth Edition
Брюс Смит

АССЕМБЛЕР
ДЛЯ RASPBERRY PI
Практическое руководство
4-е издание

Санкт-Петербург
« БХВ-Петербург»
2022
УДК 004.4
ББК 32.973.26-018.2
С50

Смит Б.
С50 Ассемблер для Raspberry Pi. Практическое руководство: Пер. с англ. —
4-е изд.— СПб.: БХВ-Петербург, 2022. — 320 с.: ил.
ISBN 978-5-9775-6801-2
Рассмотрены основы программирования на языке ассемблера для процессоров
ARM на примере Raspberry Pi с операционной системой Raspberry Pi OS. Приведе­
ны подробные сведения об архитектуре и особенностях ARM, вызовах операцион­
ной системы. Подробно описан синтаксис ассемблера для ARM. Рассмотрены ком­
поновщик GCC, отладка с GDB, использование функций языка С в ассемблере
с помощью библиотеки libc. Описаны функции GPIO, система команд ARM Neon
и команды Thumb. Все разделы снабжены практическими примерами. Книга ори­
ентирована на начинающих разработчиков, желающих освоить программирование
на языке ассемблера для устройств с архитектурой ARM.
Электронный архив на сайте издательства содержит исходный код программ из
книги.

Для начинающих программистов


УДК 004.4
ББК 32.973.26-018.2
Группа подготовки издания:
Руководитель проекта Павел Шалим
Зав. редакцией Людмила Гауль
Перевод с английского Михаила Райтмана
Редактор Григорий Добин
Компьютерная верстка Ольги Сергиенко
Оформление обложки Зои Канторович

Copyright © 2021 by Bruce Smith


Translation Copyright © 2021 by BHV All rights reserved
Перевод © 2021 BHV. Все права защищены.

Подписано в печать 01 12.21


Формат 70x100716 Печать офсетная Усл печ л 35,8
Тираж 1000 экз Заказ № 2949
"БХВ-Петербург", 191036, Санкт-Петербург, Гончарная ул , 20
Отпечатано с готового оригинал-макета
ООО "Принт-М", 142300, М О , г Чехов, ул Полиграфистов, д 1

ISBN 978-0-6480987-3-7 (англ.) © Bruce Smith, 2021


© Перевод на русский язык, оформление
ISBN 978-5-9775-6801-2 (рус.)
ООО "БХВ-Петербург", ООО "БХВ", 2021
Оглавление

Об авторе......................................................................................................................... 13
1. Введение............................................ 14
Безграничные возможности..................................................................................................................15
Начинаем экспериментировать........................................................................................................... 16
Компилятор GNU С............................................................................................................................... 16
Учимся на примерах.............................................................................................................................. 17
Что вы узнаете?....................................................................................................................................... 17
Совместимость четвертого издания книги........................................................................................ 18
ОС Raspberry Pi....................................................................................................................................... 19
А что насчет 64-разрядной системы?................................................................................................. 20
Клавиатурные вычисления................................................................................................................... 20
Значимость ARM................................................................................................................................... 20
Raspberry Pi сквозь века....................................................................................................................... 21
Вычислительные модули..................................................................................................................... 23
Используемые обозначения................................................................................................................. 24
Центр истории вычислительной техники......................................................................................... 24
Веб-сайт и бесплатные книги.............................................................................................................. 25
Благодарности.........................................................................................................................................26

2. Начало......................................................................................................................... 27
Числа со смыслом.................................................................................................................................. 27
Команды ARM........................................................................................................................................28
Процесс преобразования...................................................................................................................... 29
А зачем вообще машинный код?........................................................................................................ 30
Языковые уровни................................................................................................................................... 30
На орбиту!............................................................................................................................................... 31
RISC и наборы команд..........................................................................................................................32
Структура ассемблера...........................................................................................................................32
Ошибки на пути..................................................................................................................................... 33
Кросс-компиляторы............................................................................................................................... 33
Чипы Raspberry Pi ARM....................................................................................................................... 33

3. Проба пера.................................................................................................................. 35
Командная строкаЗ. Проба пера..........................................................................................................35
Создание исходного файла.................................................................................................................. 36
Написанное — исполнить!................................................................................................................... 40
Ошибки ассемблера............................................................................................................................... 40
Компоненты............................................................................................................................................41
А если нет метки start?....................................................................................................................... 44
Связывание файлов................................................................................................................................ 44
Прибираемся........................................................................................................................................... 46
Пара слов о комментариях.................................................................................................................. 47
Редактор Geany Programmer’s Editor................................................................................................. 48

4. О битах в RISC-машинах................................................... 49
Преобразование двоичных чисел в десятичные.............................................................................. 50
Преобразование десятичных чисел в двоичные.............................................................................. 51
Преобразование двоичного числа в шестнадцатеричное.............................................................. 51
Преобразуем шестнадцатеричные числа в десятичные и обратно.............................................. 53
Двоичное сложение...............................................................................................................................53
Вычитание...............................................................................................................................................54
Дополнительный код............................................................................................................................ 56
Когда двоичные числа не складываются.......................................................................................... 57
Стандартный калькулятор.................................................................................................................... 58

5. Соглашения ARM...................................................................................................... 59
Длина слов............................................................................................................................................... 59
Доступ к памяти по байтам и словам.................................................................................................60
Регистры.................................................................................................................................................. 61
Регистр R15: программный счетчик................................................................................................... 63
Регистр состояния текущей программы........................................................................................... 63
Биты и флаги.......................................................................................................................................... 64
Установка флагов.................................................................................................................................. 64
Суффикс 5............................................................................................................................................... 65
R14: регистр ссылок..............................................................................................................................66
R13: указатель стека............................................................................................................................. 66

6. Обработка данных..................................................................................................... 67
Команды сложения................................................................................................................................68
Вычитание...............................................................................................................................................71
Умножение.............................................................................................................................................. 72
Теперь о делении................................................................................................................................... 74
Команды перемещения......................................................................................................................... 75
Команды сравнения.......................................................................................................................... ... 76
Сортировка чисел.................................................................................................................................. 77

7. Входы и выходы........................................................................................................ 78
Команды SWI и SKC....................................................................................................................... 78
Вывод на экран...................................................................................................................................... 79
Чтение с клавиатуры..............................................................................................................................81
Регистр eax и прочие.............................................................................................................................83
Программа Маке.................................................................................................................................... 83

8. Логические операции............................................................................................... 86
Логическое И (AND)...................................................................................................................... 86
Логическое ИЛИ (OR)................................................................................................................... 87
Исключающее ИЛИ (EOR)........................................................................................................... 87
Команды логических операций.......................................................................................................... 88
Команда ORR для преобразования регистра символов..................................................................89
Очистка бита командой BIC......................................................................................................... 90
Проверка флагов.................................................................................................................................... 91
Регистры системных вызовов............................................................................................................. 94
9. Условное выполнение............................................................................................. 95
Коды состояния с одним флагом....................................................................................................... 97
EQ: равно......................................................................................................................................... 97
NE: не равно................................................................................................................................... 97
VS: переполнение........................................................................................................................... 98
ИС: нет переполнения................................................................................................................... 98
MI: знак «минус»............................................................................................................................ 98
PL: знак «плюс».............................................................................................................................. 98
CS: имеется перенос (HS: беззнаковое больше или равно)................................................... 99
СС: нет переноса (LO: беззнаковое меньше)............................................................................ 99
A L: безусловное исполнение...................................................................................................... 100
УК: безусловное неисполнение..................................................................................................100
Коды, проверяющие несколько флагов........................................................................................... 100
HI: беззнаковое больше.............................................................................................................. 100
LS: беззнаковое меньше или равно.......................................................................................... 101
GE: знаковое больше или равно............................................................................................... 101
LT: знаковое меньше.................................................................................................................... 101
GT: знаковое больше................................................................................................................... 101
LE: знаковое меньше или равно................................................................................................ 102
Добавление суффикса S'....................................................................................................................... 102

10. Ветви и сравнения................................................................................................. 103


Команды ветвления............................................................................................................................. 103
Регистр ссылок...................................................................................................................................... 104
Использование команд сравнения..................................................................................................... 104
Применяем дальновидное мышление.............................................................................................. 105
Эффективное использование условных операторов...................................................................... 106
Обмен ветвей......................................................................................................................................... 107

11. Сдвиги и вращения............................................................................................... 108


Логические сдвиги................................................................................................................................108
Логический сдвиг вправо.................................................................................................................... 110
Арифметический сдвиг вправо.......................................................................................................... 110
Вращение............................................................................................................................................... 111
Расширенное вращение....................................................................................................................... 112
Использование сдвигов и вращений.................................................................................................112
Прямой постоянный диапазон........................................................................................................... 113
Движение вверх.................................................................................................................................... 115

12. Умные числа.......................................................................................................... 116


Длинное умножение............................................................................................................................ 116
Умножение с накоплением................................................................................................................ 118
Деление и остаток................................................................................................................................ 119
Умное умножение................................................................................................................................ 120
Это только начало.................................................................................................................................121

13. Программный счетчик R15................................................................................. 122


Конвейерная обработка....................................................................................................................... 123
Расчет ветвей......................................................................................................................................... 124
14. Отладка с использованием GDB........................................................................ 126
Когда все зависло................................................................................................................................. 126
Сборка с GDB...................................................................................................................................... 127
Дизассемблер....................................................................................................................................... 130
Точки останова.................................................................................................................................... 132
Дамп памяти.......................................................................................................................................... 136
Сокращения........................................................................................................................................... 137
Параметры сборки GDB..................................................................................................................... 137

15. Передача данных................................................................................................... 139


Директива ADR............................................................................................................................ 139
Косвенная адресация...........................................................................................................................141
Команды ADR и LDR................................................................................................................... 143
Предварительно индексированная адресация................................................................................ 143
Доступ к байтам памяти..................................................................................................................... 144
Обратная запись адреса...................................................................................................................... 146
Постиндексированная адресация..................................................................................................... 146
Байтовые условия................................................................................................................................ 148
Относительная адресация через регистр PC............................................................................. 148

16. Передача блока...................................................................................................... 150


Обратная запись................................................................................................................................... 152
Процедура копирования блока..........................................................................................................153

17. Стеки........................................ 155


Тянитолкай;-)...................................................................................................................................... 155
Рост стека.............................................................................................................................................. 157
Применение стеков.............................................................................................................................. 159
Работа в фрейме................................................................................................................................... 160
Указатель фрейма................................................................................................................................ 160

18. Директивы и макросы.......................................................................................... 162


Директивы хранения данных............................................................................................................. 162
Выравнивание данных.........................................................................................................................164
Макросы................................................................................................................................................ 165
Включение макросов........................................................................................................................... 168

19. Работа с файлами.................................................................................................. 171


Права доступа к файлам..................................................................................................................... 176

20. Использование библиотеки libc................................................................................. 179


Использование функций языка С в ассемблере............................................................................. 179
Структура файла исходного кода..................................................................................................... 180
Исследование исполняемого файла................................................................................................. 182
Ввод чисел с помощью функции scanf...................................................................................... 184
Вывод информации............................................................................................................................. 186

21. Пишем функции.................................................................................................... 188


Стандарты функций............................................................................................................................. 188
Использование регистров.................................................................................................................. 190
Больше трех........................................................................................................................................... 190
Сохранение ссылок и флагов............................................................................................................. 192
Надежные процедуры вывода............................................................................................................ 193
Пузырьковая сортировка..................................................................................................................... 195

22. Дизассемблирование программ на С................................................................. 198


GCC — он как швейцарский нож...................................................................................................... 198
Простой фреймворк С......................................................................................................................... 199
Создание файла ассемблера............................................................................................................... 200
Строительные блоки............................................................................................................................ 202
Пример функции print/................................................................................................................ 204
Переменные указателя фрейма..........................................................................................................205
Дизассемблирование системных вызовов...................................................................................... 206

23. Функции GPIO....................................................................................................... 207


Отображение памяти........................................................................................................................... 207
Контроллер GPIO................................................................................................................................. 209
Вводы и выводы GPIO....................................................................................................................... 211
Сборка кода...........................................................................................................................................217
Другие функции GPIO.........................................................................................................................222
Описание контактов GPIO................................................................................................................. 222

24. Числа с плавающей точкой................................................................................. 225


Архитектура VFP................................................................................................................................. 225
Регистровый файл................................................................................................................................ 227
Управление и вывод на экран............................................................................................................229
Сборка и отладка на VFP с помощью GDB.................................................................................... 231
Загрузка, хранение и перемещение.................................................................................................. 233
Преобразование точности.................................................................................................................. 235
Векторная арифметика....................................................................................................................... 236

25. Регистр управления VFP..................................................................................... 237


Условное исполнение..........................................................................................................................238
Скалярные и векторные операции.................................................................................................... 240
Какой тип оператора?......................................................................................................................... 242
Параметры LEN и STRIDE.......................................................................................................... 243

26. Сопроцессор Neon.................................................................................................. 247


Ассемблер Neon................................................................................................................................... 249
Команды и типы данных Neon......................................................................................................... 251
Режимы адресации............................................................................................................................... 253
Параметр Stride команд VLD и VST............................................................................................ 253
Загрузка в прочих форматах.............................................................................................................. 256
Neon Intrinsic........................................................................................................................................ 256
Массивы Neon...................................................................................................................................... 257
Правильный порядок.......................................................................................................................... 261
Матричная математика....................................................................................................................... 262
Матричное умножение....................................................................................................................... 265
Пример использования макроса....................................................................................................... 270
27. Код Thumb............................... 272
Различия............................................................................................................................................... 272
Пишем на Thumb................................................................................................................................ 274
Доступ к старшим регистрам............................................................................................................ 278
Операторы стека..................................................................................................................................279
Одно- и многорегистровые команды.............................................................................................. 279
Функции в Thumb................................................................................................................................279
Команды ARMv7 Thumb.................................................................................................................... 280

28. Единый язык.......................................................................................................... 281


Изменения Thumb................................................................................................................................282
Новые команды А32........................................................................................................................... 283
Сравнение по нулю............................................................................................................................. 284
Сборка UAL.......................................................................................................................................... 284

29. Обработка исключений........................................................................................ 287


Режимы работы.................................................................................................................................... 287
Векторы................................................................................................................................................. 288
Настройка регистров.......................................................................................................................... 290
Обработка исключений...................................................................................................................... 292
Команды MRS и MSR................................................................................................................... 293
Что происходит при возникновении прерывания?....................................................................... 294
Решения о прерываниях..................................................................................................................... 295
Возврат из прерываний...................................................................................................................... 295
Пишем процедуры прерывания........................................................................................................ 296

30. System-on-Chip....................................................................................................... 297


Микросхема и набор команд ARM.................................................................................................. 298
Сопроцессоры...................................................................................................................................... 299
Конвейер................................................................................................................................................ 299
Память и кэши...................................................................................................................................... 300
GPU........................................................................................................................................................ 301
Обзор ARMv8....................................................................................................................................... 301
64-разрядная ОС Raspberry Pi........................................................................................................... 302
А что в итоге?....................................................................................................................................... 302
Принцип Архимеда..............................................................................................................................302

Приложение 1. Коды символов ASCII.................................................................... 304


Приложение 2. Набор команд ARM......................................................................... 306
Команды сравнения и проверки....................................................................................................... 307
Команды ветвления............................................................................................................................ 307
Арифметические команды................................................................................................................. 308
Логические команды.......................................................................................................................... 308
Команды перемещения данных........................................................................................................ 309

Приложение 3. Системные вызовы ROS................................................................ 310


Приложение 4. Описание электронного архива....................................................316
Предметный указатель.............................................................................................. 317
СПИСОК ПРОГРАММ
Программа 3.1. Простой исходный файл............................................................................................ 39
Программа 3.2. Часть I исходного файла........................................................................................... 44
Программа 3.3. Часть 2 исходного файла........................................................................................... 45
Программа 6.1. Простое 32-битное сложение.................................................................................... 69
Программа 6.2. 64-битное сложение................................................................................................... 70
Программа 6.3. 32-битное умножение................................................................................................. 73
Программа 6.4. Использование умножения с накоплением mla....................................................... 73
Программа 6.5. Деление командой sdiv.............................................................................................. 74
Программа 7.1. Системный вызов 4 для вывода строки на экран.................................................... 80
Программа 7.2. Системный вызов 3 и чтение с клавиатуры............................................................ 81
Программа 7.3. Автоматизация сборки и привязки с помощью Маке............................................ 84
Программа 8.1. Преобразование регистра символов.........................................................................89
Программа 8.2. Вывод двоичного числа............................................................................................. 91
Программа 10.1. Условное выполнение позволяет сократить программу.................................... 107
Программа 12.1. Долгое и нудное умножение.................................................................................. 117
Программа 12.2. Долгое нудное деление.......................................................................................... 119
Программа 14.1. Гибкий make-файл для отладки кода.................................................................... 138
Программа 15.1. Использование директивы adr.............................................................................. 140
Программа 15.2. Использование предварительно индексированной косвенной адресации......... 145
Программа 15.3. Использование постиндексированной адресации.............................................. 147
Программа 16.1. Перемещение блоков памяти................................................................................ 153
Программа 18.1. Использование директив .byte и .equ.................................................................. 163
Программа 18.2. Реализация простого макроса................................................................................ 166
Программа 18.3. Многократный вызов макроса............................................................................... 167
Программа 18.4. Файл макроса AddMuit............................................................................................ 168
Программа 18.5. Проверка подключения макроса........................................................................... 169
Программа 19.1. Создание файлов и досгуп к ним.......................................................................... 172
Программа 20.1. Структура исходного файла GCC......................................................................... 181
Программа 20.2. Передача параметров в printf.............................................................................. 183
Программа 20.3. Чтение и преобразование числа с помощью функции scant............................. 185
Программа 20.4. Объединение scant и printf.................................................................................. 187
Программа 21.1. Передача значений функции через стек............................................................... 191
Программа 21.2. Вывод вектора слов..................... 193
Программа 21.3. Проверка printw..................................................................................................... 194
Программа 21.4. Процедура пузырьковой сортировки.................................................................... 195
Программа 21.5. Тест пузырьковой сортировки........................ 196
Программа 22.1. Простая программа на языке С для вывода символа.......................................... 200
Программа 22.2. Окончательный вариант кода................................................................................203
Программа 22.3. Код программы hello world на С........................................................................ 204
Программа 22.4. Код для работы с функцией scant........................................................................ 205
Программа 23.1. Файловый доступ к памяти GPIO..........................................................................213
Программа 24.1. Вывод значения с плавающей точкой с помощью функции printf................. 229
Программа 24.2. Вывод двух или более значений с плавающей точкой....................................... 230
Программа 25.1. Условное выполнение в VFP.................................................................................240
Программа 25.2. Использование битов len и stride для сложения векторов..............................245
Программа 26.1. Простая проверка Neon.......................................................................................... 249
Программа 26.2. Поворот 20-матрицы на 90 градусов (по часовой стрелке).............................. 258
Программа 26.3. Сложение двух матриц размером 4x4................................................................. 263
Программа 26.4. Матричное умножение чисел с одинарной точностью...................................... 266
Программа 26.5. Умножение матриц, но с макросами................................................................... 270
Программа 27.1. Вызов режима Thumb и запуск кода Thumb........................................................ 275
Программа 27.2. Использование внешних функций путем взаимодействия кода........................277
Программа 28.1. Единый язык ассемблера.......................................................................................285
Посвящается всем медицинским работникам:
медсестрам, врачам и другому персоналу,
осуществляющим уход за пациентами во всем мире.

Тем, кто выложился по полной в эти годы пандемии.


Память о вас останется в наших сердцах навсегда.
Спасибо!
Об авторе

Брюс Смит приобрел свой первый компьютер Acorn Atom


в 1980 году. Увлечение компьютерами мгновенно затянуло
его, и он стал постоянным автором крупных тематических
изданий, включая Computing Today и Personal Computer
World. С появлением компьютера ВВС Micro его работа пе­
решла от журналов к книгам, и его книга 1982 года «Interfac­
ing Projects for ВВС Micro» стала классикой своего времени.
В ней он рассказал простым пользователям домашних ком­
пьютеров, как подключиться к внешнему миру. Он был од­
ним из первых, кто писал о чипе ARM, когда они были пред­
ставлены на Acorn Archimedes в 1987 году.
Брюс рассказывал обо всех аспектах использования компьютера. Его дружелюбный
и понятный стиль письма вдохновил одного рецензента на вот такой отзыв: «Это
первая книга о компьютерах, которую я читал для удовольствия, лежа в постели,
а не ради того, чтобы поскорее заснуть!» Книги Брюса переведены на многие языки
и продаются по всему миру. Его издавали в ВВС Books, Collins, Virgin Books и
Rough Guides.
Брюс родился в лондонском Ист-Энде, а сейчас живет в Сиднее, Новый Южный
Уэльс.
Его сайт в Интернете: www.brucesmith.info.

Из ОТЗЫВОВ С ПЯТЬЮ ЗВЕЗДАМИ НА AMAZON


НА ПРЕДЫДУЩИЕ ИЗДАНИЯ этой книги:
«Отличная книга. Настоятельно рекомендую ее всем, кто хочет работать с ARM-ас­
семблером».
«Эта книга подойдет не только начинающим, но будет также полезна программистам
среднего уровня, и в ней затронуты некоторые более сложные темы. На мой взгляд,
эта книга заслуживает оценки 10/10 и обязательна к прочтению всем, кто планирует
начать или возвращается к программированию на ассемблере на процессоре ARM v6
(Raspberry Pi). Книга сэкономила мне много времени, поскольку вся необходимая ин­
формация теперь собрана в одном месте. Спасибо Брюсу за такое сокровище!»
«Это отличная книга для начинающих программистов, которые хотят глубже изучить
Raspberry Pi и по-настоящему понять, как работает компьютер. Приведены отличные
и ООподробные примеры».
«Смит не только излагает все нужные материалы и инструкции на языке ассемблера
для процессора ARM Raspberry Pi, но также дает четкие практические указания о том,
как заставить все это работать... Не важно, хотите ли вы просто побаловаться с Rasp­
berry Pi, или рассматриваете Pi как ступеньку к чему-то большему— книга Брюса
Смита определенно должна стоять на вашей полке».
1. Введение

Я ничуть не удивился, когда в начале 2013 года появилась новость о том, что про­
дажи контроллеров Raspberry Pi (рис. 1.1) достигли 1 млн штук. А само это число
заставило меня вернуться на несколько лет (даже десятилетий) назад и вспомнить
аналогичную новость о платах ВВС Micro. Обе платформы производятся на пред­
приятии, расположенном в Кембридже в Великобритании, и общего у них гораздо
больше, чем вы можете себе представить.

Рис. 1.1. Плата Raspberry Pi Model В

Обе системы покорили мое сердце и сердца миллионов других людей. На первую я
в свое время спускал все свои сбережения, а вот Raspberry Pi совершенно не удари­
ла по моему кошельку. Но огромная разница в цене была почти единственным раз­
личием, а прочие черты оказались весьма схожи. Одна из самых важных черт —
1 Введение 15

возможность запускать на них широкий спектр программного обеспечения и обра­


зовательных инструментов, а также легкость в подключении внешних устройств
и управлении внешним миром. Я подозреваю, что у большинства владельцев Rasp­
berry Pi лежит не один, а как минимум парочка контроллеров.
Впервые после ВВС Micro на рынке появилась дешевая и невероятно богатая воз­
можностями система, которую может использовать практически каждый. В то же
время на рынке доминировали платформы PC и Мас и появились другие устройст­
ва, более ориентированные на игры. Но ничего из этого не сказалось на тех, чьим
домашним хобби была работа с техникой. У профессионалов имелось множество
платформ для разработки, с которыми можно было экспериментировать, но у до­
машних любителей компьютеров оставались проблемы с доступностью таких
платформ. А вот Raspberry Pi со своей ценой, соизмеримой с парочкой DVD, изме­
нила все.
Запуск Raspberry Pi Zero в ноябре 2015 года вывел экономические преимущества
платформы на новый уровень. Полноценный компьютер на базе ARM можно полу­
чить всего за 5 долларов. Это ж с ума сойти! И, чтобы окончательно добить фана­
тов, к каждому экземпляру MagPi (официального журнала Raspberry Pi) за декабрь
2015 года прилагался контроллер в подарок. Нельзя ли теперь считать Raspberry Pi
первым в мире полноценным компактным компьютером?
На момент подготовки этой книги (декабрь 2020 г.) продажи плат Rapsberry превы­
сили 30 млн штук. Эта отметка, как сообщается, была достигнута к началу 2020 года,
когда многие компании начали использовать Rapsberry Pi в своей инфраструктуре и
разработках. Компания Oracle назвала кластер из 1060 плат Raspberry Pi самым
большим в мире суперкомпьютером Pi с 4240 ядрами. Jet Propulsion Laboratory
(JPL) используют эти платы в своей марсианской миссии.

Безграничные возможности
Одна из причин появления Raspberry Pi заключалась в том, что у людей имелась
необходимость в дешевой системе программирования, пределы возможностей ко­
торой ограничивались бы только воображением пользователя. Я надеюсь, что эта
книга поможет многим из читателей осуществить свою мечту. А это вполне реаль­
но. Весьма вероятно, что чтение этих страниц станет вашим первым шагом к по­
лезному и познавательному времяпрепровождению. И, кто знает, может быть, вы
станете частью нового поколения компьютерных программистов, творящих на пре­
деле возможного.
Цель этой книги — дать читателю лучшее понимание того, как устроена работа
компьютера на уровне ниже высокоуровневых языков программирования, таких
как С или Python. Глубже разобравшись с работой компьютера, вы сможете гораздо
более продуктивно писать программное обеспечение на языках более высокого
уровня. Именно обучение программированию на ассемблере поможет вам достичь
этой цели.
Эта книга представляет собой начальное руководство по написанию кода на
ассемблере для Raspberry Pi и, в частности, с использованием ОС Raspberry Pi
16 1. Введение

(операционной системы, ранее называвшейся Raspbian). Язык ассемблера генери­


рует машинный код, который можно запускать прямо на вашем компьютере.
Сам я сначала учился программировать на ассемблере на машинах, созданных еще
на ранних этапах разработки Acorn, а позднее стал свидетелем развития чипов
ARM в системах Archimedes и ВВС Micro Second-Processor. В конечном итоге
именно тот ассемблер стал предшественником того, что сегодня используется
в Raspberry Pi. Этим я хочу лишь подчеркнуть, что все, чему вы здесь научитесь,
будет полезно и актуально в течение долгих лет. Однозначно, стоящая инвестиция.

Начинаем экспериментировать
Эта книга адресована не совсем уж полным новичкам, однако вам не потребуется
иметь опыт работы с языком ассемблера или машинным кодом, чтобы понять ее и
начать экспериментировать. Тем не менее вам пригодится любой опыт в програм­
мировании, и любой известный вам структурированный язык поможет понять базо­
вые концепции ассемблера.
Поскольку это в первую очередь практическое руководство, мы с вами напишем
множество программ. Чтобы научиться программировать, нужно экспериментиро­
вать, совершать ошибки, а затем учиться на них. Вне всяческих сомнений, лучший
способ понять происходящее— экспериментировать со значениями и данными,
и такое экспериментирование следует поощрять. Все изложенные в книге програм­
мы можно будет скачать с сайта книги. Книга одинаково применима ко всем верси­
ям Raspberry Pi. Но подробнее об этом чуть позже.

Компилятор GNU С
Существует несколько операционных систем (сред программирования), которые вы
можете скачать для работы с Raspberry Pi. Как следует из ее названия, в этой книге
мы будем работать с ОС Raspberry Pi (ранее называвшейся Raspbian). В ней есть
все, что вам потребуется для написания и запуска ваших программ.
Также для работы нам потребуется GCC — коллекция компиляторов GNU. Перво­
начальным автором компилятора GNU С (GCC) был Ричард Столлман, основатель
проекта GNU. Проект GNU был запущен в 1984 году с целью создания полноцен­
ной свободно доступной операционной системы, которая дала бы свободу сотруд­
ничеству между пользователями компьютеров и программистами. Любой операци­
онной системе нужен компилятор С, и, поскольку в те времена свободно доступных
компиляторов не существовало, проекту GNU пришлось писать свои с нуля.
Работа финансировалась за счет пожертвований физических лиц и компаний
в Фонд свободного программного обеспечения— некоммерческую организацию,
созданную для поддержки проекта GNU. Первая версия GCC вышла в 1987 году.
С тех пор GCC стал одним из важнейших инструментов в разработке бесплатного
программного обеспечения и работает практически на всех существующих ОС.
GCC — бесплатное программное обеспечение, распространяемое под Стандартной
публичной лицензией GNU (GNU General Public Licensee). Это означает, что вы
1. Введение 17

можете использовать и изменять GCC, как и все программное обеспечение GNU.


Если вам нужна поддержка нового ЦП, нового языка или новой функции, вы може­
те добавить ее самостоятельно или попросить кого-нибудь сделать это за вас.
Вы, наверное, знаете, что С — чрезвычайно популярный язык программирования, а
еще он очень тесно связан с микропроцессором Advanced RISC Machine (ARM),
который используется в ядре Raspberry Pi. Но вам не обязательно знать С, чтобы
писать программы на ассемблере, поэтому этим не озабочивайтесь.
GCC — очень умная программа, и использовать ее можно по-разному. Одним из ее
ключевых компонентов является ассемблер, который нас, собственно говоря, и ин­
тересует в первую очередь.

Учимся на примерах
Программы, приведенные в этой книге, призваны проиллюстрировать вам концеп­
ции, которые я буду объяснять простым языком и, где это возможно, с практиче­
ской точки зрения. Я не буду грузить вас длинными и сложными листингами про­
грамм, да и нет в этом необходимости. Я буду давать простые примеры и информа­
цию и объединять их в группы по два, три, четыре и более, чтобы программа
в итоге получала полезный результат, а вы научились бы многому в процессе ее
создания.
Иногда возникают вопросы вроде «курицы и яйца», но я старался свести их к ми­
нимуму. Мы будем вводить новые понятия в порядке, соответствующем получен­
ным знаниям. Однако это не всегда возможно, и на этих моментах я буду останав­
ливаться отдельно. В таких случаях вам придется просто поверить, что это работа­
ет, и однажды станет ясно, почему.
Программирование — это и впрямь весело. Я написал множество книг на эту тему,
и значительная часть из них была посвящена домашним компьютерам и тому, как
их программировать и использовать. Меня никто не учил работе с компьютерами.
А если я могу сделать что-то, значит, сможет и любой другой человек. Но в этом
есть и доля огорчения! Нет на свете ни одного программиста, будь то новичок или
эксперт, который не тратил бы кучу времени на решение некоторой задачи про­
граммирования с тем, чтобы позже понять, что решение было прямо у него под
носом. Настоящее удовлетворение приходит тогда, когда вы сами решаете задачу.
Дам совет: если вы не можете решить проблему, отвлекитесь и займитесь чем-
нибудь еще. Очень часто решение приходит к вам именно тогда, когда вы занимае­
тесь чем-то другим. Это работает не только в программировании, но и в жизни!

Что вы узнаете?
Если говорить коротко, вы станете опытным программистом на ассемблере. К кон­
цу этой книги, если вы проработаете и примените на практике приведенные в ней
примеры программ, вы сможете разрабатывать, писать и создавать программы
с машинным кодом для выполнения огромного множества задач. Вы также получи-
18 1 Введение

те основу, позволяющую углубиться в другие темы, касающиеся микросхем ARM


и системного программирования.
Вы также познакомитесь с различными способами использования компилятора
GCC, включая написание кода для операционной системы Raspberry Pi и объедине­
ние собранных программ с библиотеками автономных функций.
Вы узнаете, как интерпретировать и управлять возможностями платы Raspberry Pi
на фундаментальном уровне. Вы будете писать инструкции непосредственно для
чипа ARM.
Вам также необходимо научиться решать проблемы. Когда программа с машинным
кодом начинает работать неправильно, причиной этого часто является простая ло­
гическая ошибка. У GCC есть встроенные инструменты отладки, и мы увидим, как
их эффективно использовать. Я также дам несколько полезных советов о том, как
сузить область поиска и в конечном итоге найти источник проблемы.

Совместимость четвертого издания книги


В принципе, эта книга совместима со всей линейкой компьютеров Raspberry Pi.
Один из основных принципов разработчиков аппаратного и программного обеспе­
чения этой системы — обеспечить ее обратную совместимость (насколько это воз­
можно). По сути, это означает, что программа, которая работает на одной модели
Raspberry Pi, будет работать и на другой, если она написана правильно (с точки
зрения программного обеспечения). Стороннее оборудование тоже должно рабо­
тать, за исключением имеющего некоторые аппаратные изменения. Например, порт
HDMI работать будет, но подключаться к нему придется через другой кабель
(к примеру, не стандартный, а с микроразъемом).
Физически разница между моделями и версиями достаточно очевидна (рис. 1.2).
Для целей этой книги я буду исходить из предположения, что у вас есть плата

Рис. 1.2. Raspberry Pi 4 Model В


1 Введение 19

с портом GPIO в стандартной комплектации, а именно здесь с точки зрения этой


книги проявляется значительная часть изменений. Вам станет понятно, что я имею
в виду, когда вы станете рассматривать некоторые из примеров, в которых показа­
но, как использовать код для подключения к устройствам. О необходимых измене­
ниях я также буду предупреждать.
К сегодняшнему моменгу плата Raspberry Pi сменила несколько различных версий
чипа ARM, и это может продолжаться и в будущем. В настоящее время просто
имейте в виду, что различия могут быть, но они станут видны вам по мере роста
ваших знаний. Поскольку книга эта, по сути, адресована новичкам, имеющиеся
различия не повлияют на основные понятия программирования. Эта книга — вве­
дение в язык ассемблера ARM, независимо от модели Raspberry Pi, которую вы ис­
пользуете.

ОС Raspberry Pi
Когда появилась новость о выпуске Raspberry Pi 4 с объемом памяти 8 Гбайт (май
2020 г.), компания Raspberry Pi Foundation сообщила, что меняет название своей
официальной операционной системы с Raspbian на Raspberry Pi OS. Целью такого
изменения явилось создание аналогичной и стабильной операционной системы и
среды в стиле Windows для всех платформ, а также по максимуму, насколько воз­
можно, обеспечение постоянной обратной совместимости с программным обеспе­
чением и приложениями.
Имеются две основные категории процессоров: 32-разрядные и 64-разрядные.
Платформа поддерживает как 32-разрядные, так и 64-разрядные операционные сис­
темы, и внешний вид ОС не меняется, т. к. сборка этих версий происходит отдель­
но. Попросту говоря, 64-разрядный процессор более эффективен, чем 32-разряд-
ный, т. к. он может обрабатывать больше данных одновременно. 64-битный про­
цессор способен хранить больше значений, включая адреса памяти, и имеет
в распоряжении в 4 млрд раз больше адресов, чем физическая память 32-разрядного
процессора. Это очень круто!
С точки зрения пользователя, использующего стандартную 32-разрядную операци­
онную систему, функциональной разницы в том, что описано в этой книге, не
будет. Читайте Raspberry Pi OS вместо Raspbian и наоборот. Что еще более важно,
ОС остается обратно совместимой, так что ОС Raspberry Pi будет работать на всех
версиях Raspberry Pi. Вы можете обновить текущую операционную систему до по­
следней версии Raspberry Pi OS в любой момент.
Проект Raspbian не сворачивается и, несомненно, ляжет в основу при создании
32-разрядной версии ОС Raspberry Pi. Учитывая, что несколько моделей Raspberry
Pi, включая очень популярную Raspberry Pi Zero, никогда не будут работать
с 64-разрядной ОС, 32-разрядная платформа еще несколько лет останется востребо­
ванной, если не доминирующей.
20 1. Введение

А что насчет 64-разрядной системы?


Raspberry Pi 2В (vl.2) была первой платой с 64-разрядным процессором ARM, но
для него не было выпущено официальной 64-разрядной ОС. Дело в том, что
Raspberry Pi Foundation сосредоточилась в основном на том, чтобы 32-разрядная
ОС Raspbian работала на всех поколениях RPi. Начиная с упомянутой Raspberry Pi
2В (vl.2), все версии RPi работают на 64-разрядных процессорах, которые также
могут работать в 32-разрядном режиме.
32-разрядный режим микросхемы ARM называется AArch32 (или А32), а 64-раз-
рядный — AArch64 (или А64). Это означает, что 32-разрядное программное обес­
печение может работать на 64-разрядном чипе ARM, а вот наоборот — нет.
На момент подготовки книги уже вышла бета-версия 64-разрядной ОС Raspberry Pi,
и вы можете скачать и попробовать ее. После отработки бета-версии она будет вы­
пущена для всех 64-разрядных плат (см. главу 30). Обратите внимание, что 32-раз-
рядная версия (А32) языка ассемблера ARM отличается от 64-разрядной версии
(А64), поэтому код, написанный на А32, не будет просто так работать на А64 без
определенных изменений.

Клавиатурные вычисления
В ноябре 2020 года произошло неизбежное: наконец-то появились настольные ком­
пьютеры на Raspberry Pi, в которых плата была модернизирована и упакована
в красно-белую клавиатуру для запуска Raspberry Pi 400 (рис. 1.3).

Рис. 1.3. Raspberry Pi 400 — идеальный компьютер для клавиатурных вычислений

Значимость ARM
Все микропроцессоры основаны на определенной архитектуре набора команд
(ISA), и наиболее значимой из них в последние годы была архитектура х86, которая
доминировала на рынке настольных компьютеров и ноутбуков (ПК и Apple). В по­
следнее время также используется 64-разрядная версия архитектуры под названием
х86-64, или AMD64.
Однако большинство планшетов и смартфонов Apple и Android работают на про­
цессорах ARM, несовместимых с архитектурой х86. Чип ARM на этих устройствах
1. Введение 21

используется из-за его низкого энергопотребления и, как следствие, увеличения


времени автономной работы. Но эта несовместимость означает, что программное
обеспечение, скомпилированное для настольных компьютеров и ноутбуков, нельзя
напрямую запустить на мобильных устройствах под управлением ARM.
Вычислительные процессоры с сокращенным набором команд (или процессоры
RISC), применяемые в устройствах ARM, используют для выполнения задачи мно­
жество простых инструкций. Процессоры х86 работают на CISC (сложном наборе
команд) и для выполнения аналогичной задачи задействуют большее число слож­
ных инструкций.
За счет этого в чипах ARM и достигается более низкое энергопотребление, по­
скольку в их структуре ядра меньше транзисторов, чем у чипов на основе CISC.
Это также означает, что, с точки зрения программиста, вам, как программисту
ARM, придется учить меньше инструкций!
Другое очень важное отличие состоит в том, что компания ARM Holdings не явля­
ется производителем микросхем. Она разрабатывает микросхемы, а затем продает
лицензии на их производство, чтобы другие производители могли включить их
в свои собственные разработки.
В середине 2020 года компания Apple Computers объявила, что полностью перейдет
на собственные чипы ARM, которые будут устанавливаться во все новые компью­
теры, что обеспечит работоспособность ее приложений на всех выпускаемых ею
устройствах. Microsoft Office 365, Adobe Creative Cloud и прочие программы, веро­
ятно, тоже станут запускаться на новых компьютерах Mac ARM. Не требуется
большого воображения, чтобы представить, как это будет работать на любой ма­
шине на базе ARM.
Ноутбуки и настольные компьютеры на базе х86 еще какое-то время продолжат
доминировать на рынке, по крайней мере с точки зрения количества выпускаемых
компьютеров, но машины Apple Мас на базе ARM должны вывести на основной
рынок ноутбуки/настольные компьютеры на базе ARM и могут соблазнить этим
других игроков.
А это — еще один повод изучать программирование на ассемблере ARM.

Raspberry Pi сквозь века


Платформа Raspberry Pi развивается с момента первого выпуска в 2012 году. В ка­
ждом новом поколении часто внедряются значительные улучшения типа централь­
ного процессора, емкости памяти, поддержки сети и периферийных устройств.
Некоторые из основных спецификаций для каждой из моделей Raspberry Pi приве­
дены в табл. 1.1. Как правило, Raspberry Pi бывают трех разных моделей:
♦ Model В— это «полноразмерные» платы с портами Ethernet и USB. В версиях
В+ часто добавляются улучшения или особые различия;
♦ Model А— это платы квадратной формы. Их можно считать «более легкой»
версией Raspberry Pi, обычно с более низкими характеристиками, чем у флаг-
22 1 Введение

майской модели В, с меньшим количеством портов USB и часто без Ethernet.


Поэтому они дешевле;
♦ Zero— самый маленький доступный вариант Raspberry Pi. У этих плат меньше
вычислительной мощности, чем у модели В, но они также потребляют меньше
энергии. Ни USB, ни Ethernet - все простенько и со вкусом!
Объем памяти, доступный на каждой Raspberry Pi, для этой книги значения не име­
ет, но имейте в виду, что адреса в памяти, которые будут отображаться в вашей
программе, могут отличаться от приведенных в книге примеров. Однако это не
должно мешать работе программы.

Таблица 1.1. Модели Raspberry Pi и их основные характеристики

Модель Дата
RPI выпуска
SOC цп FPU GPU ARM IS

400 Ноябрь ВСМ 2711 СО 4 х Cortex-A72 VFPv4 + Broadcom ARMv8-A


2020 г. с частотой 1,8 ГГц NEON VideoCore VI (64/32-бит)

4В Июнь 2019 г.; ВСМ2711В0 4 х Cortex-A72 VFPv4 + Broadcom ARMv8-A


май 2020 г. с частотой 1,5 ГГц NEON VideoCore VI (64/32-бит)
(8 Гбайт)

ЗВ + Май 2018 г. ВСМ2837В0 4 х Cortex-A53 VFPv4 + Broadcom ARMv8-A


с частотой 1,4 ГГц NEON VideoCore IV (64/32-бит)

ЗВ Февраль ВС2837 4 х Cortex-A53 VFPv4 + Broadcom ARMv8-A


2016 г. с частотой 1,2 ГГц NEON Videocore IV (64/32-бит)

ЗА + Ноябрь ВСМ2837В0 4 х Cortex-A53 VFPv4 + Broadcom ARMv8-A


2018 г. с частотой 1,4 ГГц NEON Videocore IV (64/32-бит)

2BV1.2 Октябрь ВСМ2837 4 х Cortex-A53 VFPv4 + Broadcom ARMv8-A


2016 г. с частотой 900 МГц NEON Videocore IV (64/32-бит)

2В Февраль ВСМ2836 4 х Cortex-A7 VFPv3 + Broadcom ARMV7-A


2015 г. с частотой 900 МГц NEON Videocore IV (32-бит)

1 В+ Июль 2014 г. ВСМ2835 1 х ARM 1176JZF-S VFPv2 Broadcom ARMv6Z


с частотой 700 МГц Videocore IV (32-бит)

1В Май 2012 г. ВСМ2835 1 х ARM 1176JZF-S VFPv2 Broadcom ARMV6Z


с частотой 700 МГц Videocore IV (32-бит)

1 А+ Ноябрь ВСМ2835 1 х ARM 1176JZF-S VFPv2 Broadcom ARMv6Z


2014 г. с частотой 700 МГц Videocore IV (32-бит)

1 А Февраль ВСМ2835 1 х ARM1176JZF-S VFPv2 Broadcom ARMv6Z


2013 г. с частотой 700 МГц Videocore IV (32-бит)

Zero Февраль ВСМ2835 1 х ARM 1176JZF-S VFPv2 Broadcom ARMv6Z


W/WH 2017 г. с частотой 1 ГГц VideoCore IV (32-бит)

Zero . Май 2016 г. ВСМ2835 1 х ARM 1176JZF-S VFPv2 Broadcom ARMV6Z


v1.3 с частотой 1 ГГц VideoCore IV (32-бит)

Zero Ноябрь ВСМ2835 1 х ARM1176JZF-S VFPv2 Broadcom ARMv6Z


v.1.2 2015 г. с частотой 1 ГГц VideoCore IV (32-бит)
1. Введение 23

В табл. 1.1 используется много сокращений, которые могут быть вам знакомы, а
могут быть и новыми. Мы кратко рассмотрим каждое из них и при необходимости
повторно вернемся к ним позже в книге.
♦ SOC, System-on-Chip (Система на кристалле) — системный чип. Один из ключе­
вых элементов дизайна Raspberry Pi и, как правило, самый большой чип на пла­
те, который содержит все важные компоненты в одном корпусе. В него входят
процессор ARM и графические процессоры. Обратите внимание, что каждый
чип SoC сопровождается числом — например, на плате Raspberry Pi 4 В уста­
новлен чип ВСМ2771.
♦ ЦП- это процессор ARM или используемые процессоры, интегрированные
в SoC. В таблице указан конкретный чип ARM, а также количество его ядер и
скорость работы. К примеру, на оригинальном Raspberry Pi В установлен про­
цессор ARM 1176JZF-S, работающий на частоте 700 МГц. В новой Raspberry Pi 4 В
используются четыре ядра ARM Cortex-A72, работающие на частоте 1,5 ГГц.
♦ FPU — модуль с плавающей точкой, или математический сопроцессор, который
реализует сложные математические функции. Он тоже входит в SoC, а в более
поздних версиях SoC установлен сопроцессор Neon, позволяющий FPU выпол­
нять несколько операций параллельно. VFP — это сокращение от Vector floating­
point, вектор с плавающей точкой.
♦ GPU — графический процессор. Он входит в SoC Broadcom, производится компа­
нией Broadcom и обычно представляет собой VideoCore IV, а в Raspberry Pi 4 В —
версию VideoCore VI. По сути, это мультимедийный процессор, который может
декодировать различные графические и звуковые форматы (кодеки) для обеспе­
чения отличного качества изображения на мониторе при сохранении низкого
энергопотребления.
♦ В последнем столбце таблицы указана реализованная архитектура набора
команд и отмечено, является она 32-разрядной или 64-разрядной. Как мы уже
говорили ранее, 64-битный набор инструкций доступен на Raspberry Pi, начиная
с RPi 2 В vl .2, т. е. фактически с октября 2016 года.

Вычислительные модули
Вычислительный модуль (Computer Module)— это упрощенная версия Raspberry
Pi, предназначенная для промышленных или коммерческих приложений. Суть
в том, что их может использовать в своих проектах кто угодно (вы приобретаете
плату и дорабатываете ее самостоятельно под свою задачу). Таким образом, вычис­
лительные модули не имеют возможностей подключения, которые вы можете най­
ти на эквивалентной плате Raspberry Pi, но при этом они не столь надежны. Поэто­
му, хоть они и работают на процессорах ARM и на Raspberry Pi, они здесь не рас­
сматриваются.
Но затем появился модуль Computer Module 4. В отличие от предыдущих вычисли­
тельных модулей, у него имеется обновленная плата ввода/вывода, простой доступ
24 1. Введение

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

Используемые обозначения
В этой книге применяются стандартные обозначения. Числовые типы и определен­
ные операции с числами часто используются в книгах по программированию, по­
добных этой, и важно различать их. В табл. 1.2 приведен их краткий список. Точное
значение обозначений будет ясно, когда мы встретим их в тексте книги.

Таблица 1.2. Стандартные обозначения

Обозначение Пояснение

% или оь Обозначает, что идущее за этим обозначением число записано в двоичной


системе счисления (с основанием 2).
Например: %ииоооо или оыиюооо
Ох Обозначает, что следующее за ним число является шестнадцатеричным.
Например: Oxcafe
< > Угловые скобки часто используются для обозначения слова, которое
не следует понимать буквально, а надо расценивать как объект, исполь­
зуемый с командой. Например, запись <Ретстр> означает, что в угловых
скобках следует использовать имя регистра — например: ro, а не само
слово «Регистр»
Dest Сокращение ОТ destination
Операнд1 Комментарии в тексте часто будут ссылаться на операнд] и его использо­
вание. Вы же мысленно подставляете вместо него те или иные значения.
Обычно операнд!. — это регистр
Операнд2 Комментарии в тексте часто будут ссылаться на операнд2 и его использо­
вание. Вы же мысленно подставляете вместо него те или иные значения.
Обычно операнд]. — ЭТО регистр
0п1 Сокращение от операнд1
Оп2 Сокращение от операнд2
0 Скобки показывают, что указанный в них элемент является необязатель­
ным и может быть опущен, если он не нужен. Например, запись add(S)
означает, что значения s может и не быть

Центр истории вычислительной техники


Центр истории вычислительной техники (ССН, Center of Computing History) — но­
ваторская образовательная благотворительная организация, открывшаяся на своем
нынешнем месте в Кембридже в августе 2013 года. ССН (www.computinghistory.
org.uk) раскрывает историю информационной эпохи на основе изучения историче­
ского, социального и культурного воздействия разработок в области персональных
компьютеров на человеческую цивилизацию. В этом центре имеется огромная кол-
1. Введение 25

лекция иллюстрирующих эту историю экспонатов, которые используются в обра­


зовательных программах и программах мероприятий.
Цель ССН— вдохновить и дать возможность обучения всем: от дошкольников до
людей старше 70 лет, чтобы они стали уверенными и творческими пользователями
информации и цифровых технологий. Центр предоставляет образовательные услу­
ги, включая семинары по программированию и электронике, а также другое интер­
активное обучение с использованием ВВС Micros и Raspberry Pi 1980-х годов.

Веб-сайт и бесплатные книги


Зайдите на сайт www.brucesmith.info (рис. 1.4), щелкните на интересующей вас
книге и следуйте появляющимся там указаниям. С этого сайта вы можете скачать
все приведенные в книге программы, получить доступ к обновлениям книги, а так­
же к дополнительной информации и функциям. Кроме того, здесь же вы найдете
ссылки на другие полезные сайты и полезные материалы, а также подробную ин­
формацию о предстоящих публикациях Bruce Smith Books, посвященных Rasp­
berry Pi.

Рис. 1.4. Сайт автора. Нажмите на обложку книги для получения дополнительной информации

Примечание к русскому изданию


Электронный архив с файлами приведенных в книге программ можно загрузить с FTP-
сервера издательства «БХВ» по ссылке: ftp://ftp.bhv.ru/9785977568012.zip или со
страницы книги на сайте https://bhv.ru/ (см. приложение 4). Обратите при этом внима-
26 1. Введение

ние, что автор использует для нумерации программ в книге и в электронном архиве
цифробуквенную запись: За, 6а, 6Ь и т. д., мы же нумеруем программы в книге более
привычной нашему читателю цифровой записью: 3.1,6.1,6.2 и т. д.

Бесплатно скачать с этого сайта можно и PDF-файлы некоторых из моих книг. Это
книги, которые были опубликованы до 2004 года, т. е. до эры электронных книг и
самопубликации. И хотя я написал многие из них (фактически все, кроме двух пер­
вых), используя текстовый процессор, исходный их текст давно утрачен (первые
два были вообще написаны от руки — синими чернилами на листах формата А4
в линейку!)

Благодарности
Спасибо Ричарду Хури за его помощь с кодом С в этой книге и его мастерство ра­
боты с GCC и GDB. Спасибо Майку Гиннсу за идеи некоторых приведенных в кни­
ге программ. Некоторые листинги взяты из его книги Archimedes Assembly
Language, которая впервые была опубликована Dabs Press в 1988 году (представьте,
сколько лет уже существует ARM!) Кроме того, я благодарен Брайану Скаллану,
Стиву Сирелли и Тони Палмеру за их отзывы. Я также признателен многим читате­
лям, которые присылали мне предложения по улучшению этой книги.
2. Начало

Ассемблер как язык позволяет вам обращаться к родному языку Raspberry Pi —


машинному коду. Это собственный язык ARM-чипа, который по сути есть разум и
душа вашей компьютерной системы. ARM расшифровывается как Advanced RISC
Machine (продвинутая машина с сокращенным набором команд), и именно этот чип
заведует всем, что происходит с вашей Raspberry Pi.
Микропроцессоры, такие как ARM, управляют использованием и передачей дан­
ных. Процессор также часто называют ЦП — центральным процессором, и данные,
которые обрабатывает ЦП, текут сквозь него в виде непрерывного, почти беско­
нечного потока единиц и нулей. Порядок этих единиц и нулей не случайный, и оп­
ределенная их последовательность превращается в набор определенных действий.
Это похоже на азбуку Морзе, где правильная последовательность точек и тире пре­
вращается в осмысленные буквы и слова.
.-............... - . .-. (здесь закодировано слово CLEVER, умный)

Числа со смыслом
Сама программа, написанная машинным кодом, представляет собой бессчетное
множество строк из единиц и нулей. Вроде вот этого:
11010111011011100101010100001011
01010001011100100110100011111010
01010100011001111111001010010100
10011000011101010100011001010001

Понять, что именно означают эти числа, почти невозможно (или возможно, но по­
требовало бы очень много времени). Ассемблер помогает преодолеть эти проб­
лемы.
Язык ассемблера — это своего рода сокращенная форма, которая позволяет писать
программы машинного кода с помощью английской лексики. А ассемблер — это
программа, которая переводит программу на языке ассемблера в машинный код,
избавляя нас от трудоемкой и рутинной расшифровки цифр. Программа на языке
ассемблера часто представляет собой обычный текстовый файл, который читается
28 2. Начало

компилятором и преобразуется в двоичный эквивалент (из единиц и нулей). Про­


грамма на языке ассемблера называется входным, или исходным, файлом, а машин­
ный код — объектным файлом. Ассемблер переводит (или компилирует) исходный
файл в объектный файл.
Язык ассемблера написан с использованием мнемоники. Мнемоника — это меха­
низм быстрого обучения и запоминания, который основывается на ассоциациях
между легко запоминающимися последовательностями букв и информацией, кото­
рую нужно запомнить. В естественном языке ту же функцию выполняют аббревиа­
туры. Например, чтобы запомнить цвета радуги, вы можете использовать фразу:
«Каждый Охотник Желает Знать, Где Сидит Фазан», и взять первую букву каждого
слова.
В среде SMS-сообщений и интернет-чатов тоже возник свой мнемонический язык.
Благодаря ему текстовые сообщения становятся короче и компактнее. Например,
«мп» может означать «мои поздравления», «спс» — «спасибо», а «дв» — «до
встречи».

Команды ARM
У микросхемы ARM есть определенный набор команд машинного кода, которые
она понимает. Именно таким операциям (или «кодам операций») и их использова­
нию посвящена эта книга. ARM— это всего лишь один из типов микропроцес­
соров. Существуют и другие типы, и у каждого из них свой уникальный набор
команд.
Нельзя просто так взять программу машинного кода, написанную для ARM, и ус­
пешно запустить ее на другом микропроцессоре. Она либо не сработает так, как
ожидалось, либо вообще не запустится. Но понятия и концепции, о которых мы по­
говорим, будут применимы в работе с большинством других видов микропроцессо­
ров и в аналогичных задачах. Если вы научитесь программировать на одном ас­
семблере, с программированием на других будет уже проще. По сути, в новом язы­
ке нужно будет просто выучить новый набор команд, причем многие из них будут
похожи на уже известные вам.
Микропроцессоры в ходе своей работы перемещают и обрабатывают данные, по­
этому неудивительно, что многие команды машинного кода посвящены именно
этим операциям и у большинства наборов команд (собирательный термин для этих
мнемоник) есть команды для сложения и вычитания чисел. Мнемоника языка ас­
семблера, используемая для этих операций, обычно выглядит так:
ADD
SUB

Это простой пример, и многие другие мнемоники ARM тоже просты, если рассмат­
ривать их в отдельности. Но вот последовательность строк, объединенная в цель­
ную программу, выглядит уже сложнее. Разбив программу на составные части,
можно без труда понять, как все работает.
2. Начало 29

Мнемоника языка ассемблера обычно состоит из трех символов, но иногда их бы­


вает и больше. Как и в любом новом деле, вам нужно будет немного привыкнуть,
но, если вы проработаете примеры, приведенные в этой книге, и примените их
в своих собственных экспериментах, у вас не должно возникнуть особых проблем.
Так, mov— мнемоника команды MOVe (переместить). Эта команда берет информа­
цию из одного места и перемещает ее в другое место. Проще простого, да?

Процесс преобразования
Когда вы разработали свою программу на языке ассемблера, ее нужно преобразо­
вать в машинный код с помощью компилятора ассемблера. Например, когда ас­
семблер встречает мнемонику mov, он подставит вместо нее число, которое для
процессора представляет собой инструкцию. Ассемблер сохраняет собранный ма­
шинный код в виде файла в памяти, после чего этот код можно будет запускать или
выполнять. В процессе сборки программы ассемблер также проверяет ее синтаксис,
чтобы убедиться в том, что все написано правильно. Если он обнаружит ошибку, то
сообщит вам об этом и скажет ее исправить. Исправив проблему, вы можете еще
раз попробовать собрать программу. Обратите внимание, что проверка синтаксиса
гарантирует лишь правильность написания самих команд ассемблера. Но никто не
проверит за вас логику программы, и поэтому, если вы написали сами команды
правильно, но суть изложили неверно, программа соберется, но сработает неверно.
Например, вам нужно сложение, а вы вместо этого вы запрограммировали вычи­
тание!
Написать программу на ассемблере можно разными способами. Первые чипы ARM
были разработаны Acorn и, как и стоило ожидать, они появились в ряде компьюте­
ров на базе Асот, работающих под управлением ОС RISC. К ним относились
Archimedes и RISC PC. На этих машинах использовался компилятор ВВС BASIC,
который был чем-то новым в том смысле, что позволял писать программы на языке
ассемблера как расширение ВВС BASIC. Вы и сейчас можете писать этим методом,
установив RISC OS на свою Raspberry Pi.
Как вы уже поняли, в этой книге мы предполагаем, что вы используете операцион­
ную систему Raspberry Pi и программное обеспечение GNU GCC. Есть и другое ПО
для ассемблера, причем большая часть его бесплатна, и вы без труда найдете его
в Интернете. Основным преимуществом программирования на GCC является то,
что этот компилятор также может собирать программы, написанные на языке С.
Эта книга не посвящена программированию на С, но по ряду причин нам будет по­
лезно познакомиться с некоторыми его моментами, и даже эта малость может по­
мочь вам в написании программ. Подробнее мы поговорим об этом в книге на при­
мерах позже.
В целом вам ничто не мешает попробовать любой другой или вообще все ассемб­
леры, и знания, которые вы получите в этой книге, помогут вам в этом.
30 2. Начало

А зачем вообще машинный код?


На этот вопрос ответить нетрудно. По сути, все, что делает ваш Raspberry Pi, вы­
полняется с использованием машинного кода. Программируя напрямую в машин­
ном коде, вы работаете на самом фундаментальном уровне работы Raspberry Pi.
Когда вы используете язык высокого уровня, такой как ВВС BASIC или Python, все
его операции все равно превращаются в машинный код всякий раз, когда вы запус­
каете программу. Это занимает некоторое время, хотя для нас эти доли секунды и
незаметны. Но тем не менее процесс преобразования, или интерпретации, замедля­
ет работу программного обеспечения. Фактически даже самые эффективные языки
могут быть более чем в 30 раз медленнее, чем их эквивалент машинного кода, и это
еще если повезет!
Если же вы программируете на машинном коде, программа будет работать намного
быстрее, поскольку здесь преобразование не выполняется. Когда вы запускаете ас­
семблер, процесс преобразования происходит один раз, но однажды преобразован­
ный машинный код можно многократно запускать напрямую. Необязательно за­
пускать ассемблер каждый раз. Если вы довольны работой своей программы, то
можете сохранить машинный код и использовать именно его. Вы также можете со­
хранить исходную программу на языке ассемблера и работать с ней, особенно если
хотите что-то поменять в ее коде позже.

Языковые уровни
Языки вроде С или Python называются языками высокого уровня. На языках высо­
кого уровня часто легче писать, поскольку их синтаксис похож на английский язык,
а еще в них есть команды, которые выполняют большую и сложную последова­
тельность действий, для подробного расписывания которой потребовался бы длин­
ный список команд машинного кода. Машинный код — это язык низкого уровня.
поскольку он работает в самых внутренностях компьютера, описывая каждое дей­
ствие, и из-за этого его труднее понимать.
Это, конечно, преимущество языков высокого уровня по сравнению с языками низ­
кого уровня. Но пока вы набираетесь опыта в языке ассемблера, ничто не мешает
вам создавать библиотеки подпрограмм для выполнения конкретной задачи и про­
сто добавлять их в свои программы по мере их написания. Впрочем, если вы углу­
битесь в мир ARM, то выяснится, что нужные библиотеки уже существуют.
Написанные на ассемблере программы легко переносить на другие компьютеры
или системы, работающие на чипе ARM. Нужно лишь загрузить файл ассемблера
в компилятор на новой машине, собрать код в программу машинного кода и запус­
тить ее.
Компилятор GNU GCC есть практически на всех разновидностях микропроцессо­
ров, поэтому, познакомившись с GCC, вы сможете перенести свои новые навыки на
другие системы, если захотите.
Если раскрыть возможности чипа ARM на полную катушку, вы даже можете на­
прямую передавать и запускать машинный код. Эти возможности невероятно кру-
2. Начал о 31

ты, особенно учитывая тот факт, что почти каждый существующий сегодня смарт­
фон или планшет работает на чипах ARM!

На орбиту!
Чтобы еще раз подчеркнуть возможности чипа ARM и смартфонов в целом, вспом­
ним, что на орбиту Земли было выведено целое новое поколение спутников под
названием CubeSats (рис. 2.1). Они небольшие (порядка 10 см) и выполняют опре­
деленные задачи. Космический центр Суррея на юге Великобритании разработал
несколько спутников CubeSat, которые работают на смартфонах Android. Эти спут­
ники стоят около 100 тыс. долларов каждый, что гораздо меньше, чем стоимость
аппаратов прошлого поколения. Опять же, вычислительная мощность одного со­
временного смартфона, возможно, в десятки тысяч раз больше, чем у компьютеров
всех лунных миссий Аполлона, вместе взятых! И вся эта мощь— вот она, прямо
в Raspberry Pi.

Рис. 2.1. Изготовление CubeSat

Но не все коту масленица! У плат есть различия в версиях ЦП. Как и в случае
с программным обеспечением, чип ARM постоянно совершенствовался и возника­
ли проблемы с новыми версиями. Однако базовый набор команд остается прежним,
поэтому «перенос» будет не так сложен, как может показаться. Реальной пробле­
мой он становится только в том случае, если вы используете более продвинутые
функции микропроцессора. Для нашего вводного руководства эти изменения не
актуальны, так что в этой книге все подойдет к вашей Raspberry Pi.
32 2. Начало

RISC и наборы команд


Буква R в аббревиатуре ARM означает RISC. Это тоже сокращение от Reduced
Instruction Set Computing (вычисления с сокращенным набором команд). Все про­
цессоры работают на машинном коде, и каждая из команд машинного кода или код
операции выполняет свою определенную задачу. Объединенные вместе, команды
образуют набор команд.
Идея RISC заключалась в создании небольшого оптимизированного набора команд.
У этого подхода есть несколько преимуществ — меньше придется запоминать. Но
при этом образуется большее разнообразие в их использовании.

Структура ассемблера
Программирование на любом языке, как и общение на любом языке, подчиняется
некоторому ряду правил. Эти правила определяются структурой и синтаксисом
языка, который мы используем. Чтобы писать программы, нам нужно знать синтак­
сис языка и правила, которые определяют структуру программы.
Самый простой способ разработать программу— просто написать список задач,
который она должна выполнить. Программа начинается с начала и выполняется
команда за командой, пока не дойдет до конца. Другими словами, все команды вы­
полняются по очереди, пока не будет достигнут конец программы. Это работает, но
весьма неэффективно.
Современные языки более структурированы и позволяют писать программы в виде
множества независимо выполняемых процедур, или подпрограмм. Эти подпро­
граммы вызываются из основной программы по мере необходимости. Таким обра­
зом, основная программа управляет потоком выполнения и запускает операции,
которые подпрограммам недоступны.
Программы, написанные с помощью подпрограмм, получаются меньше и лучше
поддаются редактированию. В линейной программе нам, вероятно, пришлось бы
много раз повторять большие участки кода, чтобы выполнить поставленную задачу.
В листинге 2.1 показан некоторый псевдокод, на примере которого я иллюстрирую,
как может выглядеть структурированная программа. В этом примере команды про­
граммы написаны прописными буквами. Разделам кода подпрограммы даются
имена, которые пишутся в нижнем регистре и, как это ни парадоксально, с точкой
в начале записи. Весь поток программы содержится в шести строках, начинающих­
ся с раздела .main и заканчивающихся словом end. Программа получается короткой,
но читается ясно, и с первого взгляда становится понятно, что в ней происходит.
Подпрограммам специально даются осмысленные имена.
В этом примере основная программа просто вызывает некоторые подпрограммы.
В идеальном мире мы бы писали именно такие программы, поскольку такой подход
также упрощает тестирование этих подпрограмм по отдельности, прежде чем мы
включим их в основную программу. Это позволяет гарантировать, что наша про­
грамма будет работать правильно.
2. Начало 33

.main
DO getkeyboardinput
DO displayresult
DO getkeyboardinput
DO displayresult
END
.getkeyboardinput
; Instructions to read input from keyboard
RETURN
.displayresult
; print the result on the screen
RETURN

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

Кросс-компиляторы
С этим термином вы, вероятно, будете сталкиваться часто. Компилятор GCC встре­
чается на множестве компьютеров, и даже на тех, которые не работают на чипе
ARM. Вы можете писать и скомпилировать ассемблер ARM вообще на другом
компьютере! Но запустить собранный машинный код уже не сможете. Придется
сперва перенести его с главной машины на целевую (например, Raspberry Pi).
GCC — не единственный компилятор для Raspberry Pi и не единственный кросс­
компилятор. Есть и много других. Загляните на форумы на сайте Raspberry Pi для
получения подобной информации, и еще можете поискать в Интернете, если инте­
ресно.

Чипы Raspberry Pi ARM


Чип ARM, используемый в Raspberry Pi Zero, A, В, A+, B+ — это (приведем полное
название) мультимедийный процессор Broadcom ВСМ2835 System-on-Chip. Термин
«System-on-Chip» (система на кристалле, SoC) означает, что чип содержит почти
34 2. Начало

все необходимое для запуска Raspberry Pi в единой структуре (и именно поэтому


у Raspberry Pi столь малые габариты). В ВСМ2835 используется дизайн ARM11,
который построен на наборе команд ARMv6.
В Raspberry Pi 2 используется чип SoC ВСМ2836. В нем есть все функции
ВСМ2835, но один ARM11 с тактовой частотой 700 МГц заменен на четырехъядер­
ный ARM Cortex-A7 с тактовой частотой 900 МГц, а все остальное остается преж­
ним. Этот чип быстрее, в нем больше памяти, и он может запускать достаточно
серьезное программное обеспечение, такое как Windows 10 и весь спектр дистрибу­
тивов ARM GNU/Linux.
В основе Raspberry Pi 3 лежит чип ARM v8, опять же с использованием структуры
SoC и с еще большей частотой 1,2 ГГц. В его основе четыре высокопроизводитель ­
ных процессора ARM Cortex-A53, работающих в тандеме. А еще это 64-битный
процессор, который может работать как в состоянии AArch32, так и в AArch64.
В Raspberry Pi 4 используется Broadcom 2711, который стал еще быстрее —
1,5 ГГц. ARMv8— это четырехъядерный процессор А72, 64-битный процессор,
который может работать как в состоянии AArch32, так и в AArch64. Версия 8 Гбайт
позволяет использовать память полной 64-разрядной версии для эффективной
работы и обработки приложений — ничуть не хуже обычного ПК!
Что-то я увлекся терминами. Пока вы еще новичок, не стоит слишком забивать го­
лову. По мере того как вы начнете узнавать больше о Raspberry Pi, все эти вещи
станут вашей второй натурой. Мы вернемся к SoC в конце книги и объясним эту
концепцию более подробно.
Кстати, частота в один мегагерц (1 МГц) соответствует миллиону циклов в секун­
ду. Скорость микропроцессоров, называемая тактовой частотой, часто измеряет­
ся в МГц. Например, микропроцессор, работающий на частоте 700 МГц, выполняет
700 млн циклов в секунду. 1,2 ГГц (гигагерц)— это 1,2 млрд циклов в секунду.
Позже мы увидим, как эта скорость влияет на выполнение команд.
Еще прозвучал термин «четырехъядерный». Четырехъядерный процессор имеет
четыре независимых блока, называемых «ядрами», которые одновременно читают
и выполняют команды. В целом четырехъядерный процессор будет работать быст­
рее, чем двухъядерный или одноядерный. Каждая открытая программа может рабо­
тать на собственном ядре, поэтому, если задачи разделены между ядрами, скорость
будет лучше. Эта так называемая параллельная обработка является основной осо­
бенностью ARM.
3. Проба пера

В этой главе мы пошагово рассмотрим процедуру создания и запуска программы


машинного кода, начиная с момента включения Raspberry Pi и заканчивая внесени­
ем корректив в уже готовую программу. Первая программа не будет делать ничего
фантастического. На самом деле не произойдет вообще ничего, кроме возврата
символа приглашения, но даже в написание этой программы вовлечен каждый шаг,
который вам нужно знать и использовать при создании и запуске других программ
из этой книги.
Прямо сейчас я предполагаю, что у вас есть копия образа Raspberry Pi OS (Rasp-
bian) на SD-карте, вставленной в ваш Raspberry Pi, и что вы использовали ее хотя
бы один раз, чтобы выполнить начальную настройку таких важных моментов, как
клавиатура и Интернет. Если вы еще этого не сделали, сделайте это сейчас, чтобы
можно было продолжить.

Командная строкаЗ. Проба пера


При первой загрузке вы автоматически войдете в систему и попадете на рабочий
стол. В правом верхнем углу выполните двойной щелчок мышью на значке мони­
тора. Перед вами откроется окно Terminal, и вы попадете в командную строку, где
увидите примерно такое приглашение ввода:
pi@raspberrypi $

Командная строка — это консоль, в которую вы вводите команды, которые затем


выполнит ваша ОС. Командная строка начинается там, где мигает курсор. Консоль
ожидает, что вы будете вводить команды, которые затем можно выполнить нажати­
ем клавиши <Retum> (также называемой клавишей <Enter>). Попробуйте ввести
вот такую команду:
dir

Ввести ее нужно в точности так, как показано здесь. При нажатии клавиши
<Retum> перед вами появится список всех каталогов или файлов, которые находят­
ся в текущем каталоге. (С этого момента я не буду каждый раз говорить о нажатии
36 3. Проба пера

клавиши <Retum>, но вы имейте в виду, что если нужно ввести что-то с клавиату­
ры, особенно в командной строке, нужно будет нажать клавишу <Retum>.)
Теперь введите вот это:
Dir

Вы получите такой ответ:


bash: Dir: ccmmand not found

Это сообщение об ошибке. В командной строке регистр имеет значение, поэтому


команды:
dir
И
Dir

ОС считает разными, если учитывает регистр. То же самое и с именами файлов:


programl
И
Programl

— это разные файлы.


По соглашению о написании команд в командной строке всегда используется ниж­
ний регистр. Команды чувствительны к регистру. А в именах файлов могут быть
и строчные, и прописные буквы, если вы понимаете разницу. Лучше всегда исполь­
зовать строчные символы, поэтому не забываем поглядывать на индикатор кла­
виши <CapsLock>.

Создание исходного файла


Чтобы создать программу с машинным кодом, нужно выполнить процесс из трех
действий «написать — собрать — связать», в результате которого мы получим файл,
который можно будет запустить. Первый шаг — написать программу на ассембле­
ре. Поскольку именно этот код является источником программы, файл называется
исходным файлом. У такого файла будет расширение s после имени. Например:
programl.s

Исходные файлы можно писать в любом удобном текстовом редакторе. Существу­


ет много отличных и бесплатных редакторов, поэтому стоит уделить время изуче­
нию их обзоров и проверить пару вариантов самостоятельно. Возможно, у вас уже
есть любимый редактор, и с этим этапом вы разобрались.
В Raspberry Pi OS уже есть набор редакторов, установленных в разделе Recom­
mended Software, и вы можете найти их в главном меню приложения (пункт
Raspberry в меню на рабочем столе). Скорее всего, нужные вам редакторы нахо­
дятся в списке Accessories. Сюда входят (на момент подготовки книги) редакторы
Vim, gVim, а также редактор Geany Programmer’s Editor (советую попробовать каж­
дый из них и выбрать тот, который вам больше нравится).
3. Проба пера 37

Если ни Vim, ни gVim в системе не установлены, вы можете исправить эту пробле­


му с помощью параметра Recommended Software или из командной строки, набрав
команду:
sudo apt-get install vim

После этого надо будет ответить на пару запросов: вас могут спросить о необходи­
мости дополнительных функций. Ответ у вполне подойдет. Установка займет не­
сколько минут, а на сайте Vim тем временем можно найти много полезных советов.
Если вам больше нравится работать в приложении, возьмите версию Vim с графи­
ческим интерфейсом и при необходимости установите ее командой:
sudo apt-get install vim-gtk

Поскольку вам предстоит провести много времени за программированием на


ассемблере, имеет смысл уделить внимание изучению тонкостей Vim. Многие дей­
ствия и операции, используемые в Vim, выполняются с помощью удобных комби­
наций клавиш (особенно в консольной версии). В табл. 3.1 приведены некоторые
команды, которые вам необходимо знать. Эта таблица ни в коем случае не является
исчерпывающей, а полный набор комбинаций можно найти на сайте Vim. Но для
начала хватит и этого.

Таблица 3.1. Важные команды редактора Vim

Клавиша Действие

Команды перемещения курсора

- Переместить влево
Переместить вниз

т Переместить вверх

- Переместить вправо
W Переместить до следующего слова
W Переместить до следующего слова, отделенного пробелом
е Переместить в конец слова
Е Переместить в конец слова (без учета пунктуации)
b Переместить до предыдущего слова
В Переместить до предыдущего слова (без учета пунктуации)
0 (ноль) Новая строка
Л
Первый непустой символ

$ Конец строки
G Перейти к команде (например, 5G - перейти к строке 5)
Примечание, в команде перехода к команде слева приписывается количе­
ство повторений. Например, команда 4j перемещает курсор на 4 строки
38 3. Проба пера

Таблица 3.1 (окончание)

Клавиша Действие

Режим вставки — вставка/дополнение текста

i Переход в режим вставки с позиции курсора


I Вставить в начале строки
А Вставить после курсора
а Вставить в конце строки
0 Добавить пустую строку после текущей (без нажатия клавиши <Return>)
О Добавить пустую строку перед текущей
Esc Выход из режима вставки

Режим команд

:w Запись (сохранение) файла без выхода


:wq Запись файла (сохранение) и выход из Vim
:Q Выход (не срабатывает при наличии изменений)

:Q! Выход без сохранения изменений


:set Установка нумерации строк

Запустив Vim, вы также можете указать имя файла, который хотите создать. Если
файл уже существует, он загрузится в окно редактора, и вы сможете работать
с ним, как вам нужно. Если такого файла не существует, Vim создаст для вас новый
пустой файл с указанным именем. Откройте новое окно терминала и в командной
строке введите:
vim ргодЗа.s

Обратите внимание, что между vim и ргодЗ. s есть пробел, а также заметьте, что
в конце имени ргодЗ есть расширение s исходного файла. Соглашение гласит, что
расширение s обозначает исходный файл на языке ассемблера.
После этого окно станет в основном пустым, за исключением столбца из символов
тильды бегущего по левому краю, и имени файла внизу, а также обозначения
того, что это новый файл.
Нажмите клавишу <i>. Обратите внимание что в нижнем левом углу экрана по­
явился текст:
-INSERT —

Это означает, что мы находимся в режиме вставки. Нажмите клавишу <Esc>.


Надпись исчезла. Теперь мы находимся в командном режиме Vim.
Нажатие клавиш <i> и <Esc> станет для вас второй натурой. Когда включен режим
вставки, вы можете вводить программу на ассемблере и редактировать ее, пока не
3. Проба пера 39

надоест. В командном режиме нажатия клавиш интерпретируются как прямые


команды для Vim.
Имена файлов программ — в нашем случае ргодЗа. s — станут для вас привычны­
ми. Все программы в этой книге будут именоваться по номерам глав. Таким обра­
зом, ргодЗа.s1 означает, что исходный файл программы взят из главы 3 книги. Бук­
ва а1 предполагает, что это 1-я программа в этой главе. Файл с именем prog4b.s1
будет означать, что это 2-я программа из главы 4. Мы будем делать так просто для
удобства. Но вы можете использовать любое имя, какое захотите.
Вернитесь в режим вставки (клавишей <i>) и обратите внимание на мигающий
курсор в верхнем левом углу экрана. Все, что вы начнете вводить, появится там, где
находится курсор. Перепишите туда код из программы 3.1. Вам нужно ввести толь­
ко тот текст, который в этом листинге расположен между двумя пунктирными
линиями.

Примечание к русскому изданию


Напомним, что электронный архив с файлами приведенных в книге программ можно за­
грузить с FTP-сервера издательства «БХВ» по ссылке: ftp://ftp.bhv.ru/9785977568012.zip
или со страницы книги на сайте https://bhv.ru/ (см. приложение 4).

.global _start
start:
MOV RO, #65
MOV R7, #1
SWI 0

Обратите внимание, что из этих пяти строк программы первая, третья, четвертая
и пятая строки написаны с отступом. Только вторая строка написана без отступа.
Величина отступа, который вы добавляете, и даже место их размещения, на самом
деле не имеют значения. Но зато они просто упрощают чтение программы и позво­
ляют выделить различные уровни программы.
Чтобы создать отступ, нажмите клавишу <ТаЬ>. Другие клавиши работают так, как
и должны. Например, клавиши со стрелками используются для перемещения, а
клавиши <Delete> и <Backspace> — для перемещения и редактирования текста. Но
между словами global и -Start имеется пробел, и этот пробел важен. Вскоре мы
рассмотрим, что конкретно делает этот код.
А пока нажмите клавишу <Esc> и введите:
: wq

Эта команда сохранит ваш файл и закроет Vim. Теперь вы вернулись в командную
строку. Исходный файл готов!

1 Здесь имеется в виду авторская нумерация программ в книге и в электронном архиве (За, ЗЬ, 4а, 4Ь).
Мы же в книге нумеруем программы более привычной нашему читателю цифровой записью: 3.1, 3.2,
4.1,4.2 и т. д. (в электронном архиве нумерация остается авторской).
40 3. Проба пера

Написанное — исполнить!
Следующим шагом является преобразование исходного файла в исполняемый
файл машинного кода. Это делается с помощью двух команд командной строки.
В командной строке последовательно введите две команды:
as -о ргодЗа.о ргодЗа.s
Id -о ргодЗа ргодЗа.о

Эти две команды сначала собирают, а затем привязывают программу на языке


ассемблера (о привязывании позже). После этого машинный код готов к выпол­
нению:
./<имя файла>

Сочетание символов . / означает «запустить», а имя файла, который нужно запус­


тить, пишется сразу после команды без пробелов. Таким образом, для запуска на­
пишем:
./ргодЗа

Когда приглашение появится снова, программа машинного кода будет выполнена.


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

Ошибки ассемблера
Если в какой-либо момент во время процесса вы получите сообщение об ошибке,
или вообще какое-либо сообщение, — тщательно проверьте то, что вы ввели. Сна­
чала внимательно посмотрите на программу на языке ассемблера, затем на коман­
ды для сборки и связывания и, наконец, запустите программу. Если произошла
ошибка, и вы ее нашли, поздравляем, вы только что отладили свою первую про­
грамму на ассемблере.
Если возникает сообщение об ошибке от ассемблера (оно появляется после того,
как вы нажали <Retum> в конце первой строки), обычно в этом сообщении указы­
вается номер строки, в которой что-то неладно. Даже если вы не знаете, что именно
означает полученное сообщение, запишите себе номер строки, а затем откройте
исходный файл в Vim. Например, сообщение:
ргодЗа.s:5: Error bad expression

говорит об ошибке в строке 5 исходного файла.


Пока ваши файлы еще крошечные, вы можете отсчитать количество строк и найти
ту, в которую закралась ошибка. В самом редакторе Vim также есть возможность
нумерации строк. В командном режиме Vim введите:
:set number
3. Проба пера 41

Обратите внимание, что в левой части окна появились номера строк. Номера строк
не являются частью файла с кодом и отображаются только для справки. На рис. 3.1
показано, как это все это выглядит в редакторе gVim: видны номера строк и то, что
Vim работает в режиме вставки. Если вы используете gVim, то в нем различные
элементы синтаксиса выделяются разными цветами. Это позволяет легко иденти­
фицировать различные компоненты программы.

Рис. 3.1. Отображение номеров строк в gVim

Вы можете запустить редактор gVim из командной строки с помощью следующей


команды:
gvim <имяфайла>

Тогда для создания или редактирования файла prog3a.s можно выполнить команду:
gvim prog3a.s

Компоненты
Давайте еще раз взглянем на описанный здесь процесс и попробуем вникнуть
в анатомию исходного файла и понять, как все это собралось воедино. Посмотрим
еще раз на файл ргодЗа. s. Он состоит всего из пяти строк.
У любого файла с кодом ассемблера должна быть точка начала, и по умолчанию
в ассемблере GCC она выглядит вот так:
_start:

Первая строка этой программы определяет start как глобальное имя, доступное
для всей программы. Позже мы увидим, почему важно сделать это имя глобальным.
42 3. Проба пера

Вторая строка определяет, где находится start: в программе. Обратите внимание


на использование символа : в конце, которое определяет это имя как «метку». Мы
определили start как глобальное имя и теперь отметили, где находится сама метка
_start.
Следующие три строки написаны на мнемонике ассемблера, причем две из них
одинаковые: команда mov. Когда в языке ассемблера используется символ решетки,
он обозначает непосредственное значение. Другими словами, число после решет­
ки— это именно то значение, которое и будет использоваться. Первая команда
перемещает значение 65 в регистр о. Буква r обозначает регистр— специальное
место в микросхеме ARM, о котором мы поговорим чуть позже. Во второй строке
значение 1 перемещается в R7, или в регистр 7.
Последняя команда: swi о. Это специальная команда, которая служит для вызова
самой операционной системы Raspberry Pi. В нашем случае она задействуется для
выхода из программы машинного кода и передачи управления обратно в команд­
ную строку (программа в этот момент должна быть запущена).
Также стоит обратить внимание на регистр символов команд языка ассемблера
в наших исходных файлах. Я использую прописные буквы для мнемоник и регист­
ров, но подошли бы и строчные буквы, поскольку внутри исходных файлов регистр
символов не имеет значения (в отличие от командной строки в консоли, которая
чувствительна к регистру), поэтому
MOV R0, #65

а также
mov гО, #65

делают одно и то же. В этой книге я буду использовать прописные буквы. Это
упрощает чтение команд в тексте книги и позволяет отличить команды от меток,
которые будут написаны в нижнем регистре.
Запустите программу еще раз:
./ргодЗа

В командной строке введите:


echo $?

На экран будет выведено следующее:


65

Вывелось значение, загруженное в ro. Попробуйте изменить 65 на другое число —


скажем, 49. Теперь сохраните код, соберите его заново, заново свяжите и запустите.
Если вы сейчас наберете:
echo $?

будет выведено число 4 9. У ОС есть определенные способы возврата информации


из программ машинного кода, и мы рассмотрим их позже.
Если вы снова посмотрите на код в файле ргодЗа.s, то увидите, что он состоит из
двух отдельных частей. Вверху (в начале) приведены некоторые определения,
3. Проба пера 43

а в нижней половине — непосредственно команды на языке ассемблера. Исходные


файлы на языке ассемблера всегда состоят из последовательности операторов, за­
писанных по одному в каждой строке. Каждый оператор имеет следующий синтак­
сис (при этом каких-то его частей может и не быть):
обозначение: > <инструкция> @ комментарий

Все три компонента можно вводить в одной строке или в разных строках. Это дело
ваше. Но порядок их должен быть именно таким. Например, команда не может рас­
полагаться перед меткой (в той же строке).
Компонент «комментарий» для нас в новинку. Когда ассемблер встречает символ @,
он игнорирует все написанное после него до конца строки. Такую конструкцию
можно использовать для добавления в программу пояснений. Например, вернитесь
и отредактируйте код в файле ргодЗа.s, набрав:
vim ргодЗа.s

В окне редактора отобразится исходный файл. Курсор будет находиться в верхней


части файла. Войдите в режим вставки, создайте новую строку и введите в нее сле­
дующее:
@ ргодЗа.s - простенький файл ассемблера

Строка комментария с символом @ в начале полностью игнорируется компилято­


ром. Из-за этого размер исходного файла, конечно, увеличится, но это никак не по­
влияет на работу исполняемого файла.
Комментарии также можно добавлять с помощью символов /* и */, обозначая ими
начало и конец комментария:
/* Этот комментарий ассемблер проигнорирует ★/

Оба метода приемлемы, и вы можете использовать любой на свой вкус.


Чтобы преобразовать исходный файл в исполняемый, нам потребовалось два шага.
Первый:
as -о ргодЗа.о ргодЗа.s

Команда as в начале вызывает саму программу ассемблера, которая ожидает после


этой команды нескольких аргументов, задающих имена файлов, с которыми она
будет работать, а также необходимые действия. Первый из них: о — сообщает ас­
семблеру, ЧТО МЫ ХОТИМ СОЗДаТЬ объеКТНЫЙ файл ПО ИМеНИ ргодЗа. о из исходного
файла ргодЗа.s. Вы можете выбрать другое имя, если хотите. Сами имена не обяза­
тельно должны совпадать, но, если они одинаковые, проще найти концы. Расшире­
ние в любом случае разное!
Второй и последний шаг: «связать» файл объектного файла и преобразовать его
в исполняемый файл с помощью команды id следующим образом:
Id -о ргодЗа ргодЗа.о

Это действие — последняя часть процедуры связки, которая заставляет работать


машинный код. В ходе нее из объектного файла, созданного в процессе сборки,
44 3. Проба пера

создается исполняемый файл (называемый эльф-файлом). Именно команда id


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

А если нет метки _start?


Можно многое узнать о работе ассемблера и компоновщика GCC, просто поэкспе­
риментировав с ними. Как вы думаете, что произойдет, если мы опустим метку
start: в исходном файле?

Откройте файл prog3a.s в Vim и удалите строку start:, т. е. метку. Выйдите из


Vim и соберите программу:
as -о ргодЗа.о prog3a.s

А теперь свяжите программу:


Id -о ргодЗа ргодЗа.о

Компилятор выдаст следующее сообщение об ошибке (или подобное):


Id: warning: cannot find entry symbol _start; defaulting to 00008054

Сообщение говорит само за себя. Поскольку компилятор не может найти указатель


на то, где начинается программа, компоновщик предполагает, что точка запуска
программы находится в самом начале, а в памяти это адрес 00008054. (Этот адрес
может и, вероятно, будет свой у каждой модели Raspberry Pi.)
Это подстраховка, но не гарантия безопасности. Всегда используйте метку start:
в своих файлах, чтобы определить входную точку программы!

Связывание файлов
Сочетание «Id» обозначает «динамическое связывание». Сама команда связывания
позволяет объединять или последовательно соединять несколько файлов в одну
длинную исполняемую программу. Для таких случаев в этих файлах должна быть
определена только одна метка start:, т. к. у объединенной программы может быть
только одна точка входа. Это легко продемонстрировать на примере нашей про­
граммы.
Создайте новый файл в Vim и присвойте ему имя:
parti.s

В этот файл введите код, показанный в программе 3.2.

/★ файл parti.s */
.global _start
Another random document with
no related content on Scribd:
“An’ what did he say, bub?” demanded old man Cobbs gently, after a
moment of waiting.
“Great Gosh, yes!” exclaimed Peter Knowles explosively. “We-uns
ain’t a-waitin’ hyar ter hear you-uns tell yer talk; ennybody could hev
said that an’ mo’. What did the man say?”
Ormsby turned doubtfully toward the descending sun and the
reddening sky. “We-uns war a-huntin’, me an’ that juggler. I seen him
yestiddy mornin’. I went down thar ter Mis’ Sims’ an’ happened ter
view him. An’ I loant him my brother’s gun. An’ whenst I said that
’bout his looks an’ sech, we war a-huntin’, an’ he ’peared not ter
know thar war enny Happy Valley ’way over yander by Chilhowee.
An’ I tuk him up high on the mounting whar he could look over fur off
an’ see the Rich Woods an’ Happy Valley, an’—an’”—He paused.
“An’ what did he say?” inquired Knowles eagerly.
Ormsby looked embarrassed. “He jes’ say,” he went on suddenly, as
if with an effort, “he jes’ say, ‘Oh, Dr. Johnson!’ an’ bust out a-laffin’. I
dunno what the critter meant.”
Once more Ormsby turned, swinging his axe in his strong right hand,
and glanced absently over the landscape.
The sun was gone. The mountains, darkly glooming, rose high
above the Cove on every side, seeming to touch the translucent
amber sky that, despite the sunken sun, conserved an effect of
illumination heightened by contrast with the fringes of hemlock and
pine, that had assumed a sombre purple hue, waving against its
crystalline concave. In this suffusion of reflected color, rather than in
the medium of daylight, he beheld the scanty fields below in the
funnel-like basin; for this projecting spur near the base of the range
gave an outlook over the lower levels at hand. Some cows, he could
discern, were still wending homeward along an undulating red clay
road, which rose and fell till the woods intervened. The woods were
black. Night was afoot there amongst the shadowy boughs, for all
the golden glow of the feigning sky. The evening mists were adrift
along the ravines. Ever and anon the flames flickered out, red and
yellow, from the heap of logs. Not a sound stirred the group as they
pondered on this strange reply, till Ormsby said reflectively, “The
juggler be toler’ble good comp’ny, though,—nuthin’ like the devil an’
sech; leastwise, so much ez I know ’bout Satan,”—he seemed to
defer to the superior acquaintanceship of Knowles. “This hyar valley-
man talks powerful pleasant; an’ he kin sing,—jes’ set up an’ sing
like a plumb red-headed mock-in’bird, that’s what! You-uns hearn
him sing at the show,”—he turned from Knowles to appeal to the rest
of the group.
“Did he ’pear ter you-uns, whilst huntin’, ter try enny charms an’
spells on the wild critters?” asked Knowles.
“They didn’t work ef he did!” exclaimed Jack Ormsby, with a great
gush of laughter that startled the echoes into weird unmirthful
response. “He shot one yallerhammer arter travelin’ nigh ten mile ter
git him.” After a pause, “I gin him the best chance at a deer I ever
hed. I never see a feller hev the ‘buck ager’ so bad. He never
witched that deer. He shot plumb two feet too high. She jes’ went a-
bouncin’ by him down the mounting,—bouncin’ yit, I reckon! But he
kin shoot toler’ble fair at a mark.” The ready laughter again lighted
his face. “He ’lows he likes a mark ter shoot at kase it stands still.
He’s plumb pleasant comp’ny sure.”
“Waal, he ain’t been sech powerful pleasant comp’ny down ter my
house,” protested Tubal Sims. “Ain’t got a word ter say, an’ ’pears
like he ain’t got the heart ter eat a mouthful o’ vittles. Yander he hev
been a-lyin’ flat on them wet rocks all ter-day, with no mo’ keer o’ the
rheumatics ’n ef he war a bullfrog,—a-feeshin’ in the ruver with a
hook ’thout no bait on it.”
“What’d he ketch?” demanded one of the men, with a quick glance of
alarm. Miracles for the purpose of exhibition and cutting a dash they
esteemed far less repellent to the moral sense than the use of
uncommon powers to serve the ordinary purposes of daily life.
“Pleurisy, ef he got his deserts,” observed the disaffected host. “He
caught nuthin’ with ez much sense ez a stickle-back. ’Pears ter me
he ain’t well, nohow. He groaned a power in his sleep las’ night, arter
the show. An’”—he felt he ventured on dangerous ground—“he
talked, too.”
There was a significant silence. “That thar man hev got suthin’ on his
mind,” muttered Peter Knowles.
“I be powerful troubled myself,” returned the level-headed Sims
weakly. “I oughtn’t ter hev tuk him in,—him a stranger, though”—he
remembered the hospitable text in time for a flimsy self-justification.
“But ’twar a-stormin’ powerful, and he ’peared plumb beat out. I
’lowed that night he war goin’ inter some sort’n fever or dee-lerium. I
put him inter the roof-room, an’ he went ter bed ez soon ez he could
git thar. But the nex’ day he war ez fraish an’ gay ez a jaybird.”
“What’s he talk ’bout whenst sleepin’?” asked Peter Knowles, his
covert glance once more reverting to the refuse of quicklime at his
feet.
“Suthin’ he never lays his tongue ter whenst wakin’, I’ll be bound,”
replied Tubal Sims precipitately. Then he hesitated. This disclosure
was, he felt, a flagrant breach of hospitality. What right had he to
listen to the disjointed exclamations of his guest in his helplessness
as he slept, place his own interpretation upon them, and retail them
to others for their still more inimical speculation? Jane Ann Sims,—
how he would have respected her judgment had she been a man!—
he was sure, would not have given the words a second thought. But
then her habit of mind was incredulous. Parson Greenought often
told her that he feared her faith was not sufficient to take her to
heaven. “I be dependin’ on suthin’ better’n that, pa’son,” she would
smilingly rejoin. “I ain’t lookin’ ter my own pore mind an’ my own
wicked heart fur holp. An’ ye mark my words, I’ll be the fust nangel
ye shake han’s with when ye git inside the golden door.” And the
parson, impaled on his own weapons, could only suggest that they
should sing a hymn together, which they did,—Jane Ann Sims much
the louder of the two.
Admirable woman! she had but a single weakness, and this Tubal
Cain Sims was aware that he shared. With the returning thought of
their household idol, Euphemia, every consideration imposing
reticence vanished.
“Last night,” he began suddenly, “I war so conflusticated with the
goin’s-on ez I couldn’t sleep fur a while. An’ ez I sot downsteers
afore the fire, I could but take notice o’ how oneasy this man ’peared
in his sleep up in the roof-room. He sighed an’ groaned like suthin’ in
agony. An’ then he says, so painful, ‘But the one who lives—oh, what
can I do—the one who lives! fur his life!—his life!—his life!’” He
paused abruptly to mark the petrified astonishment on the group of
faces growing white in the closing dusk.
An owl began to hoot in the bosky recesses far up the slope. At the
sound, carrying far in the twilight stillness, a hound bayed from the
door of the little cabin in the Cove, by the river. A light, stellular in the
gloom that hung about the lower levels, suddenly sprung up in the
window. A tremulous elongated reflection shimmered in the shallows
close under the bank where the juggler had been lying. Was he there
yet? Sims wondered, quivering with the excitement of the moment.
His anxiety was not quelled, but a great relief came upon him when
Peter Knowles echoed his own thought, which seemed thus the
natural sequence of the event, and not some far-fetched fantasy.
“That thar man hev killed somebody, ez sure ez ye live!” exclaimed
Peter Knowles. “‘But the one who lives!’ An’ who is the one who
died?”
“Jes’ so, jes’ so,” interpolated Sims, reassured to see his own mental
process so definitely duplicated in the thoughts of a man held to be
of experienced and just judgment, and much regarded in the
community.
“He be a-runnin’ from jestice,” resumed Knowles. “He ain’t no
juggler, ez he calls hisself.”
There was a general protest.
“Shucks, Pete, ye oughter seen him swaller a bay’net.”
“An’ Mis’ Sims tole him she’d resk her shears on it, she jes’ felt so
reckless an’ plumb kerried away. An’ he swallered them, too, an’
then tuk ’em out’n his throat, sharp ez ever.”
“An’ he swallered a paper o’ needles an’ a spool o’ thread, an’ brung
’em out’n his mouth all threaded.”
There was a delighted laugh rippling round the circle.
“Look-a-hyar, my frien’s,” remonstrated Peter Knowles in a solemn,
sepulchral voice, “I never viewed none o’ these doin’s, but ye air all
’bleeged ter know ez they air on-possible, the devices o’ the devil.
An’ hyar ye be, perfessin’ Christians, a-laffin’ at them wiles ez air laid
ter delude the onwary.”
There was a general effort to recover a sobriety of demeanor, and
one of the men then observed gravely that on the occasion when
these wonders were exhibited Parson Benias Greenought taxed the
performer with this supposition.
“Waal,” remarked Ormsby, “ye air ’bleeged ter hev tuk notice, ef ye
war thar las’ night, ez old Benias never moved toe or toe-nail till arter
all the jinks war most over. He seen nigh all thar war ter see ’fore he
’lowed how the sinners war enj’yin’ tharse’fs, an’ called up the devil
ter len’ a han’.”
“What the man say?” demanded Peter Knowles.
“He ’peared cornsider’ble set back a-fust, an’ then he tried ter laff it
off,” replied Gideon Beck. “He ’lowed he could l’arn sech things ter
folks ez he had l’arnt ’em, too.”
“Now tell me one thing,” argued Peter Knowles; “how’s a man goin’
ter l’arn a pusson ter put a persimmon seed in a pail o’ yearth, an’
lay a cloth over it, an’ sing some foolishness, an’ take off’n the cloth,
an’ thar’s a persimmon shoot with a root ez long ez my han’ a-
growin’ in that yearth?”
There were sundry gravely shaken heads.
“Mis’ Jernigan jes’ went plumb inter the high-strikes, she got so
skeered, an’ they hed ter take her home in the wagon,” said Beck.
“Old man Jernigan hed none; the las’ time I viewed him he war a-
tryin’ ter swaller old Mis’ Jernigan’s big shears hisse’f,” retorted
Ormbsy.
“Mis’ Jernigan ain’t never got the rights o’ herself yit, an’ her cow hev
done gone dry, too,” observed Beck.
“Tell me, my brethren, what’s them words mean,—‘the one who
lives’?” insisted Peter Knowles significantly. “Sure’s ye air born,
thar’s another verse an’ chapter ter that sayin’. Who war the one who
died?”
Once more awe settled down upon the little group. The wind had
sprung up. Now and again pennons of flame flaunted out from the
great heap of logs and stones, and threw livid bars of light athwart
the landscape, which pulsated visibly as the blaze rose and fell,—
now seeming strangely distinct and near at hand, now receding into
the darkness and distance. Mystery affiliated with the time and place,
and there was scant responsiveness to Ormsby’s protest as he once
more sought to befriend the absent juggler.
“I can’t git my cornsent ter b’lieve ez thar be enny dead one. I reckon
the feller war talkin’ ’bout his kemin’ powerful nigh dyin’ hisself. He
’lowed ter me ez he hed a mighty great shock jes’ afore he kem hyar,
—what made him so diff’ent a-fust.”
“Shocked by lightning?” demanded Peter Knowles dubiously.
“I reckon so; never hearn on no other kind.”
“Waal, now,” said Tubal Sims, who had sought during this discussion
to urge his views on the coterie, “I ’low that the Cove ought not ter
take up with sech jubious doin’s ez these.”
“Lawsy massy!” exclaimed Beck, with the uplifted eyebrows of
derision, “las’ night you-uns an’ Mis’ Sims too ’peared plumb kerried
away, jes’ bodaciously dee-lighted, with the juggler an’ all his pay-
formances!”
There is naught in all our moral economy which can suffer a change
without discredit and disparagement, barring what is known as a
change of heart. It is a clumsy and awkward mental evolution at
best, as the turncoat in politics, the apologist for discarded
friendships, the fickle-minded in religious doctrines, know to their
cost. The process of veering is attended invariably with a poignant
mortification, as if one had warranted one’s opinions infallible, and to
endure till time shall be no more. Tubal Cain Sims experienced all
the ignominious sensations known as “eatin’ crow,” as he sought to
qualify his satisfaction of the previous evening, and reconcile it to his
complete change of sentiment now, without giving his true reason. It
would involve scant courtesy to the absent Euphemia to intimate his
fears lest she admire too much the juggler, and it might excite
ridicule to suggest his certainty that the juggler would admire her far
too much. Sometimes, indeed, he doubted if other people—that is,
above the age of twenty-five—entertained the rapturous estimate of
Euphemia, which was a subject on which he and Jane Ann Sims
never differed.
“I did,—I did,” he sputtered. “Me an’ Jane Ann nare one never seen
no harm in the pay-formance. An’ Jane Ann don’t know nuthin’
contrarious yit, kase I ain’t tole her,—she bein’ a ’oman, an’ liable ter
talk free an’ let her tongue git a-goin’; she dunno whar ter stop. A
man oughtn’t ter tell his wife sech ez he aims ter go no furder,” he
added discursively.
“’Thout he wants all the Cove ter be a-gabblin’ over it nex’ day,”
assented a husband of three experiments. “I know wimmin. Lawsy
massy! I know ’em now.” He shook his head lugubriously, as if his
education in feminine quirks and wiles had gone hard with him, and
he could willingly have dispensed with a surplusage of learning.
“But arter I hearn them strange words,” resumed Tubal Cain Sims,
—“them strange words, so painful an’ pitiful-spoken,—I drawed the
same idee ez Peter Knowles thar. I ’lowed the juggler war some
sort’n evil-doer agin the law,—though he didn’t look like it ter me.”
“He did ter me; he featured it from the fust,” Knowles protested, with
a stern drawing down of his forbidding face.
There was a momentary pause while they all seemed to meditate on
the evidence afforded by the personal appearance of the juggler.
“I be afeard,” continued Sims, glancing at Knowles, “like Pete say, he
hev c’mmitted murder an’ be fleein’ from the law. An’ I be a law-
abidin’ citizen—an’—an’—he can’t stay at my house.”
There was silence. No one was interested in the impeccability of
Tubal Cain Sims’s house. It was his castle. He was free to say who
should come and who should go. His own responsibility was its
guarantee.
It is a pathetic circumstance in human affairs that the fact of how little
one’s personal difficulties and anxieties and turmoils of mind count to
one’s friends can only be definitely ascertained by the experiment
made in the thick of these troubles.
With a sudden return of his wonted perspicacity, Sims said, “That
thar man oughter be gin notice ter leave. I call on ye all—ye all live
round ’bout the Cove—ter git him out’n it.”
There was a half-articulate grumble of protest and surprise.
“It’s yer business ter make him go, ef yer don’t want him in yer
house,” said Peter Knowles, looking loweringly at Sims.
“I ain’t got nuthin’ agin him,” declared Sims excitedly, holding both
empty palms upward. “I can’t say, ‘Git out; ye talk in yer sleep, an’ ye
don’t talk ter suit me!’ But,” fixing the logic upon them with weighty
emphasis and a significant pause, “you-uns all b’lieve ez he air in
league with Satan, an’ his jinks air deviltries an’ sech. An’ so be, ye
ought ter make him take hisself an’ his conjurin’s off from hyar ’fore
he witches the craps, or spirits away the lime, or tricks the mill, or—
He ought ter be gin hours ter cl’ar out.”
Peter Knowles roused himself to argument. He had developed a
vivid curiosity concerning the juggler. The suggestion of the devil’s
agency was a far cry to his fears,—be it remembered he had not
seen the bayonet swallowed!—and he had phenomenal talents for
contrariety, and graced the opposition with great persistence and
powers of contradiction.
“Bein’ ez ye hev reason ter suspect that man o’ murder or sech, we-
uns ain’t got the right ter give him hours ter leave. Ye ain’t got the
right ter turn him out’n yer house ter escape from the off’cers o’ the
law.”
The crowd, always on the alert for a sensation, pricked up their
willing ears. “Naw, ye ain’t,” more than one asseverated.
“’Twould jes’ be holpin’ him on his run from jestice,” declared Beck.
“Further he gits, further the sher’ff’ll hev ter foller, an’ mo’ chance o’
losin’ him.”
“They be on his track now, I reckon,” said old Josiah Cobbs
dolorously.
“It’s the jewty o’ we-uns in the Cove,” resumed Peter Knowles, “ter
keep a stric’ watch on him an’ see ter it he don’t git away ’fore the
sher’ff tracks him hyar.”
Tubal Sims’s blood ran cold. A man sitting daily at his table under the
espionage of all the Cove as a murderer! A man sleeping in his best
feather-bed—and the way he floundered in its unaccustomed depths
nothing but a porpoise could emulate—till the sheriff of the county
should come to hale him out to the ignominious quarters of the
common jail! Jane Ann Sims—how his heart sank as he thought that
had he first taken counsel of her he would not now be in a position to
receive his orders from Peter Knowles!—to be in daily friendly
association with this strange guest, to be sitting at home now calmly
stitching cuffs for a man who might be wearing handcuffs before
daylight! Euphemia—when he thought of Euphemia he rose
precipitately from the rock on which he was seated. In twenty-four
hours Euphemia should be in Buncombe County, North Carolina,
where his sister lived. The juggler should never see her; for who
knew what lengths Jane Ann Sims’s vicarious love of admiration
would carry her? If the man were but on his knees, what cared she
what the Cove thought of him? And Euphemia should never see the
juggler! Tubal Sims hurried down the darkening way, hearing without
heeding the voices of his late comrades, all dispersing homeward by
devious paths,—now loud in the still twilight, now veiled and
indistinct in the distance. The chirring of the myriad nocturnal insects
was rising from every bush, louder, more confident, refreshed by the
recent rain, and the frogs chanted by the riverside.
He had reached the lower levels at last. He glanced up and saw the
first timid palpitant star spring forth with a glitter into the midst of the
neutral-tinted ether, and then, as if affrighted at the vast voids of the
untenanted skies, disappear so elusively that the eye might not mark
the spot where that white crystalline flake had trembled. It was early
yet. He strode up to his own house, whence the yellow light glowed
from the window. He stopped suddenly, his heart sinking like lead.
There on the step of the passage sat Euphemia, her elbow on her
knee, her chin in her hand, her eyes pensively fixed on the uncertain
kindling of that pioneer star once more blazing out the road in the
evening sky.
III.
Euphemia could hardly have said what it was that had brought her
home,—some vague yet potent impulse, some occult, unimagined
power of divination, some subjection to her mother’s will constraining
her, or simply the intuition that there was some opportunity for
mischief unimproved. Tubal Cain Sims shook his head dubiously as
he canvassed each theory. He ventured to ask the views of Mrs.
Sims, after he had partaken of the supper set aside for him—for the
meal was concluded before his return—and had lighted his pipe.
“What brung her home? Them stout leetle brogans,—that’s what,”
said Mrs. Sims, chuckling between the whiffs of her own pipe.
“Course I know the chile walked. I reckon she’ll hev stone-bruises a
plenty arter this,—full twelve mile. But what put it inter her head ter
kem? She ’lowed ter me she ain’t dreamed o’ nuthin’, ’ceptin’ Spot
hed a new calf, which she ain’t got. Reckon ’twar a leadin’ or a
warnin’ or”—
“I reckon ’twar homesickness. Young gals always pine fur home,
special ef thar ain’t nuthin’ spry goin’ on in a new place.” And once
more Jane Ann Sims, in the plenitude of her triumph, chuckled.
It chanced, that afternoon, that when the red sunset was aflare over
the bronze-green slopes that encircled the Cove, and the great pine
near at hand began to sway and to sing and to cast forth the rich
benison of its aroma to the fresh rain-swept air, the juggler roused
himself, pushed back his hat from his eyes, and gazed with listless
melancholy about him. Somehow the sweet peace of the secluded
place appealed to his world-weary senses. The sounds,—the distant,
mellow lowing of the kine, homeward wending; the tinkle of a sheep-
bell; the rhythmic dash of the river; the ecstatic cadenzas of a
mocking-bird, so intricate, delivered with such dashing élan, so
marvelously clear and sweet and high as to give an effect as of
glitter,—all were so harmoniously bucolic. He was soothed in a
measure, or dulled, as he drew a long sigh of relief and surcease of
pain, and began to experience that facile renewal of interest
common to youth with all its recuperative faculties. It fights a valiant
fight with sorrow or trouble, and only the years conquer it at last. For
the first time he noted among the budding willows far down the
stream a roof all aslant, which he divined at once was the mill. He
rose to his feet with a quickening curiosity. As he released the futile
fishing-rod and wound up the line he remarked the unbaited hook.
His face changed abruptly with the thought of his absorption and
trouble. He pitied himself.
The road down which he took his way described many a curve
seeking to obviate the precipitousness of the descent. The rocks
rose high on either side for a time, and when the scene beyond
broke upon him in its entirety it was as if a curtain were suddenly
lifted. How shadowy, how fragrant the budding woods above the
calm and lustrous water! The mill, its walls canted askew, dark and
soaked with the rain, and its mossy roof awry, was sombre and
silent. Over the dam the water fell in an unbroken crystal sheet so
smooth and languorous that it seemed motionless, as if under a
spell. Ferns were thick on a marshy slope opposite, where scattered
boulders lay, and one quivering blossomy bough of a dogwood-tree
leaned over its white reflection in the water, fairer than itself, like
some fond memory embellishing the thing it images.
With that sudden sense of companionship in loneliness by which a
presence is felt before it is perceived, he turned sharply back as he
was about to move away, and glanced again toward the mill. A
young girl was standing in the doorway in an attitude of arrested
poise, as if in surprise.
Timidity was not the juggler’s besetting sin. He lifted his hat with a
courteous bow, the like of which had never been seen in Etowah
Cove, and thus commending himself to her attention, he took his
way toward her along the slant of the corduroy road; for this fleeting
glimpse afforded to him a more vivid suggestion of interest than the
Cove had as yet been able to present. For the first time since
reaching its confines it occurred to him that it might be possible to
live along awhile yet. Nevertheless, he contrived to keep his eyes
decorously void of expression, and occupied them for the most part
in aiding his feet to find their way among the crevices and obstacles
with which the road abounded. When he paused, he asked, suffering
his eyes to rest inquiringly on the girl, “Beg pardon, but will you
kindly inform me where is the miller?”
The glimpse that had so attracted him was, he felt, all inadequate, as
he stood and gazed, privileged by virtue of his simulated interest in
the absent miller. He could not have seen from the distance how fair,
how dainty, was her complexion, nor the crinkles and sparkles of
gold in her fine brown hair. It waved upward from her low brow in a
heavy undulation which he would have discriminated as “à la
Pompadour,” but its contour was compassed by wearing far
backward a round comb, the chief treasure of her possessions, the
heavy masses of hair rising smoothly toward the front, and falling
behind in long, loose ringlets about her shoulders. She had a
delicate chin with a deep dimple,—which last reminded him
unpleasantly of Mrs. Sims, for dimples were henceforth at a
discount; a fine, thin, straight nose; two dark silken eyebrows, each
describing a perfect arc; and surely there were never created for the
beguilement of man two such large, lustrous gray-blue eyes, long-
lashed, deep-set, as those which served Euphemia Sims for the
comparatively unimportant function of vision. He had hardly been
certain whether her attire was more or less grotesque than the
costume of the other mountain women until she lifted these eyes and
completed the charm of the unique apparition. She wore a calico
bought by the yard at the store, and accounted but a flimsy fabric by
the homespun-weaving mountain women. It was of a pale green tint,
and had once been sprinkled over with large dark green leaves. Lye
soap and water had done their merciful work. The strong crude color
of the leaves had been subdued to a tint but little deeper than the
ground of the material, and while the contour of the foliage was
retained, it was mottled into a semblance of light and shade here and
there where the dye strove to hold fast. The figure which it draped
was pliant and slender; the feet which the full skirt permitted to be
half visible were small, and arrayed in brown hose and the stout little
brogans which had brought her so nimbly from Piomingo Cove.
Partly amused, partly contemptuous, partly admiring, the juggler
remarked her hesitation and embarrassment, and relished it as of his
own inspiring.
“Waal,” she drawled at last, “I don’t rightly know.” She gazed at him
doubtfully. “Air ye wantin’ ter see him special?”
He had a momentary terror lest she should ask him for his grist and
unmask his subterfuge. He sought refuge in candor. “Well, I was
admiring the mill. This is a pretty spot, and I wished to ask the
miller’s name.”
There was a flash of laughter in her eyes, although her lips were
grave. “His name be Tubal Sims; an’ ef he don’t prop up his old mill
somehows, it’ll careen down on him some day.” She added, with
asperity, “I dunno what ye be admirin’ it fur, ’thout it air ter view what
a s’prisin’ pitch laziness kin kem ter.”
“That’s what I admire. I’m a proficient, a professor of the science of
laziness.”
She lifted her long black lashes only a little as she gazed at him with
half-lowered lids. “Ye won’t find no pupils in that science hyar about.
The Cove’s done graduated.” She smiled slightly, as if to herself. The
imagery of her response, drawn from her slender experience at the
schoolhouse, pleased her for the moment, but she had no
disposition toward further conversational triumphs. There ensued a
short silence, and then she looked at him in obvious surprise that he
did not take himself off. It would seem that he had got what he had
come for,—the miller’s name and the opportunity to admire the mill.
He experienced in his turn a momentary embarrassment. He was so
conscious of the superiority of his social status, knowledge of the
world, and general attainments that her apparent lack of
comprehension of his condescension in lingering to admire also the
miller’s daughter was subversive in some sort of his wonted aplomb.
It rallied promptly, however, and he went on with a certain half-veiled
mocking courtesy, of which the satire of the sentiment was only
vaguely felt through the impervious words.
“I presume you are the miller’s daughter?”
She looked at him in silent acquiescence.
“Then I am happy to make an acquaintance which kind fortune has
been holding in store for me, for my stay in the Cove is at the miller’s
hospitable home.” He concluded with a smiling flourish. But her
bewitching eyes gazed seriously at him.
“What be yer name?” she demanded succinctly.
“Leonard,—John Leonard,—very much at your service,” he replied,
with an air half banter, half propitiation.
“Ye be the juggler that mam’s been talkin’ ’bout,” she said as if to
herself, completing his identification. “I drawed the idee from what
mam said ez ye war a old pusson—at least cornsider’ble on in
years.”
“And so I am!” he cried, with a sudden change of tone. “If life is
measured by what we feel and what we suffer, I am old,”—he
paused with a sense of self-betrayal,—“some four or five hundred at
least,” he added, relapsing into his wonted light tone.
She shook her head sagely. “’Pears like ter me ez it mought be
medjured by the sense folks gather ez they go. I hev knowed some
mighty young fools at sixty.”
The color showed in his face; her unconscious intimation of his youth
according to this method of estimate touched his vanity, even evoked
a slight resentment.
“You are an ancient dame, on that theory! I bow to your wisdom,
madam,—quite the soberest party I have seen since I entered the
paradisaical seclusion of Etowah Cove.”
She appreciated the belligerent note in his voice, although she
scarcely apprehended the casus belli. There was, however, a
responsive flash in her eye, which showed she was game in any
quarrel. No tender solicitude animated her lest unintentionally she
had wounded the feelings of this pilgrim and stranger. He had taken
the liberty to be offended when no offense was intended, and
perhaps with the laudable desire to give him, as it were, something
to cry for, she struck back as best she might.
“Not so sober ez some o’ them folks ye gin yer show afore, over
yander at the Notch. I hearn they war fit ter weep an’ pray arterward.
Mam ’lowed ye made ’em sober fur sure.”
He was genuinely nettled at this thrust. His feats of jugglery had
resulted so contrary to his expectations, had roused so serious a
danger, that he did not even in his own thoughts willingly revert to
them. He turned away on one heel of the pointed russet shoes that
had impressed the denizens of Etowah Cove hardly less
unpleasantly than a cloven hoof, and looked casually down the long
darkly lustrous vista of the river; for the mill so projected over the
water that the point of view was as if it were anchored in midstream.
The green boughs leaned far over the smooth shadowy current; here
and there, where a half-submerged rock lifted its jagged summit
above the surface, the water foamed preternaturally white in the
sylvan glooms. He had a cursory impression of many features
calculated to give pleasure to the eye, were his mind at ease to
enjoy such trifles, and his sense alert to mark them: the moss on the
logs, and the lichen; the tangle of the trumpet-vines, all the budding
tendrils blowing with the breeze, that clambered over the rickety
structure, and hung down from the apex of the high roof, and swayed
above the portal; even the swift motion of a black snake swimming
sinuously in the clear water, and visible through the braiding of the
currents as through corrugated glass.
“No,” he said, his teeth set together, his eyes still far down the
stream, “I did my little best, but my entertainment was not a success;
and if that fact makes you merry, I wish you joy of your mirth.”
His eyes returned to her expectantly; he was not altogether unused
to sounding the cultivated feminine heart, trained to sensibility and
susceptible to many a specious sophistry. Naught he had found
more efficacious than an appeal for sympathy to those who have
sympathy in bulk and on call. The attribution, also, of a motive
trenching on cruelty, and unauthorized by fact, was usually wont to
occasion a flutter of protest and contrition.
Euphemia Sims met his gaze in calm silence. She had intended no
mirth at his expense, and if he were minded to evolve it gratuitously
he was welcome to his illusion. Aught that she had said had been to
return or parry a blow. She spoke advisedly. There was no feigning
of gentleness in her, no faltering nor turning back. She stood
stanchly ready to abide by her words. She had known no assumption
of that pretty superficial feminine tendresse, so graceful a garb of
identity, and she could not conceive of him as an object of pity
because her sarcasm had cut deeper than his own. He had an
impression that he had indeed reached primitive conditions. The
encounter with an absolute candor shocked his mental
prepossessions as a sudden dash of cold water might startle the
nerves.
He was all at once very tired of the mill, extremely tired of his
companion. The very weight of the fishing-rod and its unbaited hook
was a burden. He was making haste to take himself off—he hardly
knew where—from one weariness of spirit to another. Despite the
lesson he had had, that he would receive of her exactly the measure
of consideration that he meted out, he could not refrain from a half-
mocking intimation as he said, “And do you propose to take up your
abode down here, that you linger so long in this watery place,—a
nymph, a naiad, or a grace?” He glanced slightingly down the dusky
bosky vista.
She was not even discomfited by his manner. “I kem down hyar,” she
remarked, the interest of her errand paramount for the moment, “I
kem down ter the mill ter see ef I couldn’t find some seconds. They
make a sort o’ change arter eatin’ white flour awhile.”
He was not culinary in his tastes, and he had no idea what “seconds”
might be, unless indeed he encountered them in their transmogrified
estate as rolls on the table.
“And having found them, may I crave the pleasure of escorting you
up the hill to the paternal domicile? I observe the shadows are
growing very long.”
“You-uns may kerry the bag,” she replied, with composure, “an’ I’ll
kerry the fishin’-pole.”
Thus it was he unexpectedly found himself plodding along the
romantic road he had so lately traversed, with a bag of “seconds” on
his shoulder,—“a veritable beast of burden,” he said sarcastically to
himself,—while Euphemia Sims’s light, airy figure loitered along the
perfumed ways in advance of him, her cloudy curls waving slightly
with the motion and the breeze; the fishing-rod was over her
shoulder, and on the end of it where the unbaited hook was wound
with the line her green sunbonnet was perched, flouncing like some
great struggling thing that the angler had caught.
It did not occur to him, so impressed was he with the grotesque
office to which he had descended and the absurd result of the
interview, that her errand to the mill must have anticipated some
burlier strength than her own to carry the “seconds” home, until as
they turned an abrupt curve where the high rocks rose on either side
they met a man with an axe in his hand walking rapidly toward them.
He paused abruptly at the sight of them, and the juggler laughed
aloud in scornful derision of his burden.
Then recognizing Ormsby he cried out cheerily, “Hello, friend,
whither bound?” So acute had his sensibilities become that he had a
sense of recoil from the surly mutinous stare with which his friendly
young acquaintance of the previous evening received his greeting.
Ormsby mumbled something about a fish-trap and passed on swiftly
toward the river. Swift as he was it was obviously impossible that he
could even have gained the margin and returned without a pause
when he passed again, walking with a long rapid stride, swinging his
axe doggedly, his hat pulled down over his brow, his eyes downcast,
and with not even a flimsy affectation of an exchange of civilities.
“Now, the powers forbid,” thought the juggler, “that I shall run into
any such hornet’s nest as interfering with this Corydon and Phyllis.
Surely sufficient vials of wrath have been poured out on my head
without uncorking this peculiar and deadly essence of jealousy which
all three of us cannot hope to survive.”
He looked anxiously up from his bent posture, carrying the bag well
up on his shoulders, at the quickly disappearing figure of the young
mountaineer. He did not doubt that Ormsby knew that Euphemia’s
domestic errands would probably bring her to the mill at this hour,
and the bearing home of the bag of “seconds” was his precious
dévoir most ruthlessly usurped. “I only wish, my friend,” thought the
juggler, “that you had the heavy thing now with all its tender
associations.” He glanced with some solicitude at the delicate lovely
face of the girl. It was placidity itself. He had begun to be able to
read it. There was an implication of exactions in its soft firmness.
She would make no concessions. She would assume no blame not
justly and fairly to be laid at her door. She would not rend her heart
with those tender lies of false self-accusation common to loving
women who find it less bitter to censure themselves than those they
love, and sometimes indeed more politic. She would not bewail
herself that she had not lingered, that Ormsby, who came daily to
examine his fish-traps, might have had the opportunity of a long talk
with her which he coveted, and the precious privilege of going home
like a mule with a flour-bag on his back. It was his own fault that he
was too late. She could not heft the bag. If he were angry he was a
fool. On every principle it is a bad thing to be a fool. If God Almighty
has not seen fit to make a man a fool, it is an ill turn for a man to
make one of himself.
As the juggler divined her mental processes and the possible
indifference of her sentiments toward the disappointed Ormsby, he
realized that naught was to be hoped from her, but that probably
Ormsby himself might be less obdurate. Doubtless he had had
experience of the stern and unyielding quality of her convictions, and
had learned that it was the part of wisdom to accommodate himself
to them. Surely he would not indulge so futile an anger, for it would
not move her. After an interval of solitary sulking in the dank cool
woods his resentment would wane, his jealousy would prompt a
more zealous rivalry, and he would come to her father’s house as the
evening wore on with an incidental expression of countenance and a
lamblike manner. The juggler made haste because of this sanguine
expectation to leave the field clear for the reconciliation of the parties
in interest. He deprecated the loss of one of the very few friends,
among the many enemies, he had made since his advent into
Etowah Cove. The frank, bold, kindly young mountaineer had, in the
absence of all other prepossessions, somewhat won the good
opinion of the juggler. With that attraction which mere youth has for
youth, he valued Ormsby above the other denizens of the Cove.
Jane Ann Sims was possessed of more sterling worth as a friend
than a battalion of such as Ormsby. But the juggler was a man of
prejudices. Mrs. Sims’s unwieldy bulk offended his artistic views of
proportion. The slow shuffle of her big feet on the floor as she went
about irritated his nerves. The creases and dimples of her broad
countenance obscured for him its expression of native astuteness
and genuine good will. Therefore, despite her appreciation of the
true intent of the feats of a prestidigitator he was impatient of her
presence and undervalued her hearty prepossessions in his favor.
He heard with secret annoyance her voice vaguely wheezing a
hymn, much off the key, as after supper she sat knitting a shapeless
elephantine stocking beside the dying embers, for the night was
chilly. Her husband now and again yawned loudly over his pipe, as
much from perplexity as fatigue. Outside Euphemia was sitting alone
on the step of the passage. The juggler had no inclination to linger
by her side. Except for a lively appreciation of the difference in
personal appearance she was not more attractive to him than was
her mother. He passed stiffly by, with a sense of getting out of harm’s
way, and ascended to his room in the roof, where for a long time he
lay in the floundering instabilities of the feather-bed, which gave him
now and again a sensation as of drowning in soft impalpable depths,
—a sensation especially revolting to his nerves. Nevertheless, it was
but vaguely that he realized that Ormsby did not come, that he heard
the movements downstairs as the doors were closed, and when he
opened his eyes again it was morning, and the new day marked a
change.
If anything were needed to further his alienation from the beautiful
daughter of the house, it might have been furnished by her own
voice, the first sounds of which that reached his ears were loud and
somewhat unfilial.
“It’s a plumb sin not ter milk a cow reg’lar ter the minit every day,”
she averred dictatorially.
“Show me the chapter an’ verse fur that, ef it’s a sin; ye air book-
l’arned,” wheezed her mother, on the defensive.

Вам также может понравиться