Составители:
Рубрика:
Инструкция 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
- …
- следующая ›
- последняя »