♦ Коммуникационные устройства служат для передачи информации между компьютерами и/или их частями. Сюда относят модемы (проводные, радио, оптические, инфракрасные...), адаптеры локальных и глобальных сетей. В данном случае преобразование формы представления информации требуется только для передачи ее на расстояние.
Процессор, память и периферийные устройства взаимодействуют между собой с помощью шин и интерфейсов, аппаратных и программных; стандартизация интерфейсов делает архитектуру компьютеров открытой.
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 |


