Составители:
Рубрика:
Инструкция ldelema (см. таблицу 3.33) загружает на стек вычислений
адрес элемента одномерного массива (управляемый указатель). Тип эле-
ментов массива указывается через токен метаданных во встроенном опе-
ранде инструкции (в качестве типа элементов может выступать тип-значе-
ние). Диаграмма стека для нее выглядит следующим образом:
... , array, index -> ... , addr
Та б лица.3.33. Инструкция ldelema
Инструкции stelem (см. таблицу 3.34) предназначены для сохранения
значения со стека вычислений в элементе одномерного массива. Анало-
гично инструкциям ldelem, существуют различные варианты stelem для
разных типов элементов массива. При этом варианты stelem для беззнако-
вых целых типов отсутствуют за ненадобностью.
Диаграмма стека для инструкций stelem:
... , array, index, value -> ...
3.3.3. Инструкции для работы с типами-значениями
Специальный набор инструкций предусмотрен для поддержки опе-
раций с типами-значениями.
3.3.3.1. Инициализация значения
Инструкция initobj (см. таблицу 3.35) предназначена для инициали-
зации значения типа-значения. Во встроенном операнде этой инструкции
содержится токен метаданных, указывающий на информацию о типе-зна-
чении. В отличие от инструкции newobj, инструкция initobj не вызывает
конструктор.
Инструкция initobj потребляет со стека вычислений адрес значения:
... , addr -> ...
3.3.3.2. Загрузка размера значения
Инструкция sizeof (см. таблицу 3.36) загружает на стек вычислений
размер в байтах типа-значения (размер представляет собой значение типа
unsigned int32). Во встроенном операнде этой инструкции содержится то-
кен метаданных, указывающий на информацию о типе-значении.
Common Intermediate Language
111
Так как в процессе JIT-компиляции не отслеживаются точные типы
объектных ссылок на стеке вычислений, то JIT-компилятору требуются
указания о том, элементы какого типа содержатся в массиве. Поэтому для
разных типов существуют разные варианты инструкции ldelem.
Следует иметь в виду, что значения целых типов, разрядность кото-
рых меньше 32 бит, при загрузке на стек удлиняются. Значения со знаком
и значения без знака удлиняются по-разному, поэтому наличие отдельных
инструкций для знаковых и беззнаковых целых типов вполне объяснимы.
При этом остается неясным, для чего потребовалось определять две инст-
рукции ldelem.i4 и ldelem.u4 для 32-разрядных целых типов, потому что
они, очевидно, имеют одинаковый эффект.
Диаграмма стека для инструкций ldelem выглядит следующим обра-
зом:
... , array, index -> ... , value
Инструкция потребляет со стека объектную ссылку на массив и ин-
декс элемента (типа native int), значение которого надо загрузить.
Таблица 3.32. Инструкции для загрузки элементов массивов
110
CIL и системное программирование в Microsoft .NET
Код Инструкция Встроенный Описание
операнд
0x90 ldelem.i1 – Загрузить элемент типа int8
0x91 ldelem.u1 – Загрузить элемент типа unsigned
int8
0x92 ldelem.i2 – Загрузить элемент типа int16
0x93 ldelem.u2 – Загрузить элемент типа unsigned
int16
0x94 ldelem.i4 –Загрузить элемент типа int32
0x95 ldelem.u4 – Загрузить элемент типа unsigned
int32
0x96 ldelem.i8 – Загрузить элемент типа int64
(ldelem.u8) или unsigned int64
0x97 ldelem.i – Загрузить элемент типа native int
или unsigned native int
0x98 ldelem.r4 – Загрузить элемент типа float32
0x99 ldelem.r8 – Загрузить элемент типа float64
0x9A ldelem.ref – Загрузить элемент – объектную
ссылку
Код Инструкция Встроенный Описание
операнд
0x8F ldelema token Загружает адрес элемента мас-
сива с указанным индексом
110 CIL и системное программирование в Microsoft .NET Common Intermediate Language 111
Так как в процессе JIT-компиляции не отслеживаются точные типы Инструкция ldelema (см. таблицу 3.33) загружает на стек вычислений
объектных ссылок на стеке вычислений, то JIT-компилятору требуются адрес элемента одномерного массива (управляемый указатель). Тип эле-
указания о том, элементы какого типа содержатся в массиве. Поэтому для ментов массива указывается через токен метаданных во встроенном опе-
разных типов существуют разные варианты инструкции ldelem. ранде инструкции (в качестве типа элементов может выступать тип-значе-
Следует иметь в виду, что значения целых типов, разрядность кото- ние). Диаграмма стека для нее выглядит следующим образом:
рых меньше 32 бит, при загрузке на стек удлиняются. Значения со знаком ... , array, index -> ... , addr
и значения без знака удлиняются по-разному, поэтому наличие отдельных
инструкций для знаковых и беззнаковых целых типов вполне объяснимы. Таблица.3.33. Инструкция ldelema
При этом остается неясным, для чего потребовалось определять две инст-
Код Инструкция Встроенный Описание
рукции ldelem.i4 и ldelem.u4 для 32-разрядных целых типов, потому что
они, очевидно, имеют одинаковый эффект. операнд
Диаграмма стека для инструкций ldelem выглядит следующим обра- 0x8F ldelema token Загружает адрес элемента мас-
зом: сива с указанным индексом
... , array, index -> ... , value
Инструкция потребляет со стека объектную ссылку на массив и ин- Инструкции stelem (см. таблицу 3.34) предназначены для сохранения
декс элемента (типа native int), значение которого надо загрузить. значения со стека вычислений в элементе одномерного массива. Анало-
гично инструкциям ldelem, существуют различные варианты stelem для
Таблица 3.32. Инструкции для загрузки элементов массивов разных типов элементов массива. При этом варианты stelem для беззнако-
вых целых типов отсутствуют за ненадобностью.
Код Инструкция Встроенный Описание Диаграмма стека для инструкций stelem:
операнд ... , array, index, value -> ...
0x90 ldelem.i1 – Загрузить элемент типа int8
3.3.3. Инструкции для работы с типами-значениями
0x91 ldelem.u1 – Загрузить элемент типа unsigned
int8 Специальный набор инструкций предусмотрен для поддержки опе-
раций с типами-значениями.
0x92 ldelem.i2 – Загрузить элемент типа int16
0x93 ldelem.u2 – Загрузить элемент типа unsigned 3.3.3.1. Инициализация значения
int16 Инструкция initobj (см. таблицу 3.35) предназначена для инициали-
0x94 ldelem.i4 – Загрузить элемент типа int32 зации значения типа-значения. Во встроенном операнде этой инструкции
0x95 ldelem.u4 – Загрузить элемент типа unsigned содержится токен метаданных, указывающий на информацию о типе-зна-
int32 чении. В отличие от инструкции newobj, инструкция initobj не вызывает
конструктор.
0x96 ldelem.i8 – Загрузить элемент типа int64
Инструкция initobj потребляет со стека вычислений адрес значения:
(ldelem.u8) или unsigned int64 ... , addr -> ...
0x97 ldelem.i – Загрузить элемент типа native int
или unsigned native int 3.3.3.2. Загрузка размера значения
0x98 ldelem.r4 – Загрузить элемент типа float32 Инструкция sizeof (см. таблицу 3.36) загружает на стек вычислений
0x99 ldelem.r8 – Загрузить элемент типа float64 размер в байтах типа-значения (размер представляет собой значение типа
unsigned int32). Во встроенном операнде этой инструкции содержится то-
0x9A ldelem.ref – Загрузить элемент – объектную
кен метаданных, указывающий на информацию о типе-значении.
ссылку
Страницы
- « первая
- ‹ предыдущая
- …
- 60
- 61
- 62
- 63
- 64
- …
- следующая ›
- последняя »
