Common Intermediate Language и системное программирование в Microsoft.Net. Макаров А.В - 62 стр.

UptoLike

Инструкция 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     –          Загрузить элемент – объектную
                                                                                кен метаданных, указывающий на информацию о типе-значении.
                                     ссылку