0000 0100 (обозначает +4)
1000 0100 (обозначает -4)
0111 1111 (обозначает +127)
1111 1111 (обозначает -127)
У такого представления, называемого прямым кодом, имеется один серьезный недостаток: для него потребуются специальные арифметические правила. Покажем это на примере использования двоичной арифметики для вычитания +1 из 0 с ожидаемым получением -1:
-0000 0000 (0 в прямом коде)
0000 0001 (+1 в прямом коде)
1111 1111 (-127 в прямом коде)
При использовании для знаковых чисел (как и для беззнаковых) обычной двоичной арифметики требуется особое представление знаковых чисел, в котором 11111111 представляет -1, а не -127. Кроме того, вычитание +1 из -1 должно давать -2. Выполним это вычитание, чтобы посмотреть, как должно выглядеть -2:
11111111 (это -1)
00000001 (вычитаем +1)
11111110 (и называем это -2)
Рассмотренное представление называется дополнительным кодом; в этом коде операции сложения и вычитания дают правильный результат в дополнительном коде, например:
+00000011 (+3 в дополнительном коде)
11111110 (-2 в дополнительном коде)
0000 0001 (+1 в дополнительном коде)
В дополнительном коде старший бит неотрицательного (положительного или нулевого) числа содержит 0, а отрицательного числа -1. Следовательно, как и в прямом коде, этот бит является знаковым.
Знак числа в дополнительном коде можно изменить, если изменить (инвертировать) значение каждого бита и прибавить +1. Например, мы можем получить представление -5 в дополнительном коде из представления +5 в дополнительном коде следующим образом:
+00000101 (+5 в дополнительном коде)
11111010 (+5 с измененными битами)
0000 0001 (+1 в дополнительном коде)
11111011 (- 5 в дополнительном коде)
Необходимо очень осторожно подходить к увеличению длины чисел представленных в дополнительном коде. Бели 8-битное число в дополнительном коде расширяется до 16 бит (например, для сложения с 16-битным числом в дополнительном коде), нужно подумать, что же поместить в левые 8 бит.
Предположим, что мы хотим прибавить число 0000 0001 (+1 в дополнительном коде) к 0000 0000 0000 0011 (+3 в дополнительном коде). Наверное, ни у кого не возникает сомнений в том, что здесь следует просто добавить в числе +1 восемь нулей с левой стороны, а затем сложить:
+0000 0000 0000 0011 (+3 в дополнительном коде)
0000 0000 0000 0001 (+1 в дополнительном коде)
0000 0000 0000 0100 (+4 в дополнительном коде)
Однако при необходимости прибавить число 1111 1111 (-1 в дополнительном коде) к числу 0000 0000 0000 0011 (+3 в дополнительном коде) следует добавить к числу -1 слева восемь единиц (добавление нулей превратило бы -1 в положительное число). После этого производится сложение:
+0000 0000 0000 0011 (+3 в дополнительном коде)
1111 1111 1111 1111 (-1 в дополнительном коде)
0000 0000 0000 0010 (+2 в дополнительном коде)
Следовательно, расширение 8-битного числа в 16-битное выглядит так:
Значение | 8-битное представление | 16-битное представление |
+1 | 0000 0001 | 0000 0000 0000 0001 |
-1 | 1111 1111 | 1111 1111 1111 1111 |
Таким образом, для расширения числа в дополнительном коде необходимо ввести новые биты слева и поместить в каждый из них значение знакового бита. Этот процесс называется расширением со знаком.
Заключение. Познакомившись с компьютерами и представлением чисел, мы готовы к изучению конкретного процессора 80286. В следующей лекции мы рассмотрим его машинную организацию.
Лекция 3. Машинная организация процессора 80286
1.1. Введение.
Один из способов изучения компьютера заключается в рассмотрении его функциональных компонентов. Описание этих компонентов и их взаимодействия иногда называется архитектурой компьютера. В понятие архитектуры входят число регистров и их функции, объем подключаемой памяти, способы ее адресации и средства ввода-вывода.
Микросхема 80286 содержит значительную часть компонентов компьютера, например схемы, которые управляют всеми его функциями, а также все регистры и флажки. В ней нет памяти и устройств ввода-вывода, но их легко подключить к микросхеме и образовать законченный компьютер. Совокупность всех элементов, содержащихся на кристалле микросхемы, иногда называют процессором.
Процессор 80286 имеет два режима работы: режим реального адреса (или, короче, реальный режим) и защищенный режим виртуального адреса (виртуальный режим). В первом режиме процессор ведет себя как более быстродействующий микропроцессор 8086, и многие программисты будут использовать его именно в этом режиме. Виртуальный режим предназначен для системных программистов и пользователей, разрабатывающих сверхбольшие программы. В этой лекции мы сосредоточимся на реальном режиме, а виртуальный режим подробно рассмотрим в следующих лекциях.
Процессор 80286 имеет четыре набора регистров: регистры общего назначения для хранения промежуточных результатов; указательные и индексные регистры для локализации информации в определенных областях памяти; сегментные регистры, которые служат для задания этих областей памяти; в последний набор входит указатель команды. Кроме того, в процессоре находится девять флажков, фиксирующих текущее состояние и управляющих его работой. Процессор может обращаться более чем к 1 млн. байт памяти (и намного больше в виртуальном режиме) и более чем к 65 000 входных и выходных портов
Типичные команды компьютера локализуют операнды (т. е. обрабатываемые данные), выполняют операцию над значениями операндов и помещают результат в указанное место. В зависимости от команды операнды и результат могут находиться в памяти или регистрах. Средства их локализации называются режимами адресации операндов; они будут рассмотрены позже.
2.2. Структура памяти.
Память системы, работающей в реальном режиме, образуют 220 (примерно 1 млн.) 8-битных величин, называемых байтами. Каждому байту назначен уникальный адрес (беззнаковое число) из диапазона от 0 до 220 -- 1 (от 00000 до FFFFF в шестнадцатеричной системе счисления), что показано на рис. 2.1. В виртуальном режиме размер памяти расширяется до 224 (16 млн.) байт.
Любые два смежных (или соседних) байта в памяти образуют слово. У каждого из двух байт в слове есть свой адрес и меньший из них принимается за адрес слова. Примеры слов показаны на рис. 2.2.
Слово состоит из 16 бит. Байт с большим адресом содержит старшие биты слова, а байт с меньшим адресом - младшие. Сначала такая ситуация кажется вполне естественной: конечно же, старший байт должен иметь больший адрес. Но когда память рассматривается как последовательность байт, простирающаяся от наименьшего адреса к наибольшему, оказывается, что процессор хранит слова "наоборот", что показано на рис. 2.3.
2.3. Сегментация памяти.
Поскольку процессор 80286 может адресовать до 220 байт (и намного больше в виртуальном режиме), можно было бы ожидать, что внутри него адреса байт и слов должны быть представлены 20-битными величинами. Однако процессор рассчитан на 16-битную арифметику, поэтому длина адресных объектов ограничена 16 битами. Следовательно, для построения адресов необходим какой-то дополнительный механизм.
В реальном режиме память 1 Мбайт состоит из нескольких сегментов, каждый из которых содержит самое большее 216 (64К) байт. Сегменты начинаются по адресам, кратным 16, т. е. имеющим четыре нулевых младших бита. В любой момент времени программа может обращаться к четырем сегментам, которые называются текущим сегментом кода, текущим сегментом данных, текущим сегментом стека и текущим дополнительным сегментом (он обычно отводится для данных). Каждый текущий сегмент идентифицируется путем размещения старших 16 бит адреса его первого байта в одном из четырех специальных сегментных регистров. Отметим, что сегменты могут перекрываться, как видно на рис. 2.4.
Предположим, например, что в 16-битном сегментном регистре кода содержится число С018. Это значит, что сегмент кода начинается по адресу байта С0180 и простирается на 216 (1000016) байт. Следовательно, последний байт сегмента кода имеет адрес D017F.
Мы обращаемся к байтам или словам внутри сегмента с помощью 16-битного внутрисегментного смещения. Процессор образует 20-битный адрес байта или слова, суммируя 16-битное смещение с содержимым 16-битного сегментного регистра, к которому "пристроены" четыре младших нуля (рис. 2.5.). В предыдущем примере байт с адресом CFFFF находится внутри текущего сегмента кода, т. е. он имеет смещение FE7F (CFFFF - С0180) в сегменте, как показано на рис. 2.6.
В виртуальном режиме сегменты и смещения сохраняются. Различие заключается в том, что начальные адреса сегментов не образуются путем добавления четырех нулей к содержимому сегментных регистров, а берутся из таблиц, индексируемых сегментными регистрами.
2.4. Структура ввода-вывода.
Система на базе процессора 80286 взаимодействует с внешним миром через так называемые порты. Через них процессор может получать информацию о внешних событиях и выдать сигналы, управляющие другими событиями.
Процессор может обращаться к 216 (64К) 8-битным портам примерно так же, как к байтам памяти. Каждому 8-битному порту назначен уникальный адрес из диапазона от 0 до 216 - 1. Любые два смежных 8-битных порта можно считать 16-битным портом аналогично слову памяти.
2.5. Регистры.
Процессор имеет 13 16-битных регистров и 9 однобитных флажков (флажки NT и IOPL предназначены только для виртуального режима). Мы разделим регистры на четыре набора: три набора содержат по четыре регистра, а непосредственно недоступный программисту указатель команды образует отдельный набор. Регистры и флажки показаны на рис. 2.7. Регистры общего назначения служат, в основном, для хранения операндов арифметических и логических операций; указательные и индексные регистры предназначены для хранения внутрисегментных смещений, а сегментные регистры определяют начальные адреса сегментов.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |



