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

UptoLike

числа с плавающей запятой могут дополнительно принимать значения
+inf (положительная бесконечность), -inf (отрицательная бесконечность)
и NaN (Not a Number – не число). Поэтому описание каждой инструкции
содержит две части: для целых чисел и для чисел с плавающей запятой.
При этом в описании используются следующие обозначения:
I и J – целые числа со знаком, причем I < J;
K и L – целые числа без знака, причем K < L;
A и B – конечные числа с плавающей запятой (то есть они не рав-
ны NaN, +inf и -inf), причем A < B;
C – любое число с плавающей запятой (может принимать значе-
ния NaN, +inf и -inf).
Common Intermediate Language
95
ющей запятой. При этом применение бинарной операции не допускается,
если тип одного ее операнда – целый, а другого – с плавающей запятой.
Тип результата бинарной операции зависит от типов операндов. Если
операнды целые, то и результат будет целый. Если операнды представля-
ют собой числа с плавающей запятой, то результатом будет являться чис-
ло с плавающей запятой.
В таблице 3.9 представлены базовые инструкции, выполняющие би-
нарные операции.
Таблица 3.9. Базовые бинарные арифметические операции
Инструкции, представленные в таблице 3.10, используются только
для целочисленных операндов. Они отличаются от базовых бинарных опе-
раций тем, что осуществляют контроль переполнения (при переполнении
генерируется исключение OverflowException).
Операции сдвига (см. таблицу 3.11) выполняют сдвиг значения пер-
вого операнда (value1) в нужную сторону на количество бит, указанное во
втором операнде (value2).
Операции, приведенные в таблице 3.12, выполняют сравнение значе-
ний своих операндов. Результатом сравнения являются числа 0 или 1 (ти-
па int32). Число 0 обозначает ложь, а число 1 – истину.
Семантика операций сравнения для чисел с плавающей запятой су-
щественно отличается от их семантики для целых чисел. Дело в том, что
94
CIL и системное программирование в Microsoft .NET
Код Инструкция Встроенный Описание
операнд
0x58 add Сложение
0x59 sub Вычитание
0x5A mul –Умножение
0x5B div –Деление
0x5C div.un Деление беззнаковых целых чи-
сел
0x5D rem Остаток от деления
0x5E rem.un Остаток от деления беззнаковых
целых чисел
0x5F and –Побитовое И
0x60 or Побитовое ИЛИ
0x61 xor Побитовое ИСКЛЮЧАЮЩЕЕ
ИЛИ
Код Инструкция Встроенный Описание
операнд
0xD6 add.ovf Сложение целых чисел со зна-
ком с контролем переполнения
0xD7 add.ovf.un Сложение целых чисел без знака
с контролем переполнения
0xD8 mul.ovf –Умножение целых чисел со зна-
ком с контролем переполнения
0xD9 mul.ovf.un –Умножение целых чисел без зна-
ка с контролем переполнения
0xDA sub.ovf Вычитание целых чисел со зна-
ком с контролем переполнения
0xDB sub.ovf.un Вычитание целых чисел без зна-
ка с контролем переполнения
Код Инструкция Встроенный Описание
операнд
0x62 shl Сдвиг целых чисел влево
0x63 shr –Сдвиг целых чисел со знаком
вправо
0x64 shr.un Сдвиг целых чисел без знака
вправо
Таблица 3.10. Бинарные арифметические операции с контролем
переполнения
Таблица 3.11. Операции сдвига
94                            CIL и системное программирование в Microsoft .NET   Common Intermediate Language                                        95


ющей запятой. При этом применение бинарной операции не допускается,                     Таблица 3.10. Бинарные арифметические операции с контролем
если тип одного ее операнда – целый, а другого – с плавающей запятой.                   переполнения
     Тип результата бинарной операции зависит от типов операндов. Если
                                                                                  Код           Инструкция Встроенный Описание
операнды целые, то и результат будет целый. Если операнды представля-
ют собой числа с плавающей запятой, то результатом будет являться чис-                                     операнд
ло с плавающей запятой.                                                           0xD6          add.ovf    –          Сложение целых чисел со зна-
     В таблице 3.9 представлены базовые инструкции, выполняющие би-                                                   ком с контролем переполнения
нарные операции.                                                                  0xD7          add.ovf.un –          Сложение целых чисел без знака
                                                                                                                      с контролем переполнения
      Таблица 3.9. Базовые бинарные арифметические операции
                                                                                  0xD8          mul.ovf    –          Умножение целых чисел со зна-
Код           Инструкция Встроенный       Описание                                                                    ком с контролем переполнения
                         операнд                                                  0xD9          mul.ovf.un –          Умножение целых чисел без зна-
0x58          add        –                Сложение                                                                    ка с контролем переполнения
0x59          sub        –                Вычитание                               0xDA          sub.ovf    –          Вычитание целых чисел со зна-
0x5A          mul        –                Умножение                                                                   ком с контролем переполнения
0x5B          div        –                Деление                                 0xDB          sub.ovf.un –          Вычитание целых чисел без зна-
0x5C          div.un     –                Деление беззнаковых целых чи-                                               ка с контролем переполнения
                                          сел
0x5D          rem         –               Остаток от деления                            Таблица 3.11. Операции сдвига
0x5E          rem.un      –               Остаток от деления беззнаковых
                                                                                  Код           Инструкция Встроенный Описание
                                          целых чисел
                                                                                                           операнд
0x5F          and         –               Побитовое И
                                                                                  0x62          shl        –          Сдвиг целых чисел влево
0x60          or          –               Побитовое ИЛИ
                                                                                  0x63          shr        –          Сдвиг целых чисел со знаком
0x61          xor         –               Побитовое ИСКЛЮЧАЮЩЕЕ
                                                                                                                      вправо
                                          ИЛИ
                                                                                  0x64          shr.un     –          Сдвиг целых чисел без знака
                                                                                                                      вправо
     Инструкции, представленные в таблице 3.10, используются только
для целочисленных операндов. Они отличаются от базовых бинарных опе-              числа с плавающей запятой могут дополнительно принимать значения
раций тем, что осуществляют контроль переполнения (при переполнении               +inf (положительная бесконечность), -inf (отрицательная бесконечность)
генерируется исключение OverflowException).                                       и NaN (Not a Number – не число). Поэтому описание каждой инструкции
     Операции сдвига (см. таблицу 3.11) выполняют сдвиг значения пер-             содержит две части: для целых чисел и для чисел с плавающей запятой.
вого операнда (value1) в нужную сторону на количество бит, указанное во           При этом в описании используются следующие обозначения:
втором операнде (value2).                                                              • I и J – целые числа со знаком, причем I < J;
     Операции, приведенные в таблице 3.12, выполняют сравнение значе-                  • K и L – целые числа без знака, причем K < L;
ний своих операндов. Результатом сравнения являются числа 0 или 1 (ти-                 • A и B – конечные числа с плавающей запятой (то есть они не рав-
па int32). Число 0 обозначает ложь, а число 1 – истину.                                   ны NaN, +inf и -inf), причем A < B;
     Семантика операций сравнения для чисел с плавающей запятой су-                    • C – любое число с плавающей запятой (может принимать значе-
щественно отличается от их семантики для целых чисел. Дело в том, что                     ния NaN, +inf и -inf).