Составители:
Рубрика:
циальная инструкция для работы с одномерными массивами, индексиру-
емыми с нуля.
3.3.2.1. Создание массивов
Инструкция newarr (см. таблицу 3.30) выделяет память под одномер-
ный массив, индексируемый с нуля. Тип элементов массива указывается
через токен метаданных во встроенном операнде инструкции (в качестве
типа элементов может выступать тип-значение).
Таблица 3.30. Инструкция newarr
Диаграмма стека для инструкции newarr:
... , num -> ... , array
Инструкция newarr потребляет со стека вычислений размер массива
(на диаграмме обозначен как num) и оставляет объектную ссылку на соз-
данный массив в куче.
Элементы созданного массива автоматически обнуляются.
3.3.2.2. Загрузка длины массива
Инструкция ldlen (см. таблицу 3.31) загружает размер одномерного
массива на стек вычислений.
Таблица 3.31. Инструкция ldlen
Диаграмма стека для инструкции ldlen:
... , array -> ... , length
Инструкция потребляет со стека объектную ссылку на массив и оста-
вляет на стеке его размер в виде числа типа native unsigned int.
3.3.2.3. Работа с элементами массивов
Инструкции ldelem (см. таблицу 3.32) предназначены для загрузки
значения элемента одномерного массива на стек вычислений.
Common Intermediate Language
109
Токен метаданных, находящийся во встроенном операнде инструк-
ции, указывает на информацию о вызываемом методе в таблицах метадан-
ных (имя метода, класс и сигнатура). Определение метода, который нуж-
но вызвать, происходит следующим образом. Система выполнения анали-
зирует класс объекта, для которого вызывается метод (на диаграмме стека
этот объект обозначен как obj), выполняя поиск принадлежащего этому
классу экземплярного метода, имеющего нужные имя и сигнатуру. Если
такой метод отсутствует, аналогичный поиск производится по порядку на
всей цепочке суперклассов, от которых наследует класс объекта. Если в
результате метод не будет найден, то генерируется исключение
MissingMethodException, но эта ситуация невозможна в верифицирован-
ном коде.
3.3.1.5. Загрузка строковых констант
Для загрузки на стек вычислений строковых констант предусмотрена
отдельная инструкция ldstr, приведенная в таблице 3.29. Токен, находя-
щийся во встроенном операнде инструкции, указывает на образ строки в
куче пользовательских строк, находящейся в составе метаданных. Инструк-
ция создает объект класса System.String, копирует в него образ строки и ос-
тавляет ссылку на созданный объект на вершине стека вычислений.
Таблица 3.29. Инструкция ldstr
Диаграмма стека для инструкции ldstr:
... - > ... , o b j
3.3.2. Инструкции для работы с массивами
В принципе, массивы являются такими же объектами, как и экземп-
ляры других классов. Но для более эффективной реализации и для сокра-
щения размеров CIL-кода в наборе инструкций CLI предусмотрена спе-
108
CIL и системное программирование в Microsoft .NET
Код Инструкция Встроенный Описание
операнд
0x6F callvirt token Вызов метода с использованием
позднего связывания
Таблица 3.28. Инструкция callvirt
Код Инструкция Встроенный Описание
операнд
0x72 ldstr token Создает на вершине стека объ-
ект-строку
Код Инструкция Встроенный Описание
операнд
0x8D newarr token Создает новый массив с элемен-
тами указанного типа
Код Инструкция Встроенный Описание
операнд
0x8E ldlen – Загружает на стек длину
массива
108 CIL и системное программирование в Microsoft .NET Common Intermediate Language 109 Таблица 3.28. Инструкция callvirt циальная инструкция для работы с одномерными массивами, индексиру- емыми с нуля. Код Инструкция Встроенный Описание операнд 3.3.2.1. Создание массивов 0x6F callvirt token Вызов метода с использованием Инструкция newarr (см. таблицу 3.30) выделяет память под одномер- позднего связывания ный массив, индексируемый с нуля. Тип элементов массива указывается через токен метаданных во встроенном операнде инструкции (в качестве Токен метаданных, находящийся во встроенном операнде инструк- типа элементов может выступать тип-значение). ции, указывает на информацию о вызываемом методе в таблицах метадан- ных (имя метода, класс и сигнатура). Определение метода, который нуж- Таблица 3.30. Инструкция newarr но вызвать, происходит следующим образом. Система выполнения анали- Код Инструкция Встроенный Описание зирует класс объекта, для которого вызывается метод (на диаграмме стека этот объект обозначен как obj), выполняя поиск принадлежащего этому операнд классу экземплярного метода, имеющего нужные имя и сигнатуру. Если 0x8D newarr token Создает новый массив с элемен- такой метод отсутствует, аналогичный поиск производится по порядку на тами указанного типа всей цепочке суперклассов, от которых наследует класс объекта. Если в результате метод не будет найден, то генерируется исключение Диаграмма стека для инструкции newarr: MissingMethodException, но эта ситуация невозможна в верифицирован- ... , num -> ... , array ном коде. Инструкция newarr потребляет со стека вычислений размер массива (на диаграмме обозначен как num) и оставляет объектную ссылку на соз- 3.3.1.5. Загрузка строковых констант данный массив в куче. Для загрузки на стек вычислений строковых констант предусмотрена Элементы созданного массива автоматически обнуляются. отдельная инструкция ldstr, приведенная в таблице 3.29. Токен, находя- щийся во встроенном операнде инструкции, указывает на образ строки в 3.3.2.2. Загрузка длины массива куче пользовательских строк, находящейся в составе метаданных. Инструк- Инструкция ldlen (см. таблицу 3.31) загружает размер одномерного ция создает объект класса System.String, копирует в него образ строки и ос- массива на стек вычислений. тавляет ссылку на созданный объект на вершине стека вычислений. Таблица 3.31. Инструкция ldlen Таблица 3.29. Инструкция ldstr Код Инструкция Встроенный Описание Код Инструкция Встроенный Описание операнд операнд 0x8E ldlen – Загружает на стек длину 0x72 ldstr token Создает на вершине стека объ- массива ект-строку Диаграмма стека для инструкции ldlen: Диаграмма стека для инструкции ldstr: ... , array -> ... , length ... -> ... , obj Инструкция потребляет со стека объектную ссылку на массив и оста- вляет на стеке его размер в виде числа типа native unsigned int. 3.3.2. Инструкции для работы с массивами В принципе, массивы являются такими же объектами, как и экземп- 3.3.2.3. Работа с элементами массивов ляры других классов. Но для более эффективной реализации и для сокра- Инструкции ldelem (см. таблицу 3.32) предназначены для загрузки щения размеров CIL-кода в наборе инструкций CLI предусмотрена спе- значения элемента одномерного массива на стек вычислений.
Страницы
- « первая
- ‹ предыдущая
- …
- 59
- 60
- 61
- 62
- 63
- …
- следующая ›
- последняя »