- •В. Г. Баула Введение в архитектуру эвм и системы программирования
- •Предисловие
- •1. Понятие об архитектуре эвм
- •2. Машина Фон Неймана
- •2.1. Память
- •2.2. Устройство Управления
- •2.3. Арифметико–Логическое Устройство
- •2.4. Взаимодействие уу и алу
- •3. Учебная машина
- •3.1. Схема выполнения команд
- •3.2. Примеры программ для учебной машины.
- •3.2.1. Пример 1. Оператор присваивания.
- •3.2.2. Пример 2. Условный оператор.
- •3.2.3. Пример 3. Реализация цикла.
- •3.2.4. Пример 4. Работа с массивами.
- •3.3. Формальное описание учебной машины
- •4. Введение в архитектуру эвм
- •4.1. Адресность эвм
- •4.2. Сравнительный анализ эвм различной адресности
- •4.3. Дробно-адресная архитектура
- •4.4. Способы адресации
- •4.5. Многообразие форматов данных
- •4.6. Форматы команд
- •4.7. Базирование адресов
- •5. Понятие семейства эвм
- •6. Архитектура младшей модели семейства Intel
- •6.1. Память
- •6.2. Форматы данных
- •6.3. Вещественные числа
- •6.4. Целые числа
- •6.5. Сегментация памяти
- •6.6. Мнемонические обозначения регистров
- •6.7. Структура команд
- •6.8. Команды языка машины
- •6.8.1. Команды пересылки
- •6.8.2. Арифметические команды
- •7. Язык Ассемблера
- •7.1. Понятие о языке Ассемблера
- •7.2. Применение языка Ассемблера
- •7.3. Классификация предложений языка Ассемблер
- •7.4. Пример полной программы на Ассемблере
- •7.5. Переходы
- •7.6. Команды переходов
- •7.6.1. Команды безусловного перехода
- •7.6.2. Команды условного перехода
- •7.6.3. Команды цикла
- •7.7. Работа со стеком
- •7.8. Команды вызова процедуры и возврата из процедуры
- •7.9. Программирование процедур на Ассемблере
- •7.9.1. Стандартные соглашения о связях
- •8. Система прерываний.
- •9. Дополнительные возможности Ассемблера.
- •9.1. Строковые команды.
- •9.2. Логические команды.
- •9.3. Команды сдвига.
- •10. Модульное программирование
- •10.1. Модульное программирование на Ассемблере.
- •10.2. Схема работы редактора внешних связей.
- •10.3. Схема работы статического загрузчика.
- •10.4. Схема работы динамического загрузчика.
- •11. Понятие о системе программирования.
- •11.1. Компоненты системы программирования.
- •11.2. Характеристики исполняемых модулей.
- •11.2.1. Перемещаемые модули.
- •11.2.2. Повторно-выполняемые модули.
- •11.2.3. Повторно-входимые (реентерабельные) модули.
- •12. Макросредства языка Ассемблер.
- •12.1. Сравнение процедур и макроопределений.
- •13. Схема работы транслятора с языка Ассемблера.
- •14. Понятие о мультипрограммном режиме работы.
- •14.1. Требования к аппаратуре для обеспечения возможности работы в мультипрограммном режиме.
- •14.1.1. Система прерываний.
- •14.1.2. Механизм защиты памяти.
- •14.1.3. Аппарат привилегированных команд.
- •14.1.4. Таймер.
- •15. Архитектурные особенности современных эвм.
- •15.1. Конвейерные эвм.
- •15.2. Эвм различной архитектуры.
- •15.2.1. Архитектура эвм с общей шиной.
- •15.2.2. Достоинства и недостатки архитектуры с общей шиной.
- •15.2.3. Архитектура эвм с каналами ввода/вывода.
- •15.3. Уровни параллелизма.
- •Список литературы.
6.4. Целые числа
Мы уже знаем, что хранимые в памяти машинные слова (наборы битов) могут трактоваться по-разному. При вызове в устройство управления этот набор битов трактуется как команда, а при вызове в арифметико-логическое устройство – как число. В дополнении к этому в рассматриваемой нами архитектуре каждое хранимое в памяти целое число может трактоватьсяпрограммистом какзнаковоеилибеззнаковое(неотрицательное). По внешнему видуневозможноопределить, какое число храниться в определённом месте памяти, только сам программист может знать, как онрассматриваетэто число. Таким образом, определены две машинныесистемы счислениядля представления знаковых и беззнаковых чисел соответственно.
Беззнаковые (неотрицательные) числа представляются в уже известной Вам двоичной системе счисления, такое представление называется прямым кодомнеотрицательного числа. Например, десятичное число13, хранимое в одном байте, будет записано как прямой код00001101.
Если инвертировать прямой код (т.е. заменить все "1" на "0", а все "0" на "1"), то получим так называемыйобратныйкод числа. Например, обратный код числа 13 равен11110010.
Для представления отрицательныхзнаковых чисел используется так называемыйдополнительныйкод, который можно получить из дополнительного кода прибавлением единицы. Например, получим дополнительный код числа–13:
Прямой код = 00001101
Обратный код = 11110010
+ 1
Дополнительный код = 11110011
Существует и другой алгоритм преобразования отрицательного числа Xв дополнительный код. Для этого необходимо записать в прямом коде значение2N -|X|, где значениеNравно максимальному числу бит в представлении числа (в нашем примере N=8).
Итак, в знаковой системе счисления отрицательные числа представляются в дополнительном коде, а неотрицательные – в прямом коде. Заметим, что при знаковой трактовке целых чисел крайний правый бит определяет знак числа ("1" для отрицательных чисел). Этот бит называется знаковымбитом целого числа. Для знаковых чисел числовая ось несимметрична: количество отрицательных чисел на единицу больше, чем количество положительных чисел (докажите это !).
Процесс перехода от прямого кода к дополнительному коду и обратно с технической точки зрения очень прост и может быть легко реализован в центральном процессоре.
Очень важно понять, что все арифметические операции над знаковыми и беззнаковыми целыми числами производятся абсолютно по одинаковым алгоритмам, что естественно, потому что центральный процессор "не знает", какие это числа "на самом деле". В то же время, с точки зрения программиста, результаты таких операций могут быть разными для знаковых и беззнаковых чисел. Рассмотрим примеры сложения двух чисел длиной в байт. В первом столбике записано внутреннее двоичное представление чисел, а во втором и третьем – беззнаковое и знаковое десятичное представления этих же чисел.
Пример 1.
-
Б/з.
Знак.
11111100
252
–4
00000101
5
5
100000001
1
1
Из этого примера видно, что для знаковой трактовки чисел операция сложения выполнена правильно, а при рассмотрении чисел как беззнаковые результат будет неправильным, так как мы получим девятизначное двоичное число, не "умещающееся" в один байт. Так как центральный процессор "не знает", как программист будет трактовать складываемые числа, то он "на всякий случай" сигнализирует о том, что при сложении беззнаковых чисел произошла ошибка.
Для обозначения таких (и некоторых других) ситуаций в архитектуре компьютера введено понятие флагов. Каждый флаг занимает один бит в специальномрегистре флагов (FLAGS). В данном случае флагCF(carryflag) примет значение, равное единице (иногда говорят – флагподнят). Рассматривая результат в знаковых числах, мы получили правильный ответ, поэтому соответствующий флагOF(overflowflag) будет положен равным нулю (опущен).
Пример 2.
-
Б/з.
Знак.
01111001
121
121
00001011
11
11
10000100
132
-124
В данном примере ошибка будет, наоборот, в случае со знаковой трактовкой складываемых чисел, поэтому флаги CFиOFпринимают соответственно значения0и1.
Пример 3.
-
Б/з.
Знак.
11110110
246
–10
10001001
137
–119
101111111
383
+127
В данном случае результат будет ошибочен как при беззнаковой, так и при знаковой трактовке складываемых чисел. Содержимое флагов: CF = OF = 1. Легко придумать пример, когда результат сложения правильный как для знаковых, так и для беззнаковых чисел (сделайте это самостоятельно!).
Кроме формирования флагов CF и OFкоманда сложения целых чисел меняет и значения некоторых других флагов в регистре флаговFLAGS. Для нас будет важен флагSF, в который заносится знаковый (крайний правый) бит результата, и флагZF, который устанавливается в 1, если результат равен нулю, в противном случае этот флаг устанавливается в 0.
Представление отрицательных чисел в дополнительном коде не очень удобно для программистов, однако, позволяет существенно упростить арифметико-логическое устройство. Заметим, например, что вычитание можно выполнять как сложение с дополнительным кодом числа.
Основная причина использования двух систем счисления для представления целых чисел заключается в том, что при использовании обеихсистем счисления диапазон представимых целых чисел увеличивается в полтора раза. Это было весьма существенно для первых ЭВМ с их небольшим объёмом памяти.