♦  Коммуникационные устройства служат для передачи информации между компьютерами и/или их частями. Сюда относят модемы (проводные, радио, оптические, инфракрасные...), адаптеры локальных и глобальных сетей. В дан­ном случае преобразование формы представления информации требуется толь­ко для передачи ее на расстояние.

Процессор, память и периферийные устройства взаимодействуют между собой с помощью шин и интерфейсов, аппаратных и программных; стандартизация интерфейсов делает архитектуру компьютеров открытой.

1.2. Биты, байты, слова, параграфы

Компьютер работает в двоичной системе счисления — минимальным информа­ционным элементом является бит, который может принимать значение 0 или 1. Этим значениям соответствуют различимые физические состояния ячейки, чаще всего — уровень напряжения (низкий или высокий). Биты организуются в более крупные образования — ячейки памяти и регистры. Каждая ячейка па­мяти (и каждый регистр) имеет свой адрес, однозначно ее идентифицирующий в определенной системе координат. Минимальной адресуемой (пересылаемой между компонентами компьютера) единицей информации является байт, со­стоящий, как правило, из 8 бит.

Существуют процессоры и компьютеры с разрядностью обрабатываемого слова, не кратной 8 (на­пример, 5, 7, 9...). Байты таких процессоров не 8-битные, но в мире PC столкновение с ними мало­вероятно. Кроме того, в некоторых системах (обычно коммуникационных) совокупность восьми соседних битов данных называют октетом. Название «октет» обычно подразумевает, что эти 8 бит не имеют явного адреса, а характеризуются только своим местоположением в длинной цепочке битов.

НЕ нашли? Не то? Что вы ищете?

Два байта со смежными адресами образуют слово (word) разрядностью 16 бит, два смежных слова — двойное слово (double word) разрядностью 32 бита, два смежных двойных слова — учетверенное слово (quad word) разрядностью 64 бита. Байт (8 бит) делится на пару тетрад (nibble): старшую тетраду — биты [7:4] и младшую тетраду — биты [3:0].

В двухбайтном слове принят LH-порядок следования байтов: адрес слова указы­вает на младший байт L (Low), а старший байт Н (High) размещается по адресу, большему на единицу. В двойном слове порядок аналогичен — адрес указывает на самый младший байт, после которого размещены следующие по старшинству. Этот порядок, называемый форматом Little Endian и естественный для процес­соров Intel, применяется не во всех микропроцессорных семействах. В формате Big Endian адрес указывает на самый старший байт (двойного, учетверенного...) слова, остальные байты размещаются по нарастающим адресам. С несовпадени­ем форматов представления приходится сталкиваться, например, при передаче информации между различными подсистемами (формат Big Endian использу­ется в сетевых протоколах и шине FireWire).

В технической документации, электрических схемах и текстах программ могут применяться разные способы представления чисел:

♦  Двоичные (binary) числа — каждая цифра отражает значение одного бита (0 или 1), старший бит всегда пишется слева, после числа ставится буква «Ь». Для удобства восприятия тетрады могут быть разделены пробелами, напри­мер, 1010 0101b.

♦  Шестнадцатеричные (hexadecimal) числа — каждая тетрада представляется одним символом 0...9, А, В, F. Обозначаться такое представление может по-разному, в данной книге используется только символ «h» после послед­ней щестнадцатеричной цифры, например, A5h. В текстах программ это же число может обозначаться и как 0хА5, и как 0A5h, в зависимости от синтак­сиса языка программирования. Незначащий ноль (0) добавляется слева от старшей шестнадцатеричной цифры, изображаемой буквой, чтобы различать числа и символические имена.

♦  Десятичные (decimal) числа — каждый байт (слово, двойное слово) пред­ставляется обычным числом, а признак десятичного представления (букву «d») обычно опускают. Байт из предыдущих примеров имеет десятичное значение 165. В отличие от двоичной и шестнадцатеричной форм записи, по десятичной трудно в уме определить значение каждого бита, что иногда при­ходится делать.

♦  Восьмеричные (octal) числа — каждая тройка битов (разделение начинается с младшего) записывается в виде цифры из интервала 0-7, в конце ставится признак «о». То же самое число записывается как 245о. Восьмеричная систе­ма неудобна тем, что байт не разделить поровну, но зато все цифры — привычные. В «про-интеловских» системах это представление непопулярно (у него «DEC'ob-ское» происхождение).

В табл. 1.1 приведены разные представления одной тетрады (4 бит). Чтобы пе­ревести любое 8-битное число в десятичное, нужно десятичный эквивалент старшей тетрады умножить на 16 и сложить с эквивалентом младшей тетрады.

Для нашего примера A5h=10*16 + 5 = 165. Обратный перевод тоже несложен: десятичное число делится на 16, целая часть даст значение старшей тетрады, ос­таток — младшей.

В «наследство» от процессоров 8086/88 достался своеобразный способ задания адреса ячейки памяти в виде указателя «seg:offset», состоящего из двух слов: сегмента (seg — segment) и смещения (offset). Такая запись предполагает вы­числение полного адреса по формуле :

addr=16*seg + offset. Такое представле­ние 20-битного адреса двумя 16-битными числами в процессорах 8086/88 под­держивается и в реальном режиме всех последующих процессоров х86 (под­робнее об адресации памяти см. в 7.3). Здесь сегмент указывает адрес парагра­фа — 16-байтной области памяти.

Таблица 1.1.

Представление двоичных чисел в разных системах счисления

Двоичное (bin)

Шестнадцатеричное (hex)

Десятичное (dec)

Восьмеричное (oct)

0000

0

0

0

0001

1

1

1

0010

2

2

2

0011

3

3

3

0100

4

4

4

0101

5

5

5

0110

6

6

6

0111

7

7

7

1000

8

8

10

1001

9

9

11

1010

А

10

12

1011

В

11

13

1100

С

12

14

1101

D

13

15

1110

Е

14

16

1111

F

15

17

Выравнивание адреса по границе параграфа означает, что он кратен 16 (4 младших бита нулевые). Нетрудно увидеть, что один и тот же адрес можно задавать разными сочетаниями этих двух компонен­тов. Так, например, адрес начала области данных BIOS (BIOS Data Area) 00400h представляют и как 0000:0400, и как 0040:0000 (шестнадцатеричное представление подразумевается). Возможны и другие варианты, но их не ис­пользуют. В данной книге в основном будем пользоваться первым способом, причем нулевое значение сегмента будем представлять кратко, то есть 0:0400. К счастью, в 32-разрядном (и 64-разрядном) режиме работы процессоров в со­временных ОС и приложениях сегментация не применяется, а адрес выражает­ся одним (32- или 64-битным) числом.

Обозначение и порядок битов и байтов шин адреса и данных, принятое в аппа­ратуре PC, пришло от процессоров Intel 8086/88 (и даже от 8080). Самый млад­ший бит (Least Significant Bit, LSB) имеет номер 0, самый старший (Most Significant Bit, MSB) бит байта — 7, слова — 15, двойного слова — 31. На рисун­ках принято старший бит изображать слева, а младший — справа.

1.3. Ячейки памяти, порты и регистры

Поясним разницу между ячейками памяти, портами и регистрами. Ячейки па­мяти служат лишь для хранения информации — сначала ее записывают в ячей­ку, а потом могут прочитать, а также записать иную информацию. Порты вво­да-вывода, как правило, служат для преобразования двоичной информации в какие-либо физические сигналы и обратно. Например, порт данных параллель­ного интерфейса формирует электрические сигналы на разъеме, к которому обычно подключают принтер. Электрические сигналы, поступающие от принте­ра, порт состояния того же интерфейса отображает в виде набора битов, кото­рый может быть считан процессором. Регистр — довольно широкое понятие, которое зачастую используется как синоним порта. Регистры могут служить для управления устройствами (и их контроллерами) и для чтения их состоя­ния. Регистры (как и порты) могут образовывать каналы:

♦  Каналы ввода-вывода данных. Пример — регистр данных СОМ-порта: байты, записываемые друг за другом в этот регистр, в том же порядке будут переда­ваться по последовательному интерфейсу, то есть поступать в канал вывода. Если этот интерфейс подключить к СОМ-порту другого компьютера и вы­полнять программные чтения его регистра данных, мы получим байт за бай­том переданные данные. Таким образом, здесь регистр играет роль канала ввода.

♦  Каналы управления. Если запись в регистр определенных данных (битовых комбинаций) изменяет состояние некоего устройства (сигнал светофора, по­ложение какого-то механизма...), то регистр образует канал управления.

♦  Каналы состояния. Пример — регистр игрового порта (game-порт), к которо­му подключен джойстик. Чтение регистра дает информацию о состоянии кнопок джойстика (нажаты или нет).

Канал отличается от ячейки памяти рядом свойств. Если в ячейку памяти запи­сывать раз за разом информацию, то последующее считывание возвращает ре­зультат последней записи, а все предшествующие записи оказываются беспо­лезными. Если ячейку памяти считывать раз за разом, не выполняя запись в нее, то результат считывания каждый раз будет одним и тем же (при ис­правной памяти). «Лишнее» чтение ячейки памяти не приведет ни к каким по­бочным эффектам. На этих свойствах «настоящей» памяти основаны методы ускорения работы с ней: кэширование и спекулятивное чтение. С регистрами, образующими каналы, такие вольности недопустимы. Здесь все обращения при­водят к каким-либо изменениям. Кэширование и спекулятивное чтение недо­пустимы. Например, лишнее (спекулятивное) чтение регистра данных СОМ-порта «выдернет» байт из принимаемого потока. Операция чтения регистра состояния может быть неявным подтверждением сброса какого-либо признака (например, запроса прерывания), и она изменяет состояние устройства. Запи­си в канал данных (и управления) также нельзя опускать (для «ускорения»).

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5