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

UptoLike

Common Intermediate Language
89
3.2. Язык CIL: инструкции общего назначения
В этом разделе мы рассмотрим ту часть инструкций языка CIL, кото-
рая служит для организации вычислений, а именно:
инструкции для загрузки и сохранения значений;
арифметические инструкции;
инструкции для организации передачи управления.
3.2.1. Инструкции для загрузки и сохранения значений
Инструкции для загрузки и сохранения значений предназначены
главным образом для обмена значениями между стеком вычислений и па-
мятью, то есть они выполняют копирование значений на стек вычислений
и сохранение значений со стека вычислений в память.
3.2.1.1. Загрузка констант
Эта группа инструкций (см. таблицу 3.2) служит для загрузки кон-
стантных значений на стек вычислений. При этом значения кодируются в
самих инструкциях в виде их кодов или встроенных операндов.
Диаграмма стека для всех инструкций этой группы выглядит следую-
щим образом:
... -> ... , constant
3.2.1.2. Работа с переменными и параметрами методов
Локальные переменные и параметры методов имеют номера от 0 до
65534. Существуют три варианта инструкций для работы с переменными и
параметрами:
сокращенные инструкции, которые работают с переменными и
параметрами, имеющими номера от 0 до 3;
сокращенные инструкции, допускающие номера переменных и
параметров от 0 до 255;
обычные инструкции, работающие с любыми переменными и
параметрами.
В таблице 3.3 перечислены инструкции, выполняющие загрузку зна-
чений переменных и параметров на стек вычислений. Все они имеют сле-
дующую диаграмму стека:
... -> ... , value
Кроме инструкций, загружающих значения переменных и парамет-
ров, существуют инструкции, загружающие на вершину стека вычислений
адреса переменных и параметров (см. таблицу 3.4). Загружаемые адреса
имеют тип управляемых указателей. Диаграмма стека для этих инструкций
выглядит следующим образом:
... -> ... , address
88
CIL и системное программирование в Microsoft .NET
Код Инструкция Встроенный Описание
операнд
0x14 ldnull Загрузка константы null
0x15 ldc.m1 Загрузка целого числа -1 (int32)
0x16 – 0x1E ldc.0 – Загрузка целых чисел
ldc.8 от 0 до 8 (int32)
0x1F ldc.s int8 Загрузка целых чисел от -128 до
127 (int32)
0x20 ldc.i4 int32 Загрузка целых чисел (int32)
0x21 ldc.i8 int64 Загрузка целых чисел (int64)
0x22 ldc.r4 float32 Загрузка чисел с плавающей за-
пятой (F)
0x23 ldc.r8 float64 Загрузка чисел с плавающей за-
пятой (F)
Таблица 3.3. Инструкции для загрузки параметров и локальных
переменных
Код Инструкция Встроенный Описание
операнд
0x02 – 0x05 ldarg.0 –– Загрузка параметров с номерами
ldarg.3 от 0 до 3
0x06 – 0x09 ldloc.0 Загрузка локальных переменных
ldloc.3 с номерами от 0 до 3
0x0E ldarg.s unsigned Загрузка параметров с номерами
int8 от 0 до 255
0x11 ldloc.s unsigned Загрузка локальных переменных
int8 с номерами от 0 до 255
0xFE 0x09 ldarg unsigned Загрузка параметров с номерами
int16 от 0 до 65534
0xFE 0x0C ldloc unsigned Загрузка локальных переменных
int16 с номерами от 0 до 65534
Таблица 3.2. Инструкции для загрузки констант
88                         CIL и системное программирование в Microsoft .NET   Common Intermediate Language                                            89


3.2. Язык CIL: инструкции общего назначения                                          Таблица 3.2. Инструкции для загрузки констант

     В этом разделе мы рассмотрим ту часть инструкций языка CIL, кото-         Код         Инструкция Встроенный        Описание
рая служит для организации вычислений, а именно:                                                      операнд
       • инструкции для загрузки и сохранения значений;                        0x14        ldnull     –                 Загрузка константы null
       • арифметические инструкции;                                            0x15        ldc.m1     –                 Загрузка целого числа -1 (int32)
       • инструкции для организации передачи управления.                       0x16 – 0x1E ldc.0 –    –                 Загрузка целых чисел
3.2.1. Инструкции для загрузки и сохранения значений                                       ldc.8                        от 0 до 8 (int32)
     Инструкции для загрузки и сохранения значений предназначены               0x1F        ldc.s      int8              Загрузка целых чисел от -128 до
главным образом для обмена значениями между стеком вычислений и па-                                                     127 (int32)
мятью, то есть они выполняют копирование значений на стек вычислений           0x20          ldc.i4           int32     Загрузка целых чисел (int32)
и сохранение значений со стека вычислений в память.                            0x21          ldc.i8           int64     Загрузка целых чисел (int64)
                                                                               0x22          ldc.r4           float32   Загрузка чисел с плавающей за-
3.2.1.1. Загрузка констант
                                                                                                                        пятой (F)
     Эта группа инструкций (см. таблицу 3.2) служит для загрузки кон-
стантных значений на стек вычислений. При этом значения кодируются в           0x23          ldc.r8           float64   Загрузка чисел с плавающей за-
самих инструкциях в виде их кодов или встроенных операндов.                                                             пятой (F)
     Диаграмма стека для всех инструкций этой группы выглядит следую-
щим образом:
     ... -> ... , constant                                                           Таблица 3.3. Инструкции для загрузки параметров и локальных
                                                                                     переменных
3.2.1.2. Работа с переменными и параметрами методов
     Локальные переменные и параметры методов имеют номера от 0 до             Код         Инструкция Встроенный        Описание
65534. Существуют три варианта инструкций для работы с переменными и                                  операнд
параметрами:                                                                   0x02 – 0x05 ldarg.0 –  –                 Загрузка параметров с номерами
         • сокращенные инструкции, которые работают с переменными и                        ldarg.3                      от 0 до 3
           параметрами, имеющими номера от 0 до 3;                             0x06 – 0x09 ldloc.0 —  –                 Загрузка локальных переменных
         • сокращенные инструкции, допускающие номера переменных и
                                                                                           ldloc.3                      с номерами от 0 до 3
           параметров от 0 до 255;
         • обычные инструкции, работающие с любыми переменными и               0x0E        ldarg.s    unsigned          Загрузка параметров с номерами
           параметрами.                                                                               int8              от 0 до 255
     В таблице 3.3 перечислены инструкции, выполняющие загрузку зна-           0x11        ldloc.s    unsigned          Загрузка локальных переменных
чений переменных и параметров на стек вычислений. Все они имеют сле-                                  int8              с номерами от 0 до 255
дующую диаграмму стека:                                                        0xFE 0x09 ldarg        unsigned          Загрузка параметров с номерами
     ... -> ... , value
                                                                                                      int16             от 0 до 65534
     Кроме инструкций, загружающих значения переменных и парамет-
ров, существуют инструкции, загружающие на вершину стека вычислений            0xFE 0x0C ldloc        unsigned          Загрузка локальных переменных
адреса переменных и параметров (см. таблицу 3.4). Загружаемые адреса                                  int16             с номерами от 0 до 65534
имеют тип управляемых указателей. Диаграмма стека для этих инструкций
выглядит следующим образом:
     ... -> ... , address