microbik.ru
1 2 3

I.Общий обзор архитектур ЭВМ. Архитектура Intel X86


I.Общий обзор архитектур ЭВМ. Архитектура Intel X86


1.Основные принципы построения ЭВМ. Стандарт IBM PC

1.1.Способы представления информации. Аналоговые и цифровые ЭВМ

Существует два способа представления сигналов для хранения, передачи и обработки информации: аналоговый и цифровой. Аналоговый сигнал по своей природе является непрерывным и находится в некотором диапазоне. Значение его непрерывно меняется во времени. Практически все сигналы, с которыми сталкивается человек, являются аналоговыми. Например, запись звука на магнитной кассете. Цифровой сигнал является дискретным сигналом и имеет только два значения - высокий и низкий уровень. Изменение с низкого уровня на высокий, и наоборот происходит скачкообразно.

У каждого вида сигналов есть свои недостатки и преимущества. Аналоговый сигнал более информативен, на один и тот же носитель может быть записано гораздо больше информации в аналоговом виде, чем в цифровом. Однако аналоговый сигнал имеет низкую точность и особенно точность падает через продолжительные промежутки времени. Также точность аналогового сигнала сильно падает при регенерации и усилении. Например, запись на кассете со временем значительно теряет качество звучания, в то время как цифровая запись на компакт диске остается как новая, а при регенерации не теряет качества.

На заре истории в вычислительных системах использовались аналоговые сигналы, что приводило к большой потере точности особенно при значительных вычислениях. Также недостатком этих систем являлось то, что каждый раз при новых вычислениях приходилось переконфигурировать всю вычислительную установку.

Через некоторое время для повышения точности стали использовать цифровые (дискретные) сигналы. Данные хранились в цифровом виде в ячейках памяти. Однако алгоритм вычислений по-прежнему реализовывался в аппаратуре.

В 1940-х годах группа ученых во главе с Фон Неманом предложила новый принцип построения вычислительных машин (в последствии названных компьютерами), в котором и код и данные находились в одной памяти. Для изменения алгоритма вычислений требовалось лишь заменить программу в памяти.

1.2.Фон Неймановская архитектура компьютеров

В современных компьютерах построенных по архитектуре Фон Неймана используются цифровые сигналы для передачи, хранения и обработки информации. Цифровой сигнал имеет два значения - высокий и низкий. Обычно низкий сигнал интерпретируется как 0, а высокий - как 1.

Для сохранения информации используются элементы, способные удерживать сигнал хотя бы некоторое время. Обычно такими элементами выступают транзисторы. Существует два типа памяти: статическая и динамическая. Статическая память более простая и дешевая, но требует регенерации и, следовательно, медленная. Динамическая память более дорогая и не требует регенерации и обычно используется в КЭШах.

Итак, один элемент памяти может содержать либо 0, либо 1. Если использовать два элемента памяти совместно, то можно хранить уже 4 значения - 00, 01, 10 и 11. Увеличивая число элементов можно увеличивать число значений до необходимой величины. Таким образом, мы получили возможность хранить числа в любом диапазоне. Элемент памяти, содержащий один двоичный разряд, называется битом. Общее число значений зависит от числа разрядов по следующему закону:

^ Число значений=2^число разрядов.

Следует заметить, что числа начинаются с 0, и, следовательно, максимальное число будет равно 2^число разрядов -1.

Один бит является слишком маленькой единицей информации. Он содержит только два значения: 0 или 1, что слишком мало для использования в одной операции. Обычно биты группируют по восемь. Единица информации, состоящая из восьми битов, называется байтом. В байте может содержаться одно из 256 значений - от 0 до 255. Байт является минимальной единицей информации, с которой работает процессор.

Вся память представляет собой набор пронумерованных байтов. Самый младший байт имеет номер 0, затем идет байт с номером 1, 2, 3 и т.д. Номер байта является адресом в памяти. Доступ к байту осуществляется по адресу, т.е. для того чтобы прочитать или записать содержимое байта, необходимо указать его адрес (номер).

Байт - тоже небольшая единица информации. Очень часто требуется большие значения, чем 255. Для этого используются следующие единицы информации:

  • слово - 2 байта или 16 бит, максимальное значение 65535 (2^16-1).

  • двойное слово - 4 байта или 32 бита, максимальное значение 2^32-1.

  • четверное слово - 8 байт или 64 бита, максимальное значение 2^64-1.

Доступ к большим элементам информации также осуществляется по адресу, а обрабатывается сразу несколько последовательно расположенных байтов. Первый байт берется по адресу, второй - по адресу +1, третий - по адресу +2 и т.д. Однако следует заметить, что младший байт не во всех компьютерных архитектурах находится по младшему адресу. В архитектуре Intel x86 это так, т.е. младший байт значения находится по младшему адресу. В архитектуре компьютеров SUN младший байт находится по старшему адресу. Разница расположения байтов в памяти разных компьютерных систем показана на рис.1.1.

Как уже говорилось выше, алгоритм находится в памяти. Он представляется программой, состоящей из простейших команд (пересылки значений из одной ячейки памяти в другую, сложение, вычитание, сравнение, безусловный и условный переход и т.д.). Их интерпретацией и выполнением занимается процессор. Для того, чтобы определять команду, которую необходимо выполнять, процессор использует внутреннюю ячейку памяти (системный регистр - указатель команды), в котором содержится адрес следующей команды. Именно от разрядности этого регистра зависит объем адресуемой процессором памяти (на самом деле адресуемое пространство памяти зависит от разрядности шины адреса, но обычно указатель команд имеет такую же разрядность). При выполнении команды процессор считывает ее в свою внутреннюю память, увеличивает указатель команды, а затем распознает считанную команду и исполняет ее. Для повышения эффективности вычислений в процессоре используются дополнительные ячейки памяти называемые регистрами общего назначения процессора. Обычно все вычисления производятся с использованием этих регистров, а результат сохраняется в памяти.

Команды процессора представляют собой набор байтов, находящиеся в памяти. Каждое число интерпретируется процессом как команда или данные к предшествующей команде. Команды процессора могут состоять из одного байта или из нескольких. В разных архитектурах используются разные подходы к построению команд. Существуют системы команд с фиксированной длиной. В частности команды с фиксированной длиной использовались в системах PDP 11. На сегодняшний день команды с фиксированной длиной используются в процессорах RISC архитектуры. Другим вариантом являются системы команд с плавающей длиной, т.е. разные команды занимают разное число байт в памяти. Преимущество фиксированных команд состоит в простоте и быстроте их декодирования. Команды с плавающей длиной дают возможность сократить код программы за счет использования более коротких кодов для часто используемых команд. В частности в архитектуре Intel x86 используется набор команд плавающей длины.

1.3.Целочисленная арифметика – основа компьютеров

Если бы компьютеры не могли складывать, вычитать, умножать, делить и выполнять другие действия с целыми числами, то что бы они делали и зачем они были бы нужны. Целочисленная арифметика - это основа всего. Даже если процессор обрабатывает вещественные числа, он все равно выполняет действия над целыми числами: мантиссой и порядком. Далее рассматривается, как процессор выполняет целочисленные операции.

Для простоты будем использовать систему исчисления с основанием 10, так как именно эта система более привычна для человека, чем система с основанием 2, которая является родной системой исчисления компьютеров. Тем не менее, каково бы не было основание системы исчисления, принципы от этого не меняются.

Каждое место в процессоре, которое содержит число, называется регистром. Обычно в процессоре имеется около десятка таких регистров. И так предположим, что наши регистры состоят из 4 цифр, и, следовательно, могут содержать числа от 0000 до 9999. Значение регистра можно увеличить или уменьшить. Если к регистру прибавить 27, его значение увеличится на 27. И наоборот если от регистра отнять 153, его значение уменьшится на 153. Если каждый раз к регистру прибавлять 1, то его значение будет увеличиваться на 1: 245, 246, 247, 248. Если из регистра отнимать 1, его значение будет уменьшаться на 1: 3045, 3044, 3043, 3042…

А что если увеличивать регистр несколько дольше. 9997, 9998, 9999, 0000. Опс!!! Вот и проблема. Если регистр достиг 9999, и к нему добавить 1, он изменяется на 0000, а не на 10000. Как отличить разницу между 0000 и 10000? Для решения этой проблемы в процессоре имеет специальный битовый флаг, называемый флагом переноса (CF). Если этот флаг установлен, то произошел переход через границу 9999/0000, если этот флаг сброшен, то перехода не было. Следует заметить, что регистров много, а флаг переноса один. Он отражает результат только последней операции, и его необходимо проверять после каждой операции. В табл.1.1 приведено несколько примеров.

Табл.1.1.Примеры сложения чисел

Число 1

Число 2

Результат сложения

^ Флаг переноса

0289

4782

5071

0



6744

4208

0952

1

Аналогичные проблемы возникают при вычитании из регистра. 0002, 0001, 0000, 9999. Если регистр достиг 0000, и от него отнять 1, он изменяется на 9999, а не на –1, т.е. произойдет эффект, как если бы отнимали 1 от 10000, или другими словами произошел заем из старшей цифры, которой у нас в регистре нет. Чтобы отразить наличие этого факта процессор использует тот же самый флаг переноса (CF), только в данном случае для отражения заема. Если этот флаг установлен, то заем имел место, если флаг сброшен, то заема не было. В табл.1.2 приведено несколько примеров.

Табл.1.2.Примеры вычитания чисел

Число 1

Число 2

Результат вычитания

^ Флаг переноса

8473

2752

5721

0



9281

0654

8627

0

И так до этого мы рассматривали только положительные числа, но очень часто необходимо иметь и отрицательные числа. Конечно, мы можем зарезервировать старшую цифру для знака, а для значения использовать оставшиеся три. Однако это неудобно и неэкономично. В компьютерах используется другой способ представления чисел. И так отрицательные числа представляются следующим образом: 9999=-1, 9998=-2, 9997=-3, 9995=-5 и т.д. Чем меньше отрицательное число, тем меньшим числом оно представляется в регистре; -5=10000-5=9995; -498=10000-498=9502; в общем случае –x=10000-x. Можно легко заметить, что эти отрицательные числа, выглядят точно так же как и беззнаковые числа. Процессор абсолютно не имеет никакого понятия, какое число в регистре: знаковое или беззнаковое. Для сложения и вычитания процессор использует одни и те же команды сложения и вычитания, не зависимо являются ли числа знаковыми, или беззнаковыми.

Какие же числа должны быть положительными, а какие отрицательными? Конечно, ответ на этот вопрос уже давно дан во всех компьютерных системах, но если подумать. Можно определить числа от 0000 до 8000 как положительные, а от 9999 до 8001 – как отрицательные. Однако в данном случае имеется некоторый дисбаланс в сторону положительных чисел. В целях симметрии положительные числа от 0000 до 4999, а отрицательные от 9999-5000. Наименьшее отрицательное число - -5000=10000-5000=5000. Если попытаться изменить знак самого маленького отрицательного числа, то получится тоже число.

Если сказать процессору, что число знаковое, ему достаточно посмотреть на первую цифру, если там 0-4, то число положительное, если 5-9, то число отрицательное. 0 на всех компьютерах интерпретируется как положительное число.

Процессор всегда отслеживает знак числа. После каждой арифметической операции он устанавливает флаг в зависимости от знака результата, этот флаг называется знаковым флагом (SF). Если число положительное SF=0, если число отрицательное SF=1. Если используются беззнаковые числа, что флаг SF игнорируется. В табл.1.3 показан пример последовательного уменьшения регистра и содержимое флагов.

Табл.1.3.Значения флагов при последовательном уменьшении регистра на 1

^ Число в регистре

Флаг знака (SF)

Флаг переполнения (CF)

3 (3)

0

0



9998 (-2)

1

0

А что если сделать еще несколько уменьшений значения регистра, например как показано в табл.1.4? Получается, что если уменьшаем значение 5000 и получаем 4999, меняется знак числа и результат получается неверный. То же самое произойдет, если попытаться сложить два больших положительных или отрицательных числа, например, 3000+3000=6000=-4000. Для отслеживания таких ситуаций в процессоре имеется еще один флаг, называемый флагом переполнения (OF). Если OF=0, то переполнения не было и результат правильный. Если OF=1, то произошло знаковое переполнение и результат не верный. В табл.1.4. приводится еще один пример изменения знаков при уменьшении.

Табл.1.4.Изменение флагов при уменьшении числа

Число

Знак (SF)

Перенос (CF)

^ Переполнение (OF)

5003

1

0

0



4997

0

0

0


следующая страница >>