В статье 7 «Цифровые форматы» мы познакомились, как представляются числа в цифровом виде. Были рассмотрены форматы целых чисел, чисел с фиксированной точкой и чисел с плавающей точкой.
Теперь мы можем строить Команды ЦП, зная, как выглядят числа в цифре.
Напомню, что Система Команд ЦП почти одинаковая для всех современных Процессоров типа Intel, AMD и других производителей, так как на всех этих ЦП работают различные Операционные системы типа Windows, а также различные приложения типа Word, Exel, PhotoShop, AutoCad. Число таких команд чуть более 200. Это Команды, которые впервые доступны пользователю, т.е. программисту. По-другому их называют Ассемблер.
Это третий уровень команд в ЦП. Первый уровень – Комадны АЛУ. Второй уровень – Микрокоманды. Третий уровень – это система Команд ЦП Ассемблер. Есть еще один уровень программирования в ЦП – это стандатризированные команды Ввода-Вывода. В машинах серии ЕС ЭВМ их называли Канальными командами, там за Ввод-Вывод отвечали электронные системы, которые назывались Каналами Ввода- Вывода. Каналы Ввода-Вывода это были отдельные электронные блоки вне Центрального Процессора. В современных ЦП за Ввод-Вывод отвечает чип Северный мост.
Также надо иметь в виду, что Команды ЦП могут быть
1. Одноадресные
2. Двухадресные
3. Трехадресные
Это связано с тем, что в Команде нужно задать адреса, где находится в ОЗУ первый операнд А, второй операнд В , и дрес в ОЗУ куда надо поместить результат операции. Смотрите ниже:
Сделаем небольшой экскурс в прошлое и назовём ЭВМ, которые имели различную систему адресации:
1. «БЭСМ-6» Одноадресная Обьём ОЗУ 64 Кбайт
2. «М-222» Трехадресная Обёьм ОЗУ 16-32 Кбайт
3. «Минск-32» Одно и двухадресная Обьём ОЗУ 16-64 Кбайт
4. «Наири-3-1» Перем. до 3х адресов Оббём ОЗУ 12-64 Кбайт
5. «Мир-3» Переменная Обьём ОЗУ 16-64 Кбайт
6. «ЕС-1020» Двухадресная Обьём ОЗУ 128-256 Кбайт
7. «ЕС-1035» Двухадресная Обьём ОЗУ 1-3 Мбайт
Что значит Трехадресная система команд или по другому Трехадресная ЭВМ? Это значит, что в одной арифметической команде должно находится сразу три адреса ОЗУ – двух операндов и адрес результата.
В Двухадресной системе команд задается адрес первого операнда и адрес второго операнда. Результат помещается на место первого операнда.
В Одноадресной системе команд задается Адрес Второго операнда. Первый операнд уже находится в специальном регистре М – в Магазине. Результат помещается в Магазин.
В современных ЦП используется одноадресная система команд и вот почему.
В Прошлых ЭВМ обьём ОЗУ был небольшим. И длина адреса одного операнда в ОЗУ с обьёмом до 64 Кбайт равна 16 битам.
Сейчас обьём ОЗУ достигает несколько Гигабайт.
Длина адреса для одного операнда в ОЗУ в 4 Мбайта равна 32 битам
Длина адреса для одного операнда в ОЗУ в 1 Терабайт равна 40 битов.
Чем больше обьём ОЗУ, тем длиннее адрес операнда.
Поэтому в Прошлых ЭВМ еще допускались двух и трехадресные системы команд.
Длина самой команды при Трехадресной системе команд для ОЗУ более 4 Мбайт была была бы более 15 байтов.
В современных ЭВМ применяется в основном одноадресная система команд чтобы длина самой команды ЦП не была очень длинной.
Проиллюстритруем как делается умножение в целых числах.
Пусть А=179 В=173
Перемножим эти числа, как это делает ЦП.
Нам нужно найти E =A * B
Представим их в двоичном коде размером в 1 байт:
А = 10110011 В=10101101
Делаем умножение столбиком, как учили в школе.
Бит 0 = 1 в строке 2 числа В. Умножение на 1 даёт то же самое число.
1. Умножаем бит 0 (=1) в строке 2 числа В на всё число А в строке 1 и записываем результат в строку 3 начиная с бита 0.
2. Умножение на 0 даёт 0. Умножаем бит 1 (=0) в строке 2 числа В на число А в строке 1. Получаем все нули. Записываем их в строке 4,начиная с бита 1 влево.
3. Умножаем бит 2 (=1) в строке 2 числа В на всё число А в строке 1 и записываем результат в строку 5 начиная с бита 2 влево
4. Умножаем бит3 (=1) в строке 2 числа В на всё число А в строке 1 и записываем результат в строку 6 начиная с бита 3 влево
5. Умножаем бит 4 (=0) в строке 2 числа В на число А в строке 1. Получаем все нули. Записываем их в строке 7,начиная с бита 4 влево
6. Умножаем бит5 (=1) в строке 2 числа В на всё число А в строке 1 и записываем результат в строку 8 начиная с бита 5 влево.
7. Умножаем бит6 (=0) в строке 2 числа В на число А в строке 1. Получаем все нули. Записываем их в строке 9,начиная с бита6 влево.
8. Умножаем бит7 (=1) в строке 2 числа В на всё число А в строке 1 и записываем результат в строку 10 начиная с бита 7 влево.
Это иллюстративный пример. В реальности на нуль не умножается, чтобы не тратить время и программный код. Тогда схематично это выглядит так:
1. Копируется число А.
2. Число А ставится в нижестоящую строку после числа В со сдвигом влево в тот битовый разряд равный 1 как у числа В, на который было произведено умножение числа А.
3. Получаем столько строк из числа А со сдвигом влево сколько битов, равных 1, есть у числа В.
4. Складываем все строки согласно двоичной СС.
Это тоже схематический и иллюстративный пример.
На самом деле никаких строк не пишется, а на каждом этапе производится двоичное сложение результата на предыдущем этапе с новым числом А со сдвигом.
Этот пример отвечает на вопрос, почему ЦП делает вычисления в двоичной системе счисления?
Ответ: потому, что умножение на 1 даёт тот же результат. Это значит, что умножение как таковое не производится, а просто делается копия числа А и оно складывается само с собой, каждый раз с необходимым сдвигом влево. Управляет сдвигом влево число В.
Все шаги, которые мы рассмотрели в этом примере, а именно : копирование, сдвиг влево, арифметическое сложение, выполняет АЛУ. В составе команд АЛУ есть все эти операции. Пишется микропрограмма для операции сложения из кодов микрокоманд. Эта микропрограмма и делает умножение, как в примере.
Все остальные команды ЦП, впервые доступные программисту (ассемблер), представляют собой микропрограммы. Одной команде соответствует одна микропрограмма. Её пишут разработчики ЦП. В алгоритмах микропрограмм возможны ошибки, человеческий фактор присутствует.
В 1994 году фирма Intel выпустила на рынок процессор Pentium, который делал ошибку в делении чисел с плавающей точкой, а именно:
4195835.0 / 3145727.0 = 1.333 820 449 … правильное значение
4195835.0 / 3145727.0 = 1.333 739 068 … ошибочное значение
Ошибку исправили путем исправления кода микропрограммы.
Необходимо учесть при разработке кодов команд ЦП (ассемблера), что код команды пишется в старшем байте и код команды выражает две функции:
1. Смысл действия команды
2. Длину команды в байтах.
Длина команды нужна для формирования адреса следующей команды. К адресу текущей команды прибавляется длина текущей команды в байтах.
Сотрудники Вычислительного Центра Главсредволговодстроя г. Саратов, 1977-1993.
------------------------------
Если Вам понравился материал статьи, подпишитесь пожалуйста на мой канал в целом.
Для этого пройдите по ссылке ниже и нажмите кнопку "Подписаться"
https://dzen.ru/profile/editor/id/62cd3cfc63f88417d7e74b79