Опубликован: 28.06.2006 | Уровень: специалист | Доступ: платный | ВУЗ: Московский государственный технический университет им. Н.Э. Баумана
Лекция 6:

Язык CIL: инструкции для поддержки объектной модели

< Лекция 5 || Лекция 6: 1234 || Лекция 7 >

Инструкции для работы с типами-значениями

Специальный набор инструкций предусмотрен для поддержки операций с типами-значениями.

Инициализация значения

Инструкция initobj (см. таблицу 3.35) предназначена для инициализации значения типа-значения. Во встроенном операнде этой инструкции содержится токен метаданных, указывающий на информацию о типе-значении. В отличие от инструкции newobj, инструкция initobj не вызывает конструктор.

Инструкция initobj потребляет со стека вычислений адрес значения:

... , addr -> ...
Таблица 3.35. Инструкция initobj
Код Инструкция Встроенный операнд Описание
0xFE 0x15 initobj token Заполняет все поля значения нулями
Загрузка размера значения

Инструкция sizeof (см. таблицу 3.36) загружает на стек вычислений размер в байтах типа-значения (размер представляет собой значение типа unsigned int32 ). Во встроенном операнде этой инструкции содержится токен метаданных, указывающий на информацию о типе-значении.

Таблица 3.36. Инструкция sizeof
Код Инструкция Встроенный операнд Описание
0xFE 0x1C sizeof token Загружает на стек размер значения указанного типа

Диаграмма стека для инструкций sizeof:

... -> ... , size
Копирование значений

Инструкции, приведенные в таблице 3.37, выполняют копирование значений типов-значений. Во встроенных операндах этих инструкций содержится токен метаданных, указывающий на информацию о типе-значении в таблицах метаданных.

Таблица 3.37. Инструкции для копирования значений
Код Инструкция Встроенный операнд Описание
0x70 cpobj token Копирует значение. Диаграмма стека:
..., destAddr, srcAddr ->...
(Здесь destAddr - адрес приемника, а srcAddr - адрес источника.)
0x71 ldobj token Загружает значение на стек вычислений. Диаграмма стека:
..., addr, -> ..., val0bj
(Здесь addr - адрес загружаемого значения.)
0x81 stobj token Сохраняет значение со стека вычислений в память. Диаграмма стека:
..., addr, val0bj ->...
(Здесь addr - адрес, по которому будет сохранено значение.)

Инструкция ldobj используется главным образом при вызове методов для загрузки параметров (если вызываемый метод имеет параметры типов-значений). Инструкции cpobj и stobj применяются сравнительно редко, хотя и имеют однобайтовые коды.

Упаковка и распаковка значений

Инструкции, приведенные в таблице 3.38, выполняют упаковку и распаковку значений типов-значений. Во встроенных операндах этих инструкций содержится токен метаданных, указывающий на информацию о типе-значении в таблицах метаданных.

Таблица 3.38. Инструкции для упаковки и распаковки значений
Код Инструкция Встроенный операнд Описание
0x79 unbox token Выполняет распаковку значения. Диаграмма стека
..., obj ->..., ptr
0x8C box token Упаковывает значение. Диаграмма стека:
..., value ->..., obj

Выполнение инструкции box заключается в создании в куче "объекта-обертки" для значения, после чего осуществляется побитовое копирование значения внутрь "обертки".

При распаковке значения с помощью инструкции unbox никакого копирования не происходит. Вместо этого на стек вычислений загружается адрес значения находящегося внутри "обертки".

Загрузка описателя токена метаданных

Инструкция ldtoken (см. таблицу 3.39) применяется для работы с библиотекой рефлексии. Фактически она переводит токены метаданных в специальные структуры данных рефлексии. Так как переводимый токен жестко зашит в инструкцию (он находится во встроенном операнде), то можно говорить о том, что инструкция ldtoken представляет собой инструкцию загрузки константы.

Таблица 3.39. Инструкция ldtoken
Код Инструкция Встроенный операнд Описание
0xD0 ldtoken token Загружает описатель токена метаданных (структуру RuntimeTypeHandle, RuntimeMethodHandle, RuntimeFieldHandle )

Диаграмма стека для инструкций ldtoken:

... -> ... , runtimeHandle

Эта инструкция отнесена к группе инструкций для работы с типами-значениями, потому что описатели токенов представляют собой значения типов-значений.

< Лекция 5 || Лекция 6: 1234 || Лекция 7 >
Анастасия Булинкова
Анастасия Булинкова
Рабочим названием платформы .NET было
Bogdan Drumov
Bogdan Drumov
Молдова, Республика
Azamat Nurmanbetov
Azamat Nurmanbetov
Киргизия, Bishkek