3. Ресурсы микропроцессора    
 СОДЕРЖАНИЕ
 Введение
 1. Развитие архитектуры
 2. Структура МП
 3. Ресурсы МП
 4. Управление памятью
 5. Защита
 6. Многозадачность
 7. Прерывания и исключения
 8. Инициализация МП
 9. Эмуляция 8086
 Глоссарий
 ПРАКТИКА
 1. Семантический разрыв
 2. CPUID
 3. Защищенный режим
 Вопросы и задания

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 single
вещественное двойной точности
(double precision) - 64 бит
2.23*10-308... 1.79*10308 double
вещественное расширенной точности
(extended precision) - 80 бит
3.37*10-4932... 1.18*104392 extended

Указатели

Процессор оперирует с указателями двух типов: ближние (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.