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

UptoLike

то есть например, если op соответствует операции вычитания, то из value1
вычитается value2.
Некоторые бинарные операции могут использоваться для операндов
различных типов. Другими словами, в коде инструкции не содержится ин-
формации о типах ее операндов, так как эти типы определяются на этапе
JIT-компиляции. Поэтому, например, одну и ту же инструкцию add можно
использовать для сложения как двух целых чисел, так и двух чисел с плава-
Common Intermediate Language
93
инструкция ckfinite, проверяющая конечность значений с пла-
вающей точкой;
инструкции преобразования значений.
3.2.2.1. Бинарные арифметические операции
Бинарные арифметические операции потребляют со стека вычисле-
ний два операнда. Соответственно, диаграмма стека для таких операций
выглядит следующим образом:
... , value1 , value2 -> ... , result
Действие бинарных операций можно записать как
result := value1 op value2,
92
CIL и системное программирование в Microsoft .NET
Код Инструкция Встроенный Описание
операнд
0x46 ldind.i1 Косвенная загрузка значения
int8
0x47 ldind.u1 Косвенная загрузка значения
unsigned int8
0x48 ldind.i2 Косвенная загрузка значения
int16
0x49 ldind.u2 Косвенная загрузка значения
unsigned int16
0x4A ldind.i4 Косвенная загрузка значения
int32
0x4B ldind.u4 Косвенная загрузка значения
unsigned int32
0x4C ldind.i8 Косвенная загрузка значения
(ldind.u8) int64 и unsigned int64
0x4D ldind.i Косвенная загрузка значения
native int
0x4E ldind.r4 Косвенная загрузка значения
float32
0x4F ldind.r8 Косвенная загрузка значения
float64
0x50 ldind.ref Косвенная загрузка объектной
ссылки
Таблица.3.6. Инструкции для косвенной загрузки значений
Код Инструкция Встроенный Описание
операнд
0x51 stind.ref Косвенное сохранение объект-
ной ссылки
0x52 stind.i1 Косвенное сохранение значения
int8
0x53 stind.i2 Косвенное сохранение значения
int16
0x54 stind.i4 Косвенное сохранение значения
int32
0x55 stind.i8 Косвенное сохранение значения
int64
0x56 stind.r4 Косвенное сохранение значения
float32
0x57 stind.r8 Косвенное сохранение значения
float64
0xDF stind.i Косвенное сохранение значения
native int
Таблица 3.7. Инструкции для косвенного сохранения значений
Код Инструкция Встроенный Описание
операнд
0x25 dup Копирование значения на вер-
шине стека:... , value -> ... ,
value, value
0x26 pop –Удаление значения с вершины
стека:... , value -> ...
Таблица 3.8. Специальные инструкции для работы со стеком.
92                          CIL и системное программирование в Microsoft .NET   Common Intermediate Language                                          93


      Таблица.3.6. Инструкции для косвенной загрузки значений                         Таблица 3.7. Инструкции для косвенного сохранения значений

Код           Инструкция Встроенный Описание                                    Код           Инструкция Встроенный Описание
                         операнд                                                                         операнд
0x46          ldind.i1   –          Косвенная загрузка значения                 0x51          stind.ref  –          Косвенное сохранение объект-
                                    int8                                                                            ной ссылки
0x47          ldind.u1   –          Косвенная загрузка значения                 0x52          stind.i1   –          Косвенное сохранение значения
                                    unsigned int8                                                                   int8
0x48          ldind.i2   –          Косвенная загрузка значения                 0x53          stind.i2   –          Косвенное сохранение значения
                                    int16                                                                           int16
0x49          ldind.u2   –          Косвенная загрузка значения                 0x54          stind.i4   –          Косвенное сохранение значения
                                    unsigned int16                                                                  int32
0x4A          ldind.i4   –          Косвенная загрузка значения                 0x55          stind.i8   –          Косвенное сохранение значения
                                    int32                                                                           int64
0x4B          ldind.u4   –          Косвенная загрузка значения                 0x56          stind.r4   –          Косвенное сохранение значения
                                    unsigned int32                                                                  float32
0x4C          ldind.i8   –          Косвенная загрузка значения                 0x57          stind.r8   –          Косвенное сохранение значения
              (ldind.u8)            int64 и unsigned int64                                                          float64
0x4D          ldind.i    –          Косвенная загрузка значения                 0xDF          stind.i    –          Косвенное сохранение значения
                                    native int                                                                      native int
0x4E          ldind.r4   –          Косвенная загрузка значения
                                    float32                                           Таблица 3.8. Специальные инструкции для работы со стеком.
0x4F          ldind.r8   –          Косвенная загрузка значения                 Код           Инструкция Встроенный Описание
                                    float64                                                              операнд
0x50          ldind.ref  –          Косвенная загрузка объектной                0x25          dup        –          Копирование значения на вер-
                                    ссылки                                                                          шине стека:... , value -> ... ,
                                                                                                                    value, value
        • инструкция ckfinite, проверяющая конечность значений с пла-           0x26          pop        –          Удаление значения с вершины
          вающей точкой;
                                                                                                                    стека:... , value -> ...
        • инструкции преобразования значений.

3.2.2.1. Бинарные арифметические операции                                       то есть например, если op соответствует операции вычитания, то из value1
     Бинарные арифметические операции потребляют со стека вычисле-              вычитается value2.
ний два операнда. Соответственно, диаграмма стека для таких операций                 Некоторые бинарные операции могут использоваться для операндов
выглядит следующим образом:                                                     различных типов. Другими словами, в коде инструкции не содержится ин-
     ... , value1 , value2 -> ... , result                                      формации о типах ее операндов, так как эти типы определяются на этапе
     Действие бинарных операций можно записать как                              JIT-компиляции. Поэтому, например, одну и ту же инструкцию add можно
     result := value1 op value2,                                                использовать для сложения как двух целых чисел, так и двух чисел с плава-