Системы счисления и адресация памяти© 2008 Серж де Арт (Сергей Свистунов)
30 июня 2008
1. Системы счисления
Несмотря на то, что этимология слова «бит» в компьтерной
науке несколько иная, чем та, которую подразумевает следующее
рассуждение, оно, тем не менее, остается верным:
В переводе с английского слово bit означает немного, чуть-чуть.
Один бит информации это минимум информации. Бит можно
представить как переменную:
x
Бит может иметь два значения: О или 1
x = 0, или x = 1
Мы можем написать произвольную цепочку битов, скажем так:
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
(подразумевается, что каждая переменная имеет свой индекс,
x1, x2, итд, то есть значения переменных могут не совпадать)
Если подставить значения в переменные, то получится цепочка
нулей и единиц. Эту цепочку битов можно пронумеровать справа
налево, тем самым подсчитав биты:
..........xxxx
..........4321
Количество бит означает разрядность выражения. Вначале
(слева) идут старшие разряды, затем (справа) младшие.
Обычно в компьютерном мире используются 8, 16, 32 и
64-разрядные числа.
Идея разрядов нам хорошо знакома по десятичной системе
счисления. В десятичном числе каждый старший разряд
в десять раз больше предыдущего. Возьмем, например,
число 2537:
7 единицы
3 десятки
5 сотни
2 тысячи
Таким образом, позиция цифры в числе определяет ее числовое
значение. Потому эта система счисления и называется позиционной.
(К примеру, система римских цифр не является позиционной. В ней
значения цифр не меняются от их расположения: I, III, IX)
Вот алгоритм вычисления значения числа 2537:
2 x 1000 = 2000
5 x 100 = 500
3 x 10 = 30
7 x 1 = 7
Складываем, и в итоге получаем 2537.
Двоичная система счисления также является позиционной. Но в отличие
от десятичных чисел, в двоичном числе каждый следующий разряд больше
предыдущего в два раза:
1101 четырех-разрядное двоичное число (означает 13 в десятичной системе)
8421 значения рязрядов
Итак, мы видим, что в двоичном числе 1101 одна однерка, ноль двоек,
одна четверка и одна восмерка. Сложим их и получим значение числа:
8 + 4 + 0 + 1 = 13.
(Чтобы научиться быстро вычислять значения двузначных чисел,
рекомендуется следующий мнемонический прием: трактовать 0
как «нет», а 1 как «есть»)
Очевидно, что количество в каждом разряде может быть равным
или единице или нулю, так как других цифр просто нет в двоичной
системе (0,1). В десятичном же числе, количество варьировалось
от 0 до 9.
Обобщение:
В n-арной системе счисления каждый разряд может хранить числа
от 0 до n-1 (почему n-1, а не n? потому-что мы считаем от нуля),
и значение каждого следующего разряда (в порядке возрастания)
больше предыдыщего в n раз. Ну вот, теперь мы знаем как создать
любую произвольную систему счисления.
Вернемся к двоичной системе.
Байтом (Byte) называется двоичное число состоящее из 8 бит:
xxxxxxxx байт
Число в 16 бит называется Словом (Word):
xxxxxxxxxxxxxxxx 2 байта, слово
Число в 32 бит называется двойным словом:
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Поскольку в одном байте возможны 256 различных комбинаций
нулей и единиц, то им можно выразить 256 символов. Или еще
говорят, что 1 байт может иметь 256 значений. Нетрудно
подсчитать, что два байта (слово) могут иметь 64К значений
(256 x 256), а четыре байта 4М (64k x 64k).
Однако, людям не очень удобно строить рассуждения с двоичными
числами, поскольку длинные последовательности нулей и единиц
зрительно могут сбивать с толку и приводить к ошибкам.
Для удобства обращения с двузначными числами ввели в обиход
шестнадцатиричную систему счисления. Она значительно
упрощает представление чисел двоичной системы.
0 1 2 3 4 5 6 7 8 9 A B C D E F
0 1 ... ... 14 15
Когда речь идет о 16-ричном счислении, обычно имеется
ввиду двоичная система, которая стоит за шестнадцатеричной
системой обозначений. Число в шестнадцатиричном представлении
обозначается как Xh (Hex, hexadecimal)
Теперь каждый следующий разряд в шестнадцатиричном числе будет
больше предыдущего в 16 раз.
Например, вычислим десятичное значение числа 0DF3h:
0 D F 3
64k 256 16 1
0h x 64к = 0 x 64к = 0
Dh x 256 = 13 x 256 = 3328
Fh x 16 = 15 x 16 = 240
3h x 1 = 3 x 1 = 3
Cложим и получим: 3075
Если бы мы записали это число в двоичной системе, то оно
выглядело бы так:
0000110111110011
Видим, что шестнадцатеричное представление визуально гораздо
удобнее для представления, запоминания и вычислений. Перевести
из hex в двоичную систему, и обратно, очень легко.
Один символ в hex-системе по определению может иметь 16 значений,
от 0 до F. Для шестнадцати комбинаций нулей и единиц в двоичной
системе требуется 4 разряда (xxxx), следовательно, один символ
в hex (Xh) будет означать четыре символа в двоичной. Например:
0000 = 0h
1111 = Fh
Следовательно,
XXh означает 8 бит, или один байт
Например: 00001111 = 0Fh = 15
Или: 11111111 = FFh = 255
XXXXh означает 2 байта, или слово
Таким образом, для перевода числа 0DF3h в двоичную
не требуется никаких арифметических вычислений:
0h = 0000 (0)
Dh = 1101 (13)
Fh = 1111 (15)
3h = 0011 (3)
И затем записываем эти числа в строку слева направо.
Чтобы перевести десятичное число в двоичное требуется
арифметика. Например, чтобы число 13 представить
в двоичной форме, достаточно сделать следующее:
13 : 2 = 6 и остаток
6 : 2 = 3 (без отстака)
3 : 2 = 1 и остаток
1 : 2 = 0 и остаток
Если остаток представить как 1, «без остатка» как 0,
то записав «остаток/без остатка» справа налево,
получим двоичное предсавление числа 13:
1101
2. Адресация памяти
В компьютерах x86 до i286 модели включительно использовался
16-разрядный процессор с 16-разрядной шиной. Шина это связь
процессора с памятью и другими устройствами. Оперативная память
компьютера состоит из ячеек. Все ячейки одинаковой емкости
(1 байт информации). Каждая ячейка имеет уникальный адрес,
чтобы процессор мог персонально обратиться к ней (прочитать
или записать данные).
Мы уже знаем, что с помощью 2 байт (xxxxxxxx xxxxxxxx) можно
обозначить 64К уникальных объектов, например, пронумеровать
64К ячеек памяти.
Разработчики пожелали, используя 16-разрядный процессор,
иметь доступ к памяти больше чем 64К и для этого был
придуман оригинальный метод адресации. Метод использует
идею Сегмента и Смещения. Это очень просто.
Память разбивается на равные части Сегменты. Каждая часть,
то есть сегмент, делится на столько же равных частей (смещений)
сколько и вся память. Получается, что смещение, есть часть части.
Или можно сказать, что смещение это номер позиции внутри сегмента.
Записывается так:
Сегмент:Смещение
Например, 0FD3h:0040h
Идею сегментов и смещений для наглядности можно представить
в виде таблицы, в которой строки представляют сегменты,
а столбики смещения.
0 1 2 3 4 5 6 7 8 9 ... ...FFFF
--------------------------------------------------------
0000 П р и в е т , _
0001 Б и л л ! _
0002 К а к _ у _ т е б я _ д е л а?
...
FFFF
--------------------------------------------------------
Тогда адрес буквы «в» в первом слове будет:
0000:0003
а дрес буквы «и» во втором слове будет:
0001:0001
(У читателя может возникнуть вопрос, каким образом в памяти
компьютера могут быть записаны предложения естественного
языка, если компьютер понимает только язык нулей и единиц.
Очень просто. Для каждого символа английского алфавита
a-z, A-Z, а также чисел и других символов когда-то давно
поставили в соответствие двузначные числа и получилась
таблица соответствий. Затем, договорились считать эту таблицу
общепринятой. Так появилась международная таблица ASCII-кодов.
Она может содержать также и кириллицу. Ее объем 256 символов.
Как вы уже догадались, для хранения этого числа комбинаций
требуется всего один байт информации, как раз ровно столько,
сколько помещается в одной ячейке памяти)
Итак, 16-разрядный процессор x86, при сегментном способе
адресации памяти, может работать с памятью объемом до 4МБ.
Поясним:
В сегментном регистре (регистр это сверхскоростная память
в процессоре) равном 2 байтам, можно записать 64К разных
значений, то есть адресов сегментов памяти. А в другом
регистре (регистре общего назначения), можно записать
64К смещений. Получается как-бы эмуляция 32-разрядного
механизма.
XXXXh один регистр (от 0 до 64К, 0000h FFFFh)
YYYYh другой регстр (от 0 до 64К, 0000h FFFFh)
Перемножаем и получаем 4 МБ.
Современные персональные компьютеры, начиная с i386 и далее,
имеют 32-разрядные процессоры и 32-разрядную шину.
(Уточнение шина состоит из трех шин: командной, адресной
и шины данных. Шина данных 64-разрядная). Это значит,
что за один такт работы процессора (Тактовая частота процессора
измеряется в герцах количестве операций в секунду) по командной
или адресной шине перемещается сразу 4 байта, или 32 комбинации
нулей и единиц, а по шине данных 8 байт, или 64 комбинаций.
Какой объем памяти может обслуживать 32-разрядный процессор
при сегментном способе адресации?
Считаем:
32 разряда это 4 байта. Значит один регистр (сегментный)
может хранить 4 байта, которые могут принимать 4 миллиона
значений, т.е. 4Мб. И другой регистр (для смещений)
столько же. Перемножаем (4M x 4M) и получаем 16 Террабайт.
Сегодня пользователями обычно используется максимум 1-4 гигабайта
оперативной памяти. Выходит, что современные процессоры еще далеко
не исчерпали своей возможности!
Заключение:
В статье были рассмотрены три системы счисления: десятичная,
двоичная и шестнадцатеричная, и система адресации оперативной
памяти. Мы также затронули тему архитектуры персонального
компьютера, упомянув понятия: процессор, память и шина.
---
Словарик:
Бит единица информации
Байт восемь бит
Килобайт тысяа байт (1К)
Мегабайт миллион байт (1М)
Гигабайт миллиард байт (1Г)
Террабайт триллион байт (1Т)
Герц частота работы, количество операций в секунду
Килогерц тысяча герц
Мегагерц миллон герц
Гигагерц миллиард герц
|