Серж де Арт / Статьи

Системы счисления и адресация памяти

© 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Т)

Герц — частота работы, количество операций в секунду
Килогерц — тысяча герц
Мегагерц — миллон герц
Гигагерц — миллиард герц

*

[ Вверх ]

Серж де Арт / Статьи