3.5 Типы данных
Фундаментальные типы данных
Фундаментальными типами для архитектуры IA-32 являются:
байт (byte) | - | 8 бит |
слово (word) | - | 16 бит |
двойное слово (doubleword) | - | 32 бит |
четверное слово (quadword) | - | 64 бит |
При размещении данных в памяти используется прямой порядок байт (little-endian): младший байт располагается по наименьшему адресу. Адресом всего многобайтного числа является адрес его самого младшего байта. В приведенном примере по адресу 1234h располагается слово FFF0h, в котором младшему байту соответствует ячейка с адресом 1234h, а старшему байту - ячейка с адресом 1235h. Если данные по адресу 1234h интерпретировать как двойное слово, то ему соответствует число 008CFFF0h. Т.е. младший байт младшего слова располагается по адресу 1234h, старший байт младшего слова - по адресу 1235h и т.д.
Пример: | |||
---|---|---|---|
7 |
0 | ||
AA |
123Bh | ||
5A |
123Ah | ||
3F |
1239h | ||
12 |
1238h | ||
00 |
1237h | ||
8C |
1236h | ||
FF |
1235h | ||
F0 |
1234h |
При размещении данных в памяти рекомендуется использовать выравнивание, т.е. слова следует размещать по четным адресам, двойные слова - по адресам, кратным четырем, и т.п. Обращение к невыравненным данным вынуждает процессор делать дополнительный цикл чтения или записи. Так, чтение двойного слова AA5A3F12h по адресу 1238h возможно за один цикл шины, тогда как чтение числа 3F12008Ch по адресу 1236h потребует как минимум двух циклов шины.
Языки высокого уровня обеспечивают выравнивание на уровне компилятора (для всей программы или для всего модуля). Ассемблер предоставляет директиву ALIGN, с помощью которой можно определять выравнивание различных участков данных.
Целые типы данных
Процессор, оперируя перечисленными фундаментальными типами данных, позволяет в программе интерпретировать эти значения как целочисленные. Целое число может считаться знаковым или беззнаковым. Большинство арифметических инструкций процессора работают одинаково для знаковых и для беззнаковых чисел, однако для некоторых инструкций (инструкции условных переходов, деление, умножение) существуют модификации для работы со знаковыми и беззнаковыми целыми числами.
Фундаментальный тип кодирует беззнаковое число, если его значение интерпретируется как целое число от 0 до 2n-1, где n - разрядность типа. Для чисел со знаком используется комплементарное кодирование (дополнение до 1): т.е. отрицательному числу, модуль которого M, соответствует код NOT(M)+1, где NOT - операция побитового инвертирования. При этом по старшему разряду кода можно определить знак числа: 0 - неотрицательное число, 1 - отрицательное число. Знаковым числам соответствует диапазон -2n/2...+2n/2-1.
Фундаментальный тип | Целый тип | Диапазон |
---|---|---|
байт (byte) |
символ со знаком (signed char) | -128...+127 |
символ без знака (unsigned char) | 0...255 | |
слово (word) |
короткое со знаком (signed short) | -32768...+32767 |
короткое без знака (unsigned short) | 0...65535 | |
двойное слово (doubleword) |
целое со знаком (signed int) | -2147483648...+2147483647 |
целое без знака (unsigned int) | 0...4294967295 |
Вещественные типы данных
Встроенный математический сопроцессор (FPU) микропроцессоров IA-32 позволяет оперировать с вещественными типами данных. Вещественные числа кодируются в соответствии со стандартом IEEE-754. Старший разряд двоичного представления вещественного числа всегда кодирует знак числа. Остальная часть разбивается на две части: экспонента и мантисса. Вещественное число вычисляется как: (-1)S*2E*M, где S - знаковый бит числа, E - экспонента, M - мантисса. Обычно процессор оперирует с нормализованными вещественными числами, у которых 1<=M<2, так что целую часть мантиссы можно отбросить и кодировать только дробную часть. Экспонента кодируется со сдвигом на половину разрядной сетки, т.е. при 8-битной разрядности экспоненты код 0 соответствует числу -127, 1 - числу -126, ..., 255 - числу +126 (экспонента вычисляется как код-127).
тип | диапазон по модулю | двоичное представление |
---|---|---|
вещественное ординарной точности (single precision) - 32 бит |
1.18*10-38... 3.40*1038 | |
вещественное двойной точности (double precision) - 64 бит |
2.23*10-308... 1.79*10308 | |
вещественное расширенной точности (extended precision) - 80 бит |
3.37*10-4932... 1.18*104392 |
Указатели
Процессор оперирует с указателями двух типов: ближние (near) и дальние (far).
47 |
31 |
15 |
0 |
смещение |
near pointer | ||
селектор |
смещение |
far pointer |
Ближний указатель представляет собой 32-битное смещение (эффективный адрес) от начала сегмента. Ближние указатели используются в сплошной модели памяти, а также в сегментированной модели, если селектор сегмента задан неявно.
Дальний указатель (логический адрес) состоит из 16-битного селектора сегмента и 32-битного смещения (эффективного адреса). Дальние указатели используются в сегментированной модели памяти, когда требуется явное задание селектора сегмента.
В 16-битном режиме адресации смещения имеют размер 16 бит, поэтому размер ближнего адреса составляет 16 бит, а дальнего - 32 бита.
Битовое поле - непрерывная последовательность битов, в которой каждый бит рассматривается как независимая переменная. Оно может начинаться с любого бита любого байта и может быть длиной до 32 бит.
Строка - непрерывная последовательность битов, байтов, слов или двойных слов. Битовая строка может начинаться с любой позиции любого байта и содержать до 232-1 битов. Строка байтов может содержать байты, слова или двойные слова и иметь размер до 232-1 байт.
Двоично-десятичные числа
Микропроцессор позволяет оперировать с числами в двоично-десятичной кодировке (binary-coded decimal - BCD). Двоично-десятичное число считается неупакованным, если одна десятичная цифра кодируется одним байтом. Двоично-десятичное число считается упакованным, если одна десятичная цифра кодируется четырьмя битами. Целочисленное устройство микропроцессора оперирует с 8-битовыми упакованными (0...99) или неупакованными (0...9) BCD-числами без знака. FPU поддерживает 80-битные упакованные BCD-числа со знаком. Такое число содержит 18 десятичных цифр в битах 0...71, а бит 79 - бит знака (биты 72...78 не используются). Этот тип позволяет работать с целыми числами в диапазоне -1018+1 ... +1018-1.