- •Архитектура ом
- •Структура машин фон-Неймана, із загальною шиною, з каналами прямого доступу в пам'ять. Порівняльний аналіз і область застосування.
- •Апаратно-програмна реалізація обчислювальної системи. Призначення й основні функції операційної системи, однопрограмний і багатопрограмний режими роботи системи.
- •Класифікація операцій. Формати представлення команд і даних. Чотири-, трьох-, двох-, одно- і нуль-адресні команди. Определение наборов операций
- •Форматы команд
- •Способи адресації операндів. Безпосередня, пряма, непряма й індексна адресації. Призначення й область застосування.
- •Відносна, сторінкова і сегментна адресація. Переміщення програм і даних в оперативній пам'яті машини.
- •Операції переходу і розгалуження, їхня реалізація.
- •Операції звертання до підпрограм. Способи організації підпрограм. Організація динамічного розподілу пам'яті для підпрограм і їхніх даних.
- •Віртуальна пам'ять. Сторінкова організація віртуальної пам'яті. Алгоритми звертання до пам'яті.
- •Самообумовлені дані. Теги і дескриптори. Призначення і їхнє застосування.
- •Захист пам'яті. Призначення. Методи захисту верхніми і нижніми границями.
- •Захист пам'яті за допомогою ключів захисту. Структурна схема пам'яті з захистом. Достоїнства і недоліки.
- •Віртуальні процесори. Призначення і реалізація.
- •Віртуальні периферійні пристрої. Призначення, приклад реалізації.
- •Віртуальні машини. Призначення і приклад реалізації.
- •Операції вводу-виводу в ibm pc.
- •НкДтаЕ еом
- •Об'єкт діагностування, клас несправності, тест, система діагностування. Основні поняття і визначення.
- •Методи параметричного діагностування (пд).
- •Детермінований функціональний підхід до синтезу тестів.
- •Детермінований структурний підхід до синтезу тестів.
- •Обзор существующих методов
- •Застосування логічного моделювання для синтезу тесту.
- •Методи аналізу вихідних реакцій.
- •Ймовірний подхід до синтезу тестів.
- •Основні підходи до тестування мікропроцесорних пристроїв.
- •Попередні перетворення опису схем для синтезу схем.
- •Двійкова і двійково-кодована система числення.
- •Представлення числової інформації в еом.
- •Алгоритми додавання чисел.
- •Алгоритми множення чисел.
- •Алгоритми ділення чисел.
- •Виконання арифметичних операцій над числами з плаваючою крапкою.
- •Виконання арифметичних операцій у двійковій-десятковій системі числення.
- •Контроль по модулю арифметичних операцій.
- •Точність представлення чисел і виконання арифметичних операцій.
- •Проектування мпс
- •Мікропроцесори 2 і 3-го покоління фірми Intel.
- •Організація пам'яті в мікропроцесорних системах.
- •Організація переривань у мікропроцесорних системах.
- •Програмуємий послідовний інтерфейс мпс.
- •Організація вводу-виводу на базі віс пдп.
- •Реалізація внутрішніх системних інтерфейсів мпс.
- •Однокристальні мікро-еом фірми Intel.
- •Віс мпк 2 і 3-го поколінь фірми Intel.
- •Зовнішні інтерфейси мпс.
- •Структура пеом ibm pc.
- •Структура 32-х розрядних мікропроцесорів 4-го покоління фірми Intel.
- •Структура віс мікропроцесорного комплекту 4-го покоління для 32-х розрядних мікропроцесорних систем.
- •Комбінаційні схеми (кс). Основні поняття і визначення. Канонічний метод синтезу кс.
- •Комбінаційні схеми (кс). Аналіз кс. Основні методи аналізу кс.
- •Абстрактний автомат. Основні поняття і визначення. Класифікація. Способи завдання.
- •Способы описания и задания автоматов.
- •Канонічний метод синтезу кінцевого автомата.
- •Кодування внутрішніх станів автомата.
- •Кодирование состояний и сложность комбинационной схемы автомата.
- •Принцип мікропрограмного керування.
- •Структура операційного пристрою. Функції операційного і керуючого автоматів.
- •Мікропрограмні автомати (мпа). Інтерпретація граф-схеми алгоритму. Способы описания алгоритмов и микропрограмм
- •Канонічний метод синтезу мпа Милі з "жорсткою" логікою.
- •Канонічний метод синтезу мпа Мура з "жорсткою" логікою.
- •Достоинства и недостатки автоматов с жесткой логикой.
- •Синтез мпа Мура на базі регістру зсуву. Синтез управляющего автомата Мура на базе регистра сдвига.
- •Операційний автомат і мікропрограма додавання дробових чисел з фіксованою крапкою.
- •Операційний автомат і мікропрограма множення дробових чисел з фіксованою крапкою.
- •Двійкові-десяткові коди (д-коды) і їхньої властивості. Виконання арифметичних операцій у д-кодах.
- •Система числення в залишкових класах. Її особливість і застосування в обчислювальній техніці.
Алгоритми додавання чисел.
Вообще, сложение чаще всего заменяет все операции в ЭВМ, в том числе и вычитание, поэтому этот пункт будет самым большим, ибо нам надо разобрать все возможные случаи. Для примера будем брать 2 числа: A и B, которые будут менять свои значения в зависимости от примера. Стоит заметить, что все операции сложения чаще всего ведутся в обратных кодах. Не забываем, что у положительного числа все коды одинаковы.
Основные принципы сложения:
0 + 0 = 0
0 + 1 = 1
1 + 0 = 0
1 + 1 = 10
В последнем случае при сложении в столбик мы пишем 0, а 1 запоминаем. Все, как и в обычном сложении.
Сложение в обратных кодах
Случай 1. А и В положительные числа.
При суммировании таких чисел просто складываются их обратные коды (которые равны прямым), включая знаковый разряд. Учитывая тот факт, что у положительных чисел знаковый разряд равен нулю, у суммы он также равен нулю, следовательно, число получается положительное.
1310 = 0000 11012 (ПК/ОК)
2310 = 0001 01112 (ПК/ОК)
(13+23)10 = 0010 01002 (ПК/ОК) = 3610
Случай 2. А — положительное, а В — отрицательное, по модулю больше А.
В этом случае мы просто складываем числа А и В. Результат получаем, как обычно, в обратном коде:
1310 = 0000 11012 (ПК/ОК)
−2310 = 1001 01112 (ПК) = 1110 10002 (ОК)
(13 + (−23))10 = 1111 01012 (ОК) = 1000 10102 (ПК) = −1010
Случай 3. А — положительное, а В — отрицательное, по модулю меньше А.
На первый взгляд, кажется, что этот случай не отличается от рассмотренного выше второго, однако, давайте посмотрим, что же получится в итоге:
−1310 = 1000 11012 (ПК) = 1111 00102 (ОК)
2310 = 0001 01112 (ПК)
Обратите внимание на результат. У нас выходит, будто сумма — отрицательное число (ибо в знаковом разряде единица), причем, цифр также больше. И, даже если бы не будем учитывать знак, а просто переведем модуль, то получим 910, а не 1010, как должно быть.
Компьютер решает эту проблему, прибавляя получившуюся «лишнюю» единицу к получившемуся числу. Выглядит это следующим образом:
Как видите, в результате мы получили положительное число 0000 10102, переведя которое в десятичную систему счисления мы получим 1010. А это и есть правильный ответ.
Случай 4. А и В отрицательные числа.
При таких условиях нам точно так же, как и в третьем случае, придется прибавлять единицу из знакового разряда к основному числу.
Проверим:
−1310 = 1000 11012 (ПК) = 1111 00102 (ОК)
−2310 = 1001 01112 (ПК) = 1110 10002 (ОК)
Переведем получившийся обратный код в десятичное число: 1101 10112 (ОК) = 1010 01002 (ПК) = −3610. Как мы видим, ответ получился верным.
Однако, не всегда сложение проходит так гладко. Если вдруг числа у нас достаточно большие, то может возникнуть переполнение, то есть, результат не будет помещаться в выделенное для него место в памяти. Как вам понять, что возникло переполнение? Конечно, можно перевести число в десятичную систему счисления и проверить, больше ли модуль этого числа, чем максимально возможный. Однако, есть и другой способ. Если знак результата получается не таким, какой вы ожидали (не такой, как в примерах выше), значит, произошло переполнение.
К слову, «максимально возможный модуль» для чисел со знаком равен 2n-1, где n — количество бит, отведенных для хранения числа. Напомню, что в 1 байте 8 бит, в 2 байтах 16 бит и так далее. Получается, что если на хранение числа у вас отводится один байт, то максимально возможный модуль это 28-1 = 27 = 128. Если число у вас получается по модулю больше, значит, для операции требуется выделить на слагаемые больше памяти.
Отмечу, что переполнение может возникнуть только в том случае, когда оба числа положительны или отрицательны, ибо, когда знаки у них разные, модуль результата будет меньше как минимум одного слагаемого.
Случай 5. Переполнение, когда А и В положительные.
10010 = 0110 01002 (ПК/ОК)
3010 = 0001 11102 (ПК/ОК)
Заметьте, что, складывая два положительных числа, мы получили отрицательное. Следовательно — переполнение. Решается это, как я уже говорил, расширением диапазона:
10010 = 0000 0000 0110 01002 (ПК/ОК)
3010 = 0000 0000 0001 11102 (ПК/ОК)
Обратите внимание, что теперь в старшем разряде у нас 0, а значит, получили мы положительное число. И, естественно, результат верен: 0000 0000 1000 00102 = 13010.
Случай 6. Переполнение, когда A и B — отрицательные.
Тут та же история, что и в пятом случае. Убедимся в этом:
-10010 = 1110 01002 (ПК) = 1001 10112 (ОК)
-3010 = 1001 11102 (ПК) = 1110 00012 (ОК)
Как обычно, убираем лишнюю единицу, прибавляя ее к результату:
Итог: положительное число. Что делаем? Расширяем диапазон!
-10010 = 1000 0000 0110 01002 (ПК) = 1111 1111 1001 10112 (ОК)
-3010 = 1000 0000 0001 11102 (ПК) = 1111 1111 1110 00012 (ОК)
На этот раз получается отрицательное число. Значит, все верно.
Сложение в дополнительных кодах
Случай 1. A и B — положительные числа.
В этом случае ничего не поменяется, ибо, как вы помните, у положительного числа прямой, обратный и дополнительный коды совпадают.
Случай 2. А — положительное, а В — отрицательное, по модулю больше А.
В этом случае мы получим верный результат, но уже в дополнительном коде. Оно и логично, складываем-то мы в дополнительном
Случай 3. A — положительное, а B — отрицательное, по модулю меньше A.
В случае с обратными кодами мы прибавляли лишнюю единицу к полученному коду. Здесь же нам придется ее просто отбрасывать. Давайте посмотрим:
−1310 = 1000 11012 (ПК) = 1111 00102 (ОК) = 1111 00112 (ДК)
2310 = 0001 01112 (ПК)
0000 10102 — это уже 1010, а раз мы получили правильный ответ, то нам не нужна лишняя единица. Мы просто отбрасываем ее.
Случай 4. A и B — отрицательные.
Здесь у нас два отрицательных числа, и оба в дополнительном коде, то есть, по логике вещей, результат у нас итак должен получиться в дополнительном коде.. но ведь у нас еще и единица там дополнительная, помните? Давайте взглянем, что же получится:
−1310 = 1000 11012 (ПК) = 1111 00102 (ОК) = 1111 00112 (ДК)
−2310 = 1001 01112 (ПК) = 1110 10002 (ОК) = 1110 10012 (ДК)
Взглянем на число, не учитывая «лишнюю единицу»: 1101 11002 (ДК) = 1101 11012 (ОК) = 1010 00102 (ПК) = −3610. Заметили? И без единицы у нас снова получился правильный ответ, поэтому мы просто отбрасываем единицу, как и в предыдущем примере, и ничего более не делаем.
Пятый и шестой случаи — переполнение — для дополнительного кода аналогичны обратному.
Стоит заметить, что перевод в дополнительный код для компьютера дольше, чем в обратный, ибо там не нужно прибавлять единицу. Однако, как вы смогли заметить, отрицательные складывать легче в дополнительном коде, ибо нет лишнего прибавления единицы.
Итог: Стоит запомнить, что во всех случаях, кроме особого (случай 4, дополнительный код), если у вас получается лишняя единица — вы прибавляете ее к остальной части числа. И не забывайте про то, что если результат у вас получается не того знака, который вы ожидали — это переполнение.
Сложение двоичных чисел без знака
Микропроцессор выполняет сложение операндов по правилам сложения двоичных чисел. Проблем не возникает до тех пор, пока значение результата не превышает размерности поля операнда (см. табл. 1). Например, при сложении операндов размером в байт результат не должен превышать число 255. Если это происходит, то результат оказывается неверным. Рассмотрим, почему так происходит. К примеру, выполним сложение: 254 + 5 = 259 в двоичном виде. 11111110 + 0000101 = 1 00000011. Результат вышел за пределы восьми бит и правильное его значение укладывается в 9 бит, а в 8-битовом поле операнда осталось значение 3, что, конечно, неверно. В микропроцессоре этот исход сложения прогнозируется и предусмотрены специальные средства для фиксирования подобных ситуаций и их обработки. Так, для фиксирования ситуации выхода за разрядную сетку результата, как в данном случае, предназначен флаг переноса cf. Он располагается в бите 0 регистра флагов eflags/flags. Именно установкой этого флага фиксируется факт переноса единицы из старшего разряда операнда. Естественно, что программист должен предусматривать возможность такого исхода операции сложения и средства для корректировки. Это предполагает включение участков кода после операции сложения, в которых анализируется флаг cf. Анализ этого флага можно провести различными способами. Самый простой и доступный — использовать команду условного перехода jcc. Эта команда в качестве операнда имеет имя метки в текущем сегменте кода. Переход на эту метку осуществляется в случае, если в результате работы предыдущей команды флаг cf установился в 1. Если теперь посмотреть на рис. 1, то видно, что в системе команд микропроцессора имеются три команды двоичного сложения:
inc операнд — операция инкремента, то есть увеличения значения операнда на 1;
add операнд_1,операнд_2 — команда сложения с принципом действия: операнд_1 = операнд_1 + операнд_2
adc операнд_1,операнд_2 — команда сложения с учетом флага переноса cf. Принцип действия команды:
операнд_1 = операнд_1 + операнд_2 + значение_cf
Обратите внимание на последнюю команду — это команда сложения, учитывающая перенос единицы из старшего разряда. Механизм появления такой единицы мы уже рассмотрели. Таким образом, команда adc является средством микропроцессора для сложения длинных двоичных чисел, размерность которых превосходит поддерживаемые микропроцессором длины стандартных полей.
Сложение двоичных чисел со знаком
Теперь настала пора раскрыть небольшой секрет. Дело в том, что на самом деле микропроцессор не подозревает о различии между числами со знаком и без знака. Вместо этого у него есть средства фиксирования возникновения характерных ситуаций, складывающихся в процессе вычислений. Некоторые из них мы рассмотрели при обсуждении сложения чисел без знака:
флаг переноса cf, установка которого в 1 говорит о том, что произошел выход за пределы разрядности операндов;
команду adc, которая учитывает возможность такого выхода (перенос из младшего разряда).
Другое средство — это регистрация состояния старшего (знакового) разряда операнда, которое осуществляется с помощью флага переполнения of в регистре eflags (бит 11).
Таким образом, мы исследовали все случаи и выяснили, что ситуация переполнения (установка флага of в 1) происходит при переносе:
из 14-го разряда (для положительных чисел со знаком);
из 15-го разряда (для отрицательных чисел).
И наоборот, переполнения не происходит (то есть флаг of сбрасывается в 0), если есть перенос из обоих разрядов или перенос отсутствует в обоих разрядах.
Итак, переполнение регистрируется с помощью флага переполнения of. Дополнительно к флагу of при переносе из старшего разряда устанавливается в 1 и флаг переноса cf. Так как микропроцессор не знает о существовании чисел со знаком и без знака, то вся ответственность за правильность действий с получившимися числами ложится на программиста. Проанализировать флаги cf и of можно командами условного перехода jc\jnc и jo\jno соответственно.
Что же касается команд сложения чисел со знаком, то они те же, что и для чисел без знака.
