Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Архитектура вычислительных систем и Ассемблер с приложением методических указаний к лабораторным работам. Учебное пособие
.pdf
Список иллюстраций 361
Список иллюстраций
1.1 Схема системной платы ........................ 8
1.2 Структура системной шины ...................... 9
1.3
Двухбайтовое число: а) биты старшего и младшего байтов, б) прямой порядок байтов в памяти, в) обратный порядок байтов в памяти 12
1.4
Четырёхбайтовое число: а) байты и биты числа, б) прямой порядок
байтов в памяти, в) обратный порядок байтов в памяти ...... 13
1.5 Цикл выполнения команды ...................... 15
1.6
Расположение программ и данных в фон-неймановской (а) и гар-
вардской (б) архитектурах ...................... 18
1.7
Иерархия запоминающих устройств. Сверху вниз увеличивается
объём и уменьшается скорость обмена ................ 19
2.1 Эффективность систем счисления .................. 49
2.2
Геометрическая интерпретация позиционного представления дроб-
ной части в различных системах счисления ............. 53
2.3 Беззнаковый (а) и знаковый (б) сдвиги вправо ............ 87
2.4 Знаковый (беззнаковый) сдвиг влево ................. 88
2.5 Простой циклический сдвиг: а) влево, б) вправо .......... 88
2.6 Циклический сдвиг через флаг переноса: а) влево, б) вправо .... 88
2.7
Структура числа с плавающей запятой согласно стандарту IEEE 754:
а) нормализованное число, б) денормализованное, в) ноль, г) беско-
нечность, д) неопределённость или нечисло ............. 94
2.8
Структура внутреннего представления чисел в FPU x87: а) нормализованное число, б) денормализованное, в) ноль, г) бесконечность,
д) вещественная неопределённость, е) тихое нечисло, ж) сигналь-
ное нечисло ............................... 96
2.9
Недопустимые значения в FPU x87: а) с нулевым порядком, б) с порядком p
min
p p
, в) с порядком, состоящим из единиц . . 97
max
3.1 Режимы работы современных процессоров ............. 107
3.2
Распределение памяти процесса в тридцатидвухбитной операцион-
ной системе GNU/Linux ........................ 109
3.3 Стек ................................... 112
3.4 Изменение указателя стека при вызове и возврате из функций . . . 113
3.5 Удаление данных из стека — изменение указателя ......... 114

362 Список иллюстраций
3.6 Регистры общего назначения в тридцатидвухбитном режиме . . . 116
3.7 Регистры общего назначения в шестидесятичетырёхбитном режиме 118
3.8 Регистры FPU ............................. 121
3.9 Слово тегов FPU ............................ 121
3.10 Слово состояния и управляющее слово FPU ............. 122
3.11 Стек FPU ................................ 123
3.12 Структура команды в архитектуре x86 ............... 132
3.13 Префикс расширения регистров REX в структуре команды x86-64 137
4.1 Этапы компиляции программы на C++ ................ 147
4.2 Совместная компиляция нескольких модулей ............ 150
4.3 Совместная компиляция модулей на разных языках ........ 151
6.1 Изменение указателя стека командами вызова и возврата ..... 241
6.2
Размещение локальных переменных в стеке оптимизирующим ком-
пилятором ............................... 243
6.3 Размещение локальных переменных в стеке (устаревший вариант) 244
6.4 Параметры и адрес возврата в соглашении cdecl .......... 248
6.5
Компиляция C-функции без искажения имён (a) и с искажением,
принятым в большинстве версий Microsoft Windows (б) ...... 256
Компиляция C-функции без искажения имён (a) и с компенсацией
6.6
искажения (б) ............................. 258
6.7 Алгоритм и реализация ветвления с операторами в одной ветви . . 263
6.8 Алгоритм ветвления .......................... 266
6.9 Алгоритм и реализация ветвления .................. 266
6.10 Алгоритм и реализация цикла с предусловием ........... 268
6.11 Алгоритм и реализация цикла с постусловием ........... 269
Л1.1 Точка останова в коде ......................... 322
Л1.2 Локальные и наблюдаемые переменные в Qt Creator ........ 323
Л1.3 Отладочные окна Memory и Watches в Code::Blocks ........ 323
Л1.4 Обозреватель и редактор памяти Qt Creator ............. 323
Л1.5
Создание 64-битной конфигурации для проекта в Microsoft Visual
Studio .................................. 324
Л2.1 Дизассемблированный код программы (Qt Creator) ......... 329
Л2.2 Дизассемблированный код программы (Code::Blocks) ....... 330
Л2.3 Регистры (Qt Creator) ......................... 331

Оглавление 363
Оглавление
Введение................................ 3
Глава 1. Понятие вычислительной системы (ВС) ............ 5
1.1. Терминология . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.2. Структурная декомпозиция вычислительной системы . . . . . . . 6
1.2.1. Единицы измерения . . . . . . . . . . . . . . . . . . . . . 10
1.2.2. Порядок следования байтов . . . . ............. 11
1.2.3. Цикл выполнения команды . . . . . . . . . . . . . . . . . 14
1.2.4. Расположение программ и данных . . . . . . . . . . . . . . 17
1.2.5. Память . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
1.2.6. Регистры . . . . . . . . . . . . . . . . . . . . . . . . . . 21
1.3. Иерархическая декомпозиция ВС . . . . . . . . . . . . . . . . . 22
1.3.1. Цифровой логический уровень . . . . . . . . . . . . . . . . 22
1.3.2. Микроархитектурный уровень . . . . . . . . . . . . . . . . 23
1.3.3. Уровень архитектуры команд . . . . . . . . . . . . . . . . 24
1.3.4. Уровень операционной системы . . . . . . . . . . . . . . . 25
1.3.5. Уровень ассемблера . . . . . . . . . . . . . . . . . . . . . 26
1.3.6. Языки высокого уровня . . . . . . . . . . . . . . . . . . . 27
1.4. История . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
1.4.1. Развитие вычислительной техники . . . . . . . . . . . . . . 29
1.4.2. Операционные системы . . . . . . . . . . . . . . . . . . . 38
Контрольные вопросы . . . . . . . . . . . . . . . . . . . . . . . . 40
Глава 2. Представление данных .................... 41
2.1. Качественные и количественные данные . . . . . . . . . . . . . . 41
2.2. История чисел . . . . . . . . . . . . . . . . . . . . . . . . . . 43
2.3. Позиционные системы счисления . . . . . . . . . . . . . . . . . 46
2.3.1. Перевод натуральных чисел между позиционными системами
счисления . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
2.3.2. Экономичность системы счисления . . . . . . . . . . . . . 49
2.3.3. Нецифровые символы в представлении чисел . . . . . . . . . 50
2.3.4. Позиционное представление вещественных чисел . . . . . . . 51
2.4. Двоичное представление беззнаковых целых чисел . . . . . . . . . 58
2.4.1. Восьмеричное и шестнадцатеричное представление . . . . . . 59
2.4.2. Беззнаковая арифметика в вычислительных системах . . . . . 62

364 Оглавление
2.5. Представление отрицательных чисел . . . . . . . . . . . . . . . 67
2.5.1. Величина со знаком . . . . . . . . ............. 68
2.5.2. Код с избытком . . . . . . . . . . . . . . . . . . . . . . . 71
2.5.3. Дополнительный код . . . . . . . . . . . . . . . . . . . . 72
2.5.4. Знаковая арифметика в вычислительных системах . . . . . . 73
2.6. Альтернативная арифметика . . . . . . . . . . . . . . . . . . . 77
2.6.1. Двоично-десятичная арифметика. . . . . . . . . . . . . . . 77
2.6.2. Модулярная арифметика . . . . . . . . . . . . . . . . . . 80
2.6.3. Арифметика с насыщением . . . . . . . . . . . . . . . . . 81
2.7. Битовые операции . . . . . . . . . . . . . . . . . . . . . . . . 82
2.7.1. Поразрядные операции . . . . . . . . . . . . . . . . . . . 82
2.7.2. Расширение целых чисел. . . . . . . . . . . . . . . . . . . 84
2.7.3. Битовые сдвиги . . . . . . . . . . . . . . . . . . . . . . . 86
2.8. Представление вещественных чисел . . . . . . . . . . . . . . . . 89
2.8.1. Представление вещественных чисел с фиксированной запятой . 89
2.8.2. Представление вещественных чисел с плавающей запятой . . . 92
Контрольные вопросы . . . . . . . . . . . . . . . . . . . . . . . . 101
Глава 3. Архитектура команд семейства x86 ..............102
3.1. Развитие линейки x86 и режимы работы . . . . . . . . . . . . . . 102
3.1.1. История семейства x86 . . . . . . . . . . . . . . . . . . . 103
3.1.2. Режимы работы процессора . . . . . . . . . . . . . . . . . 106
3.2. Сегменты памяти . . . . . . . . . . . . . . . . . . . . . . . . 108
3.2.1. Код и статические данные . . . . . . . . . . . . . . . . . . 110
3.2.2. Куча . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
3.2.3. Стек . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
3.3. Регистры . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
3.3.1. Регистры общего назначения, доступные в тридцатидвухбитном
режиме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
3.3.2. Регистры общего назначения, доступные в шестидесятичеты-
рёхбитном режиме . . . . . . . . . . . . . . . . . . . . . . . . 117
3.3.3. Специальные регистры и регистры расширений . . . . . . . . 119
3.4. Математический сопроцессор (FPU x87). . . . . . . . . . . . . . 120
3.4.1. Регистры FPU . . . . . . . . . . . .............120
3.4.2. Исключения FPU . . . . . . . . . . . . . . . . . . . . . . 123
3.5. Флаги . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
3.5.1. Флаги основного процессора . . . . . . . . . . . . . . . . . 126
3.5.2. Флаги FPU . . . . . . . . . . . . . . . . . . . . . . . . . 129

Оглавление 365
3.6. Структура команды и методы адресации . . . . . . . . . . . . . 131
3.6.1. Методы адресации . . . . . . . . . . . . . . . . . . . . . 131
3.6.2. Структура команды . . . . . . . . . . . . . . . . . . . . . 132
3.6.3. Общие для тридцатидвухбитного и шестидесятичетырёхбитно-
го режимов сведения об адресации. . . . . . . . . . . . . . . . . 133
3.6.4. Адресация в тридцатидвухбитном режиме . . . . . . . . . . 136
3.6.5. Расширение регистров в шестидесятичетырёхбитном режиме . 137
3.6.6. Операнды и адресация в шестидесятичетырёхбитном режиме . 139
3.6.7. Адресация относительно указателя команды . . . . . . . . . 140
Контрольные вопросы . . . . . . . . . . . . . . . . . . . . . . . . 141
Глава 4. Связь уровней абстракции...................142
4.1. Компиляция . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
4.1.1. Инструменты разработки . . . . . . . . . . . . . . . . . . 143
4.1.2. Этапы компиляции . . . . . . . . . . . . . . . . . . . . . 146
4.1.3. Особенности GCC. . . . . . . . . . . . . . . . . . . . . . 148
4.2. Препроцессор . . . . . . . . . . . . . . . . . . . . . . . . . . 152
4.2.1. Включение файла . . . . . . . . . . . . . . . . . . . . . . 153
4.2.2. Условная компиляция . . . . . . . . . . . . . . . . . . . . 154
4.2.3. Макросы . . . . . . . . . . . . . . . . . . . . . . . . . . 155
4.3. Ассемблерные вставки в код C++ . . . . . . . . . . . . . . . . . 159
4.3.1. Синтаксис ассемблерных вставок в GCC . . . . . . . . . . . 159
4.3.2. Расширенная форма . . . . . . . . . . . . . . . . . . . . . 161
4.3.3. Практическое использование параметров . . . . . . . . . . . 167
4.3.4. Ограничения на расположение операнда . . . . . . . . . . . 170
4.3.5. Модификаторы параметров . . . . .............171
Контрольные вопросы . . . . . . . . . . . . . . . . . . . . . . . . 172
Глава 5. Синтаксис и команды GNU Assembler x86 ...........173
5.1. Особенности GNU Assembler . . . . . . . . . . . . . . . . . . . 173
5.1.1. Общие правила . . . . . . . . . . . . . . . . . . . . . . . 174
5.1.2. Основные директивы . . . . . . . . . . . . . . . . . . . . 175
5.1.3. Порядок операндов . . . . . . . . . . . . . . . . . . . . . 178
5.1.4. Адресация операндов . . . . . . . . . . . . . . . . . . . . 179
5.1.5. Размер операндов команды . . . . . . . . . . . . . . . . . 182
5.1.6. Мнемоники . . . . . . . . . . . . . . . . . . . . . . . . . 184
5.1.7. Префиксы . . . . . . . . . . . . .............185
5.2. Основные команды. . . . . . . . . . . . . . . . . . . . . . . . 185
5.2.1. Общие команды . . . . . . . . . . . . . . . . . . . . . . . 186
5.2.2. Передача управления, вызов и возврат . . . . . . . . . . . . 190
5.2.3. Обнуление регистра . . . . . . . . . . . . . . . . . . . . . 194
5.2.4. Команды целочисленной арифметики . . . . . . . . . . . . 194

366 Оглавление
5.2.5. Битовые операции . . . . . . . . . . . . . . . . . . . . . 200
5.2.6. Флаги . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
5.2.7. Условные команды . . . . . . . . . . . . . . . . . . . . . 204
5.3. Команды FPU . . . . . . . . . . . . . . . . . . . . . . . . . . 209
5.3.1. Внутреннее представление чисел . . . . . . . . . . . . . . . 210
5.3.2. Возможные форматы экспорта-импорта . . . . . . . . . . . 212
5.3.3. Общие команды. . . . . . . . . . . . . . . . . . . . . . . 213
5.3.4. Загрузка, выгрузка и пересылка данных. . . . . . . . . . . . 214
5.3.5. Основные арифметические команды . . . . . . . . . . . . . 221
5.3.6. Дополнительные арифметические и трансцендентные команды. 226
5.3.7. Сравнение вещественных чисел . . . . . . . . . . . . . . . 228
Контрольные вопросы . . . . . . . . . . . . . . . . . . . . . . . . 232
Глава 6. Программирование на языке Ассемблера ...........233
6.1. Структура программы на ассемблере . . . . . . . . . . . . . . . 233
6.1.1. Программирование с использованием libc . . . . . . . . . . . 234
6.1.2. Программирование без libc . . . . . . . . . . . . . . . . . 237
6.2. Подпрограммы и функции . . . . . . . . . . . . . . . . . . . . 239
6.2.1. Требования к вызовам функций . . . . . . . . . . . . . . . 240
6.2.2. Механизм вызова подпрограммы . . . . . . . . . . . . . . . 241
6.2.3. Соглашения о вызовах. . . . . . . . . . . . . . . . . . . . 245
6.2.4. Описание функций на ассемблере . . . . . . . . . . . . . . 249
6.2.5. Импорт функций из модулей на ассемблере в код на C++ . . . 252
6.2.6. Импорт функций из модулей на C++ в код на ассемблере . . . 254
6.2.7. Искажение имён при компиляции . . . . . . . . . . . . . . 255
6.2.8. Системные вызовы . . . . . . . . . . . . . . . . . . . . . 259
6.3. Программирование нелинейных алгоритмов . . . . . . . . . . . . 261
6.3.1. Условие с операторами в одной ветви . . . . . . . . . . . . 261
6.3.2. Условие с операторами в двух ветвях . . . . . . . . . . . . 263
6.3.3. Цикл . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
6.4. Взаимодействие со структурами данных . . . . . . . . . . . . . . 270
6.4.1. Массивы . . . . . . . . . . . . . . . . . . . . . . . . . . 270
6.4.2. Структуры и объекты . . . . . . . . . . . . . . . . . . . . 277
Контрольные вопросы . . . . . . . . . . . . . . . . . . . . . . . . 282
Глава 7. Программирование на языке высокого уровня: С++ ......283
7.1. Структура программы . . . . . . . . . . . . . . . . . . . . . . 284
7.2. Типы данных . . . . . . . . . . . . . . . . . . . . . . . . . . 285
7.2.1. Целые типы . . . . . . . . . . . . . . . . . . . . . . . . . 285
7.2.2. Вещественные типы . . . . . . . . . . . . . . . . . . . . . 288
7.2.3. Специальные типы . . . . . . . . . . . . . . . . . . . . . 289
7.2.4. Указатели . . . . . . . . . . . . . . . . . . . . . . . . . 290

Оглавление 367
7.3. Приведение типов . . . . . . . . . . . . . . . . . . . . . . . . 291
7.4. Литералы C++ . . . . . . . . . . . . . . . . . . . . . . . . . . 294
7.4.1. Целые . . . . . . . . . . . . . . . . . . . . . . . . . . . 294
7.4.2. Вещественные . . . . . . . . . . . . . . . . . . . . . . . 295
7.4.3. Строки . . . . . . . . . . . . . . . . . . . . . . . . . . . 296
7.5. Средства автоматизации C++ . . . . . . . . . . . . . . . . . . . 297
7.5.1. Шаблоны C++ . . . . . . . . . . . . . . . . . . . . . . . . 297
7.5.2. Макросы препроцессора C/C++ . . . . . . . . . . . . . . . 299
7.6. Ввод-вывод . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
7.6.1. Ввод-вывод в поток . . . . . . . . . . . . . . . . . . . . . 300
7.6.2. Ввод-вывод с помощью libc . . . . . . . . . . . . . . . . . 301
7.7. Отладочная печать . . . . . . . . . . . . . . . . . . . . . . . . 307
7.7.1. Средства исследования переменных . . . . . . . . . . . . . 307
7.7.2. Автоматизация отладочной печати . . . . . . . . . . . . . . 309
Контрольные вопросы . . . . . . . . . . . . . . . . . . . . . . . . 313
Заключение ..............................314
Приложение А. Лабораторный практикум GNU Assembler .......315
Требования к выполнению лабораторных работ . . . . . . . . . . . . 315
Л1. Представление данных в ЭВМ . . . . . . . . . . . . . . . . . . 318
Л2. Отладка кода . . . . . . . . . . . . . . . . . . . . . . . . . . 326
Л3. Модули и функции на ассемблере . . . . . . . . . . . . . . . . . 332
Л4. Использование ассемблерных вставок в программах на C++. . . . . 335
Л5. Программирование FPU . . . . . . . . . . . . . . . . . . . . . 337
Л6. Программирование ветвящихся и циклических алгоритмов . . . . . 340
Л7. Использование массивов . . . . . . . . . . . . . . . . . . . . . 343
Приложение Б. Коды ASCII ......................345
Литература ..............................346
Предметный указатель.........................351
Список таблиц .............................359
Список иллюстраций .........................360

Гагарина Лариса Геннадьевна,
Кононова Александра Игоревна
Архитектура вычислительных систем
и Ассемблер
с приложением методических указаний
к лабораторным работам
Ответственный за выпуск: В. Митин
Верстка, обложка: СОЛОН-Пресс
Художник: А. Кошелева
По вопросам приобретения обращаться:
ООО «СОЛОН-Пресс»
123001, г. Москва, а/я 82
Телефоны: (495) 617-39-64, (495) 617-39-65
E-mail: kniga@solon-press.ru, www.solon-press.ru
Распространение через сеть магазинов и маркетплейсов
ООО КТК «Галактика»
115487, г. Москва, проспект Андропова, д. 38
Телефоны: (499) 782-38-89
E-mail: books@alians-kniga.ru, https://www.galaktika-dmk.com/
ООО «СОЛОН-Пресс»
115487, г. Москва, пр-кт Андропова, дом 38,
помещение № 8, комната № 2.
Формат 60×88/16. Объем 23 п. л. Тираж 100 экз.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
