- •Содержание
- •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. Инструкции управления процессором
- •Литература
2.2.6. Вещественные числа
Во многих языках программирования число, записанное с десятичной точкой, называют вещественным числом.
Для представления в машине вещественных чисел используется формат с «плавающей» точкой, т.е. используется нормализованная форма записи числа. Нормальная форма широко используется в математике для укороченной формы записи многоразрядных чисел, особенно если он содержит в себе значительное количество 0:
1 000 000= 106, 0.000 000 456= 0.456 10-6, 1 567 589= 1.567589 106.
При нормальной форме число представляется в виде мантиссы со знаком и показателя порядка n, записанного в виде 10n. Для нормализованной формы характерна следующая конструкция:
<знак числа> 0. <мантисса> <основание системы> <знак порядка> <порядок>, причем мантисса всегда начинается со значащей цифры, т.е. она не может быть равна 0!
Пример нормализованных чисел:
1 000 000= 0.1 10 7 1 567 589= 0.1567589 107
-542.39= - 0.5423910 3 0.000 000 456= 0.456 10-6
43.71(8)= 0.4371 102(8) 100111.011(2)= 0.100111011 101001(2)
Обратите внимание, что основание любой системы записывается в виде 10.
Теперь подробно рассмотрим машинное представление нормализованных двоичных чисел. Возьмем число 26(8) и представим его в виде двоичного нормализованного числа (основание и порядок для простоты будем записывать в десятичной системе):
28(8)= 010 110(2) = 0.010110 (2)* 2+6(10) или в нормализованной форме
0. 1011(2) * 2+5(10)
Но в двоичной системе всего две цифры - 0 и 1. Из них значащая только 1. И следовательно, мантисса М всегда будет начинаться с единицы. Т.е. всегда в двоичной системе выполняется:
0 <= M < 1 (2.9)
Выражение 2.9 говорит о том, что вещественное число в машине не может быть равно нулю. Или (Х-Х)0 !!! Для того чтобы машина все-таки могла правильно решить это уравнение, в ней производится аппаратное обнуление результата.
В соответствии с вышесказанным для нормализованного двоичного числа конструкция 0.1 будет присутствовать всегда, также как и конструкция *2. Для экономии технических средств эти конструкции аппаратно скрыты (есть понятие скрытая единица), но при вычислениях учитываются. В итоге на уровне машинных средств число
28(8)= 010 110(2)
будет представлено в виде
0 0110 1 101(2)
Вещественное число может занимать два машинных слова и иметь формат, представленный на рис. 2.3.
Рис. 2.3
Оценим диапазон представления вещественных чисел. Мантисса занимает 16 разрядов младшего слова, 7 разрядов старшего слова и еще одну скрытую единицу. Итого 24 разряда, и диапазон составит 224. Под порядок отведено 7 разрядов. Знаку «+» соответствует 1, а знаку «-» 0. Порядок основания 2 изменяется в пределах (-128, +127). Это соответствует, примерно, 10-39 и 10+39 .
Запишем уже рассмотренное число 28(8) в машинном формате (рис. 2.4).
Рис. 2.4
Если перейти к восьмеричном системе, то вещественное число 28(8) в машинном формате будет выглядеть:
042540.
2.3. Форматы команд
Предположим, что мы хотим сложить два произвольных числа на некоторой абстрактной вычислительной машине. Она имеет процессор, выполняющий заданный нами набор команд и адресуемую память. Вводить информацию мы будем с единственного устройства ввода - клавиатуры, а выводить можем на принтер или на дисплей. Попробуем написать программу для выполнения этой задачи.
1. Используем команду ввод для считывания с клавиатуры первого числа. Но нам еще надо указать ячейку, в которую должно быть записано первое число. Дальше команду ввод повторим, но укажем другой адрес для записи второго числа:
Код операции |
Адрес 1 |
Ввод |
А1 |
Ввод |
А2 |
2. Теперь введем команду сложения +. Складывать будем содержимое ячейки с адресом А1 и ячейки с адресом А2. Результат, полученный в процессоре, необходимо записать в память, например, в ячейку А3:
Код операции |
Адрес 1 |
Адрес 2 |
Адрес 3 |
+ |
А1 |
А2 |
А3 |
3. Далее выведем результат из ячейки А3 командой вывод, указав, например, адрес принтера:
Код операции |
Адрес 1 |
Адрес 2 |
Адрес 3 |
Вывод |
А3 |
Принтер |
|
4. Для завершения программы осталось ввести последнюю команду для остановки машины стоп:
Код операции |
Адрес 1 |
Адрес 2 |
Адрес 3 |
стоп |
|
|
|
В итоге программа будет иметь вид:
Код операции |
Адрес 1 |
Адрес 2 |
Адрес 3 |
Ввод |
А1 |
|
|
Ввод |
А2 |
|
|
+ |
А1 |
А2 |
А3 |
Вывод |
А3 |
Принтер |
|
Стоп |
|
|
|
Проанализируем полученную программу. Во-первых, отметим, что каждая команда имеет код операции (КОП), т.е. элементарную инструкцию, которую машина должна выполнить. Во-вторых, почти все команды имеют адресную часть, в которой указывается, где находится операнд. Но количество адресов в различных командах разное. Есть команды с одним адресом, с двумя, с тремя и безадресные. Естественно, что удобно иметь трехадресную машину, но каждое адресное поле требует расширения аппаратной части, а трехадресные команды встречаются относительно редко. До появления микроЭВМ выпускались машины с фиксированной адресностью: дешевые и медленнодействующие одноадресные и дорогие трехадресные.
Появление микропроцессоров и потребность в дешевых машинах привела к тому, что появились машины с переменным форматом команд. Обычно в состав системы команд входят одноадресные, двухадресные и безадресные команды. Здесь надо учесть, что адресность команды определяется количеством операндов, участвующих в ней (команда может содержать адреса, но не обращаться к операндам, например команда обращения к подпрограмме).
К безадресным командам обычно относятся команды управления машиной, обращения к подпрограмме, команды прерывания, команды изменения слова состояния процессора, условных и безусловных переходов и др.
Команды эти могут иметь различный формат, в том числе и содержать в себе адреса, но к операндам они не обращаются.
О
,
КОП |
D |
где D является операндом или определяет адрес операнда.
Двухадресные команды обрабатывают два операнда и могут иметь, например, такой формат:
,
КОП |
S |
D |
где S — источник, а D — приемник (порядок следования внутри команды S и D в разных семействах машин различный). Операция производится в следующем порядке:
D <операция> S D,
т.е. сначала в операции участвует содержимое приемника (первый операнд), затем содержимое источника (второй операнд), результат заносится по адресу в приемник. После операции содержимое первого операнда теряется, что необходимо учитывать при написании программ.
К двухадресным командам относятся такие команды, как сложение, вычитание, сравнение двух операндов, пересылки числа из одной ячейки в другую, некоторые логические команды.