Биты, байты и основания


Основной единицей памяти компьютера является бит. В бите мо-жет храниться значение 0 или 1. Бит сам по себе не особенно поле-зен. Процессор 8086 не работает непосредственно с битами, он ра-ботает с байтами, которые состоят из 8 бит.

Так как бит на самом деле представляет собой цифру с основа-нием 3, байт содержит 8-разрядное число с основанием 2. Наиболь-шие возможные числа с основанием 2 — это следующие числа:

2 в степени 0: 1

2 в степени 1: 2

2 в степени 2: 4

2 в степени 3: 8

2 в степени 4: 16

2 в степени 5: 32

2 в степени 6: 64

2 в степени 7: + 128

255

Это означает, что в байте может храниться значение в диапа-зоне от 0 до 255.

В каждом из 8-разрядных регистров процессора 8086 (AL, AH, BL, CL, CH, DL и DH) храниться ровно 1 байт. В каждой из 1000000 адресуемых ячеек памяти процессора 8086 также может храниться ровно 1 байт.

Набор символов компьютера PC (который включает в себя строч-ные и прописные символы, цифры от 0 до 9, специальные графические символы, научные и специальные символы, а также различные знаки пунктуации и прочие символы) состоит из ровно 256 символов.

Это число уже знакомо нам, не правда ли? Это не удивительно, ведь набор символов компьютера РС построен таким образом, что в 1 байте хранится 1 символ.

Байт — это наименьшая единица адресации процессора 8086. В нем может храниться 1 символ, 1 беззнаковое значение от 0 до 255 или одно значение со знаком в диапазоне от -128 до 127. Ясно, что байт не подходит для многих задач программирования на Ассемблере, например, хранения целых значений и значений с плавающей точкой, а также указателей на память.

Следующая по величине единица памяти процессора 8086 — это 16-разрядное слово. Слово вдвое превосходит по размеру байт (со-держит 16 бит). Фактически, слово храниться в памяти в виде двух последовательных байтовых ячеек. Адресное пространство процессора 8086 можно рассматривать, как 500000 слов. Каждый из 16-разрядных регистров (регистр AX, BX, CX, DX, SI, DI, BP, SP, CS, DS, ES, SS, IP и регистр флагов) хранит одно слово.

Наибольшие возможные 16-разрядные числа с основанием 2 — это следующие числа:

2 в степени 0: 1

2 в степени 1: 2

2 в степени 2: 4

2 в степени 3: 8

2 в степени 4: 16

2 в степени 5: 32

2 в степени 6: 64

2 в степени 7: 128

2 в степени 8: 256

2 в степени 9: 512

2 в степени 10: 1024

2 в степени 11: 2048

2 в степени 12: 4096

2 в степени 13: 8182

2 в степени 14: 16384

2 в степени 15: + 32768

——

65535

Это также представляет собой максимальную величину целого без знака, что не случайно, так как целые имеют длину 16 бит. Це-лые со знаком (которые могут принимать значения в диапазоне от -32768 до +32676) также хранятся в словах.

Так как слова имеют размер 16 бит, они могут адресоваться по любому смещению в данном сегменте, поэтому значения размером в слово достаточно велики, чтобы их можно было использовать в ка-честве указателей памяти. Если вы вспомните, регистры BX, BP, SI и DI размером в слово используются, как указатели на память.

Значения, хранимые в виде 32-битовых (4-байтовых) элементов, называются двойными словами. Хотя процессор 8086 не может непос-редственно работать с 32-битовыми целыми значениями, выполнять 32-разрядные арифметические операции (с помощью двух последова-тельных 16-разрядных операций) можно с помощью таких инструкций, как ADC и SBB. Благодаря двойным словам беззнаковые целые могут принимать значения в диапазоне от 0 до 4294967295, а целые со знаком — в диапазоне от -2147483648 до +2147483647.

Процессор 8086 может загружать указатель вида «сегмент:сме-щение» из двойного слова в сегментный регистр и в регистр общего назначения (с помощью инструкций LDS или LES), но это далеко от непосредственных операций с двойными словами. В виде двойных слов хранятся также числа одинарной точности с плавающей точкой (числа с одинарной точностью занимают 4 байта и могут принимать значения от 10 в -38 степени до 10 в 38 степени).

Каждое значения с плавающей точкой двойной точности требует для хранения 8 байт. Такие 64-битовые значения называются четвер-ными словами. В процессоре 8086 встроенная поддержка четверных слов отсутствует. Однако арифметический сопроцессор 8087 исполь-зует четверные слова в качестве базового типа данных. (Числа с двойной точностью могут принимать значения в диапазоне от 10 в -308 степени до 10 в 308 степени и иметь точность до 16 цифр.)

Для временных (промежуточных) значений с плавающей точкой Турбо Ассемблер поддерживает еще один тип данных — элемент данных длиной 10 байт. Этот 10-байтовый элемент данных (так называемый временно-вещественный формат) может также использоваться для хра-нения упакованных двоично-десятичных (или двоично кодированных десятичных) значений (BCD), в которых в каждом байте хранится две десятичных цифры.

Стоит заметить, что процессор 8086 хранит значения размером в слово или двойное слова в памяти, при этом младший байт следует первым. То есть, если значения размером в слово хранится по адре-су 0, то в биты 7-0 значения записаны по адресу 0, а биты 15-8 — по адресу 1 (см. Рис. 5.4).

WordVar ———————> 0 | 9Fh |

|———————|

1 | 19h |

|———————|

2 | ? |

|———————|

3 | ? |

|———————|

4 | ? |

|———————|

DwordVar ——————> 5 | 78h |

|———————|

6 | 56h |

|———————|

7 | 34h |

|———————|

8 | 12h |

|———————|

9 | ? |

|———————|

| |

Рис. 5.4 Переменная WordVar (размером в слово) содержит зна-чение 199h, переменная DwordVar (размером в двойное слово) содер-жит значение 123456h.

Аналогично, если значение размеров в двойное слово хранится по адресу 5, то биты 7-0 хранятся по адресу 5, биты 15-8 хранятся по адресу 6, биты 23-16 — по адресу 7, а биты 31-24 по адресу 8. Это может показаться несколько странным, но именно так работают все процессоры серии iAPx86.