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

UptoLike

3.3. Язык CIL:
инструкции для поддержки объектной модели
Язык CIL, в отличие от большинства других ассемблерных языков, со-
держит богатый набор инструкций, предназначенных для поддержки объ-
ектной модели. Этот набор можно разделить на четыре основные категории:
инструкции для работы с объектами;
инструкции для работы с массивами;
инструкции для работы с типами-значениями;
инструкции для работы с типизированными ссылками.
3.3.1. Инструкции для работы с объектами
Инструкции для работы с объектами – это базовые инструкции для
поддержки объектно-ориентированной парадигмы.
3.3.1.1. Создание объектов
Инструкция newobj (см. таблицу 3.25) выполняет выделение памяти
для объекта в куче и затем вызывает для этого объекта конструктор. Опе-
рации выделения памяти и вызова конструктора объединены в одной ин-
струкции не случайно, так как это гарантирует отсутствие в куче неиници-
ализированных объектов.
Токен метаданных, находящийся во встроенном операнде инструк-
ции, указывает на описатель конструктора в таблицах метаданных. Тип со-
здаваемого объекта определяется через информацию о конструкторе (это
тот класс, внутри которого объявлен конструктор).
Таблица 3.25. Инструкция newobj
Диаграмма стека для инструкции newobj:
... , arg1, ... , argN -> ... , obj
Инструкция newobj потребляет со стека вычислений параметры кон-
структора и оставляет на стеке ссылку на созданный объект. Параметры
вызываемого конструктора должны быть расположены в стеке слева на-
право, то есть сначала на стек должен быть загружен первый аргумент, за-
тем второй и т.д.
Common Intermediate Language
105
ли I >= N, то управление передается на инструкцию, непосредственно
следующую за инструкцией switch.
Для инструкции switch можно записать следующую диаграмму стека:
... , value -> ...
3.2.3.4. Инструкция call
Инструкция call (см. таблицу 3.23) выполняет вызов метода, кото-
рый указан во встроенном операнде инструкции. Встроенный операнд
представляет собой токен метаданных, указывающий на описывающую
вызываемый метод запись в таблицах метаданных. Непосредственно пе-
ред инструкцией call может стоять префикс .tail, который говорит о том,
что состояние текущего метода должно быть освобождено перед переда-
чей управления вызываемому методу (хвостовой вызов).
Таблица 3.23. Инструкция call
Информация о методе, на которую указывает токен метаданных, поз-
воляет JIT-компилятору определить, является ли вызываемый метод стати-
ческим, экземплярным, виртуальным или глобальной функцией. Особен-
ностью инструкции call (по сравнению с инструкцией callvirt, которую
мы будем рассматривать далее в этой главе) является то, что адрес вызывае-
мого метода вычисляется статически, то есть еще во время JIT-компиляции.
Параметры вызываемого метода должны быть расположены в стеке
слева направо, то есть сначала на стек должен быть загружен первый пара-
метр, затем второй и т.д. При вызове экземплярного метода в качестве пер-
вого параметра должна выступать объектная ссылка (параметр this).
Если вызываемый метод возвращает значение, то оно загружается на
стек вызывающего метода.
3.2.3.5. Инструкция ret
Инструкция ret (см. таблицу 3.24) осуществляет возврат из метода.
Если метод возвращает значение, то оно должно быть загружено на вер-
шину стека вычислений.
Таблица 3.24. Инструкция ret
104
CIL и системное программирование в Microsoft .NET
Код Инструкция Встроенный Описание
операнд
0x28 call token Выполняет вызов метода
Код Инструкция Встроенный Описание
операнд
0x2A ret Осуществляет возврат из метода
Код Инструкция Встроенный Описание
операнд
0x73 newobj token Создает новый объект и вызы-
вает для него конструктор
104                          CIL и системное программирование в Microsoft .NET   Common Intermediate Language                                         105


ли I >= N, то управление передается на инструкцию, непосредственно
следующую за инструкцией switch.                                                 3.3. Язык CIL:
     Для инструкции switch можно записать следующую диаграмму стека:
     ... , value -> ...                                                          инструкции для поддержки объектной модели
3.2.3.4. Инструкция call                                                              Язык CIL, в отличие от большинства других ассемблерных языков, со-
     Инструкция call (см. таблицу 3.23) выполняет вызов метода, кото-            держит богатый набор инструкций, предназначенных для поддержки объ-
рый указан во встроенном операнде инструкции. Встроенный операнд                 ектной модели. Этот набор можно разделить на четыре основные категории:
представляет собой токен метаданных, указывающий на описывающую                         • инструкции для работы с объектами;
вызываемый метод запись в таблицах метаданных. Непосредственно пе-                      • инструкции для работы с массивами;
ред инструкцией call может стоять префикс .tail, который говорит о том,                 • инструкции для работы с типами-значениями;
что состояние текущего метода должно быть освобождено перед переда-                     • инструкции для работы с типизированными ссылками.
чей управления вызываемому методу (хвостовой вызов).
                                                                                 3.3.1. Инструкции для работы с объектами
      Таблица 3.23. Инструкция call                                                  Инструкции для работы с объектами – это базовые инструкции для
                                                                                 поддержки объектно-ориентированной парадигмы.
Код           Инструкция Встроенный Описание
                         операнд                                                 3.3.1.1. Создание объектов
0x28          call       token      Выполняет вызов метода                            Инструкция newobj (см. таблицу 3.25) выполняет выделение памяти
                                                                                 для объекта в куче и затем вызывает для этого объекта конструктор. Опе-
     Информация о методе, на которую указывает токен метаданных, поз-            рации выделения памяти и вызова конструктора объединены в одной ин-
воляет JIT-компилятору определить, является ли вызываемый метод стати-           струкции не случайно, так как это гарантирует отсутствие в куче неиници-
ческим, экземплярным, виртуальным или глобальной функцией. Особен-               ализированных объектов.
ностью инструкции call (по сравнению с инструкцией callvirt, которую                  Токен метаданных, находящийся во встроенном операнде инструк-
мы будем рассматривать далее в этой главе) является то, что адрес вызывае-       ции, указывает на описатель конструктора в таблицах метаданных. Тип со-
мого метода вычисляется статически, то есть еще во время JIT-компиляции.         здаваемого объекта определяется через информацию о конструкторе (это
     Параметры вызываемого метода должны быть расположены в стеке                тот класс, внутри которого объявлен конструктор).
слева направо, то есть сначала на стек должен быть загружен первый пара-
метр, затем второй и т.д. При вызове экземплярного метода в качестве пер-              Таблица 3.25. Инструкция newobj
вого параметра должна выступать объектная ссылка (параметр this).
                                                                                 Код           Инструкция Встроенный Описание
     Если вызываемый метод возвращает значение, то оно загружается на
стек вызывающего метода.                                                                                  операнд
                                                                                 0x73          newobj     token      Создает новый объект и вызы-
3.2.3.5. Инструкция ret                                                                                              вает для него конструктор
     Инструкция ret (см. таблицу 3.24) осуществляет возврат из метода.
Если метод возвращает значение, то оно должно быть загружено на вер-                  Диаграмма стека для инструкции newobj:
шину стека вычислений.                                                                ... , arg1, ... , argN -> ... , obj
      Таблица 3.24. Инструкция ret                                                    Инструкция newobj потребляет со стека вычислений параметры кон-
                                                                                 структора и оставляет на стеке ссылку на созданный объект. Параметры
Код           Инструкция Встроенный Описание                                     вызываемого конструктора должны быть расположены в стеке слева на-
                         операнд                                                 право, то есть сначала на стек должен быть загружен первый аргумент, за-
0x2A          ret        –          Осуществляет возврат из метода               тем второй и т.д.