double arrow

Представление данных

Здесь и далее рассматривается машинное представление целых чисел, строк и адресов в реальном режиме. Представление двоично-десятичных чисел, используемых достаточно редко, не рассматривается. Что касается вещественных чисел, то в ПК нет команд вещественной арифметики (операции над этими числами реализуются программным путем или выполняются сопроцессором) и потому нет стандартного представления вещественных чисел. Кроме того, рассматриваются некоторые особенности выполнения арифметических операций.

Шестнадцатиричные числа записываются с буквой h на конце, двоичные числа - с буквой b.

1.3.1 Типы данных

В общем случае под целое число можно отвести любое число байтов, однако, система команд ПК поддерживает только числа размером в байт, слово, двойное слово и учетверенное слово.

Байт – восемь последовательно расположенных битов, пронумерованных от 0 до 7, при этом бит 0 является самым младшим значащим битом.

Слово – последовательность из двух байт, имеющих последовательные адреса. Микропроцессоры Intel имеют важную особенность – младший байт всегда хранится по меньшему адресу. Адресом слова считается адрес его младшего байта. Адрес старшего байта может быть использован для доступа к старшей половине слова.

Двойное слово – последовательность из четырех байтов (32 бита), расположенных по последовательным адресам. Адресом двойного слова считается адрес его младшего слова.

Учетверенное слово – последовательность из восьми байт (64 бита), расположенных по последовательным адресам.

В микропроцессор делается различие между целыми числами без знака (неотрицательными) и со знаком. Это объясняется тем, что в ячейках одного и того же размера можно представить больший диапазон беззнаковых чисел, чем неотрицательных знаковых чисел, и если известно заранее, что некоторая числовая величина является неотрицательной, то выгоднее рассматривать ее как беззнаковую, чем как знаковую.

Целые числа без знака - могут быть представлены в виде байта, слова или двойного слова - в зависимости от их размера. В виде байта представляются целые от 0 до 255 (=28-1), в виде слова - целые от 0 до 65535 (=216-1), в виде двойного слова - целые от 0 до 4 294 967 295 (=232-1). Числа записываются в двоичной системе счисления, занимая все разряды ячейки. Например, число 130 записывается в виде байта 10000010b (82h). Числа размером в слово хранятся в памяти в "перевернутом" виде: младшие (правые) 8 битов числа размещаются в первом байте слова, а старшие 8 битов - во втором байте (в 16-ричной системе: две правые цифры - в первом байте, две левые цифры - во втором байте). Например, число 130 (=0082h) в виде слова хранится в памяти так: | 82 | 00 |. Отметим, однако, что в регистрах числа хранятся в нормальном виде: AX | 00 82 |

"Перевернутое" представление используется и при хранении в памяти целых чисел размером в двойное слово: в первом его байте размещаются младшие 8 битов числа, во втором байте - предыдущие 8 битов и т.д. Например, число 12345678h хранится в памяти так: | 78 | 56 | 34 | 12 |.

Другими словами, в первом слове двойного слова размещаются младшие (правые) 16 битов числа, а во втором слове - старшие 16 битов, причем в каждом из этих двух слов в свою очередь используется "перевернутое" представление.

Конечно, "перевернутое" представление неудобно для людей, однако при использовании языка ассемблера это неудобство не чувствуется.

Целые числа со знаком - также представляются в виде байта, слова и двойного слова. В виде байта записываются числа от -128 до 127, в виде слова -числа от -32768 до 32767, а в виде двойного слова - числа от -2147483648 до 2147483647. При этом числа записываются в дополнительном коде: неотрицательное число записывается так же, как и беззнаковое число (т.е. в прямом коде), а отрицательное число -x (x>0) представляется беззнаковым числом 28-x (для байтов), 216-x (для слов) или 232-x (для двойных слов). Например, дополнительным кодом числа -6 является байт FAH (=256-6), слово FFFAH или двойное слово FFFFFFFAH. При этом байт 10000000b (=80h) трактуется как -128, а не как +128 (слово 8000h понимается как -32678), поэтому левый бит дополнительного кода всегда играет роль знакового: для неотрицательных чисел он равен 0, для отрицательных - 1.

Знаковые числа размером в слово и двойное слово записываются в памяти в "перевернутом" виде (при этом знаковый бит оказывается в последнем байте ячейки).

Иногда число-байт необходимо расширить до слова, т.е. нужно получить такое же по величине число, но размером в слово. Существует два способа такого расширения - без знака и со знаком. В любом случае исходное число-байт попадает во второй (до "переворачивания") байт слова, а вот первый байт заполняется по-разному: при расширении без знака в него записываются нулевые биты (12h -> 0012h), а при расширении со знаком в первый байт записываются нули, если число-байт было неотрицательным, и записывается восемь двоичных единиц в противном случае (81h -> FF81h). Другими словами, при расширении со знаком в первом байте слова копируется знаковый разряд числа-байта.

Аналогично происходит расширение числа-слова до двойного слова.

Неупакованное двоично-десятичное число – байтовое представление десятичной цифры от 0 до 9. Неупакованные десятичные числа хранятся как байтовые значения без знака по одной цифре в каждом байте.

Упакованное двоично-десятичное число – представляет собой упакованное представление двух десятичных цифр от 0 до 9 в одном байте. Каждая цифра хранится в своем полубайте.

1.3.2 Представление символов и строк

На символ отводится один байт памяти, в который записывается код символа - целое от 0 до 255. В ПК используется система кодировки ASCII (American Standard Code for Information INTerchange). Она, естественно, не содержит кодов русских букв, поэтому в нашей стране применяется некоторый вариант этой системы с русскими буквами (обычно это альтернативная кодировка ГОСТа).

Некоторые особенности этих систем кодировки:

- код пробела меньше кода любой буквы, цифры и вообще любого графически представимого символа;

- коды цифр упорядочены по величине цифр и не содержат пропусков, т.е. из неравенства код('0')<=код(c)<=код('9') следует, что c - цифра;

- коды больших латинских букв упорядочены согласно алфавиту и не содержат пропусков; аналогично с малыми латинскими буквами;

- (в альтернативной кодировке ГОСТа) коды русских букв (как больших, так и малых) упорядочены согласно алфавиту, но между ними есть коды других символов. Строка (последовательность символов) размещается в соседних байтах памяти (в не перевернутом виде): код первого символа строки записывается в первом байте, код второго символа - во втором байте и т.п. Адресом строки считается адрес ее первого байта.

В ПК строкой считается также и последовательность слов (обычно это последовательность целых чисел). Элементы таких строк располагаются в последовательных ячейках памяти, но каждый элемент представлен в "перевернутом" виде.


Сейчас читают про: