- •Содержание
- •1. Введение
- •2. Представление информации в эвм
- •2.1. Системы счисления
- •2.1.1. Основные понятия
- •2.1.2. Системы счисления, используемые в вычислительной технике
- •2.1.3. Перевод чисел из одной системы счисления в другую
- •2.2. Типы данных
- •2.2.1. Типы данных, используемых в эвм
- •2.2.2. Константы
- •2.2.3. Логические величины
- •2.2.4. Символьные величины
- •2.2.5. Целые числа
- •2.2.6. Вещественные числа
- •2.3. Форматы команд
- •3. Основы построения эвм
- •3.1. Немного истории
- •3.2. Особенности архитектуры современной вычислительной машины
- •3.2.1. Основные понятия
- •3.2.2. Структурная организация машины
- •3.3. Вариант структуры микроЭвм
- •3.3.1. Общая структура машины
- •3.3.2. Процессор
- •3.3.3. Оперативная память
- •3.3.4. Системная память
- •3.3.5. Система адресации
- •3.3.6. Виртуальная память
- •3.3.7. Таймер
- •3.3.8. Внешние устройства
- •3.3.9. Принципы обмена информацией с внешними устройствами
- •Некоторые вопросы программного обеспечения
- •4.1. О программном обеспечении
- •4.2. Процесс компиляции
- •4.3. Компиляция с языка Ассемблера
- •5. Особенности архитектуры эвм типа ibm-рс
- •5.1. Введение
- •5.2. Исторический обзор процессоров клона 80х86
- •5.3. Классификация процессоров Intel 80х86
- •5.4. Особенности периферийных устройств ibm-pc
- •5.5. Характеристики компьютера
- •5.6. Сегментная адресация
- •5.7. Особенности распределения адресного пространства в компьютерах ibm-pc
- •5.7.1. Стандартная оперативная память (Conventional memory)
- •5.7.2. Область верхней памяти (Upper Memory Area ‑ uma)
- •5.7.3. Область высшей памяти (High Memory Area ‑ hma)
- •5.7.4. Расширенная память (eXtended Memory Specification — xms)
- •5.7.5. Дополнительная память (Expanded Memory Specification — ems)
- •5.8. Обмен информацией с периферийными устройствами
- •5.8.1. Порты ввода/вывода
- •5.8.2. Использование адресного пространства памяти
- •5.8.3. Прямой доступ к памяти
- •5.9. Прерывания
- •5.10. Начальный запуск эвм
- •5.11. Регистры процессора
- •5.11.1. Регистры общего назначения
- •5.11.2. Указатель инструкций
- •5.11.3. Регистр флагов и управляющие регистры
- •5.11.4. Регистры сегментов и селекторов
- •5.11.5. Системные адресные регистры
- •5.11.6. Регистры отладки
- •5.11.7. Регистры тестирования и модельно-специфические регистры
- •6. Debug — средство непосредственной коррекции и отладки загрузочного кода программ
- •6.1. Введение
- •6.1.1. Команды без аргумента
- •Input I порт
- •6.1.2. Команды обращения к ячейкам
- •15D0:010c bfffff mov di,ffff
- •15D0:010f 57 push di
- •6.1.3. Команды запуска программы
- •6.1.4. Команды просмотра и модификации регистров
- •7. Методы адресации
- •7.1. Введение
- •7.2. Регистровый метод адресации
- •159B:0101 1e push ds
- •159B:0101 1e push ds
- •159B:0101 1e push ds
- •7.3. Непосредственный метод адресации
- •7.4. Прямая адресация
- •7.5. Косвенная регистровая адресация
- •159B:0100 not word ptr [bx]
- •159B:0102 e000 loopnz 0104
- •7.6. Адресация по базе
- •7.7. Косвенная регистровая адресация с индексированием
- •159B:0102 0e push cs
- •7.8. Адресация по базе с индексированием
- •7.9. Относительная адресация
- •7.10. Косвенная регистровая адресация с масштабированием
- •7.11. Адресация по базе с индексированием и масштабированием
- •8. Синтаксис ассемблера
- •8.1. Директивы определения данных
- •8.1.1. Определение переменных
- •Cимвольные строки
- •Числовые данные
- •Примеры:
- •8.2. Выражения
- •8.3. Непосредственные операнды
- •8.4. Структуры
- •8.5. Сегменты
- •8.6. Модели памяти и упрощенные директивы определения сегментов
- •8.7. Упрощенные директивы описания сегментов
- •8.8. Создание программы на ассемблере
- •8.9. Получение выполняемого файла
- •9. Система команд
- •9.1. Классификация команд по операндам
- •9.2. Классификация команд по действию
- •9.2.1. Команды пересылки данных
- •9.2.2. Арифметические команды
- •8.2.3. Команды манипуляции битами
- •9.2.4. Управление центральным процессором
- •9.2.4. Команды передачи управления
- •Iret, iretd
- •9.3. Краткий список команд с используемыми операндами
- •9.3.1. Условные обозначения:
- •9.3.2. Инструкции пересылки данных
- •9.3.3. Арифметические, логические и инструкции сдвига
- •9.3.4. Инструкции обработки строк
- •9.3.5. Инструкции передачи управления
- •9.3.6. Инструкции управления процессором
- •Литература
4.3. Компиляция с языка Ассемблера
Ассемблирование — это компиляция программы, написанной на Ассемблере, по особым принципам. Кратко рассмотрим, как происходит этот процесс, на примере трансляции простой программы с языка ассемблера машины PDP-11.
Пусть мы хотим сложить два числа, например, X и Y. Результат занесем в ячейку Z. Для определенности положим, что X=5(8), а Y=7(8). Поскольку машина использует двухадресные команды, необходимо решить, что делать с операндом-приемником, который заменяется на результат операции. Для сохранения Y продублируем эту переменную в ячейку Z.
Начальные значения X и Y запишем в программу, воспользовавшись тем, что метки в языке программирования соответствуют адресу оператора, у которого они установлены. Если оператор состоит только из одной константы, то обращение к метке будет эквивалентно обращению к этой константе.
С учетом выше изложенного напишем программу на некотором машинно-ориентированном языке.
.TITLE PRIMER; Заголовок программы, транслятором не обрабатывается,
MOV Y, Z пересылка переменной Y по адресу Z,
ADD X, Z сложение Z = Z + X,
HALT команда остановки программы,
X: 5 ввод в программу первого числа,
Y: 7 ввод в программу второго числа,
Z: пустая ячейка для записи результата Z,
.END директива конец трансляции.
Транслятор ассемблера содержит таблицу постоянных имен, в которую занесены все зарезервированные языком слова и соответствующие им коды. Для нашего случая фрагмент таблицы постоянных имен будет иметь вид:
ADD 060000
MOV 010000
HALT 000000
Транслятор анализирует программы слева направо. Первая строка .TITLE PRIMER; не формирует при трансляции машинный код и служит пометкой пользователю о названии программы (но не файла). В листинге программы она будет присутствовать, но никакой команды ей в соответствие поставлено не будет.
Следующая строка содержит команду пересылки MOV Y, Z. Транслятор читает первое слово MOV, обращается к таблице постоянных имен и в первую ячейку двоичного кода программы заносит код 010000. Далее следует слово Y, которого нет в таблице кодов. Транслятор формирует таблицу имен пользователя, в которую запишет Y. Но адрес переменной не определен, поэтому в таблице будет поставлена пометка об этом. Аналогично транслятор поступит и с переменной Z.
Y ?
Z ?
В данном ассемблере использование переменных в командах обеспечивается методом адресации с кодом 67. Код оператора формируется логическим сложением кода команды и кодом обращения к операндам, причем для первого операнда Y после КОП он будет 006700, а для второго 000067:
010000 \/ 006700 \/ 000067 = 016767.
Этот код первой команды машина запишет по адресу 000. Далее два слова будут оставлены под обращение к адресам операндов, которые в данный момент транслятору не известны.
Команде сложения ADD транслятор из таблицы постоянных имен возьмет код 060000. Имя переменной X транслятор опять же занесет в таблицу имен пользователя, пометив, что адрес ее не известен. Переменная Z в этой таблице присутствует, но без адреса. Код команды получится в виде:
060000 \/ 006700 \/ 000067 = 066767.
Команда запишется с адреса 006 и займет, опять же, три слова.
Выполнение команды HALT приведет к остановке машины, и программа закончит свою работу. Эта команда будет записана по адресу 010, код команды 000000.
Далее транслятор считает метку X, найдет ее в таблице имен пользователя и поставит в соответствие этому имени адрес метки 012. Аналогично для Y адрес будет 014, а для Z 016. Т.е. после первого прохода транслятора адреса всех переменных оказались определены, но в командах они еще не записаны. При втором проходе транслятора для каждой адресной команды будут определены смещения (в словах) соответствующего операнда по отношению к адресу команды. Так для команды MOV адрес переменной Y оказывается смещенным на 7 шагов программы (необходимо помнить, что при выполнении очередной команды в СчК всегда находится следующий адрес!). Ниже изображен листинг программы.
.TITLE PRIMER;
MOV Y, Z 000 / 016767 000007 000007
ADD X, Z 006 / 066767 000003 000003
HALT 010 / 000000
X: 5 012 / 000005
Y: 7 014 / 000007
Z: 016 / 000000
.END
Резюме:
ассемблирование характерно тем, что каждому оператору исходной программы однозначно ставится в соответствие одна команда из набора машинных команд;
преобразование программы с языка ассемблера в машинный код производится на основании двух таблиц: таблицы постоянных имен и таблицы имен пользователя.
Итак, мы рассмотрели принципы построения компьютера с точки зрения программиста. Далее будем рассматривать особенности архитектуры и программирования для машин семейства IBM PC.