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

UptoLike

3.2.3.3. Инструкция switch
Инструкция множественного выбора switch представлена в таблице
3.22. Встроенный операнд этой инструкции имеет сложный формат: пер-
вое 32-разрядное слово содержит размер N таблицы переходов, после чего
следует N 32-рязрядных относительных смещений целей перехода.
Инструкция switch берет со стека вычислений один операнд. Обо-
значим этот операнд через I. Значение I интерпретируется как целое чис-
ло без знака и сравнивается с N. Если I < N, то управление передается на
I-тую цель в таблице переходов (нумерация целей осуществляется с 0). Ес-
Common Intermediate Language
103
Инструкции brfalse присвоены два псевдонима: brnull и brzero,
имеющих одинаковый с ней код. Аналогично, brfalse.s имеет псевдони-
мы brnull.s и brzero.s.
Кроме базовых, существуют дополнительные инструкции условного
перехода, потребляющие сразу два операнда. Каждая из дополнительных
инструкций условного перехода является сокращенной записью последова-
тельности из двух инструкций, первая из которых является бинарной опе-
рацией сравнения, а вторая – базовой инструкцией условного перехода.
Таким образом, дополнительные инструкции условного перехода
имеют следующую диаграмму стека:
... , value1 , value2 -> ...
Длинные варианты дополнительных инструкций условного перехода
перечислены в таблице 3.20, а короткие – в таблице 3.21. В описании ка-
ждой инструкции приводится эквивалентная ей комбинация бинарной
операции сравнения и базовой инструкции условного перехода. В связи с
тем, что семантика операций сравнения для целых чисел существенно от-
личается от их семантики для чисел с плавающей запятой (см. пункт
3.2.2.1), для инструкций bge, ble, bge.un и ble.un (и для коротких вариан-
тов этих инструкций) приводится по две эквивалентные им комбинации.
Комбинация, помеченная меткой (int), используется в случае целых опе-
рандов, а комбинация, помеченная меткой (F), используется в том случае,
если операнды представляют собой числа с плавающей запятой.
Таблица 3.20. Дополнительные длинные инструкции условного перехода
102
CIL и системное программирование в Microsoft .NET
Код Инструкция Встроенный Описание
операнд
0x3B beq int32 ceq; brtrue
0x3C bge int32 (int): clt; brfalse
(F) : clt.un; brfalse
0x3D bgt int32 cgt; brtrue
0x3E ble int32 (int): cgt; brfalse
(F): cgt.un; brfalse
0x3F blt int32 clt; brtrue
0x40 bne.un int32 ceq; brfalse
0x41 bge.un int32 (int): clt.un; brfalse
(F): clt; brfalse
0x42 bgt.un int32 cgt.un; brtrue
0x43 ble.un int32 (int): cgt.un; brfalse
(F): cgt; brfalse
0x44 blt.un int32 clt.un; brtrue
Код Инструкция Встроенный Описание
операнд
0x2E beq.s int8 ceq; brtrue.s
0x2F bge.s int8 (int): clt; brfalse.s
(F): clt.un; brfalse.s
0x30 bgt.s int8 cgt; brtrue.s
0x31 ble.s int8 (int): cgt; brfalse.s
(F): cgt.un; brfalse.s
0x32 blt.s int8 clt; brtrue.s
0x33 bne.un.s int8 ceq; brfalse.s
0x34 bge.un.s int8 (int): clt.un; brfalse.s
(F): clt; brfalse.s
0x35 bgt.un.s int8 cgt.un; brtrue.s
0x36 ble.un.s int8 (int): cgt.un; brfalse.s
(F): cgt; brfalse.s
0x37 blt.un.s int8 clt.un; brtrue.s
Таблица 3.21. Дополнительные короткие инструкции безусловного
перехода
Таблица 3.22. Инструкция switch
Код Инструкция Встроенный Описание
операнд
0x42 switch unsigned Осуществляет переход по
int32, таблице переходов
int32 ... в соответствии со значением
int32 на вершине стека
102                          CIL и системное программирование в Microsoft .NET   Common Intermediate Language                                          103


      Инструкции brfalse присвоены два псевдонима: brnull и brzero,                    Таблица 3.21. Дополнительные короткие инструкции безусловного
имеющих одинаковый с ней код. Аналогично, brfalse.s имеет псевдони-                    перехода
мы brnull.s и brzero.s.
      Кроме базовых, существуют дополнительные инструкции условного              Код           Инструкция Встроенный Описание
перехода, потребляющие сразу два операнда. Каждая из дополнительных                                       операнд
инструкций условного перехода является сокращенной записью последова-            0x2E          beq.s      int8              ceq; brtrue.s
тельности из двух инструкций, первая из которых является бинарной опе-           0x2F          bge.s      int8       (int): clt; brfalse.s
рацией сравнения, а вторая – базовой инструкцией условного перехода.
                                                                                                                     (F):   clt.un; brfalse.s
      Таким образом, дополнительные инструкции условного перехода
имеют следующую диаграмму стека:                                                 0x30          bgt.s      int8              cgt; brtrue.s
      ... , value1 , value2 -> ...                                               0x31          ble.s      int8       (int): cgt; brfalse.s
      Длинные варианты дополнительных инструкций условного перехода                                                  (F):   cgt.un; brfalse.s
перечислены в таблице 3.20, а короткие – в таблице 3.21. В описании ка-          0x32          blt.s      int8              clt; brtrue.s
ждой инструкции приводится эквивалентная ей комбинация бинарной                  0x33          bne.un.s   int8              ceq; brfalse.s
операции сравнения и базовой инструкции условного перехода. В связи с
                                                                                 0x34          bge.un.s   int8       (int): clt.un; brfalse.s
тем, что семантика операций сравнения для целых чисел существенно от-
личается от их семантики для чисел с плавающей запятой (см. пункт                                                    (F):   clt; brfalse.s
3.2.2.1), для инструкций bge, ble, bge.un и ble.un (и для коротких вариан-       0x35          bgt.un.s   int8              cgt.un; brtrue.s
тов этих инструкций) приводится по две эквивалентные им комбинации.              0x36          ble.un.s   int8       (int): cgt.un; brfalse.s
Комбинация, помеченная меткой (int), используется в случае целых опе-                                                (F):   cgt; brfalse.s
рандов, а комбинация, помеченная меткой (F), используется в том случае,          0x37          blt.un.s   int8              clt.un; brtrue.s
если операнды представляют собой числа с плавающей запятой.

      Таблица 3.20. Дополнительные длинные инструкции условного перехода         3.2.3.3. Инструкция switch
                                                                                       Инструкция множественного выбора switch представлена в таблице
Код           Инструкция Встроенный Описание                                     3.22. Встроенный операнд этой инструкции имеет сложный формат: пер-
                         операнд                                                 вое 32-разрядное слово содержит размер N таблицы переходов, после чего
0x3B          beq        int32             ceq; brtrue                           следует N 32-рязрядных относительных смещений целей перехода.
0x3C          bge        int32      (int): clt; brfalse                                Инструкция switch берет со стека вычислений один операнд. Обо-
                                    (F) : clt.un; brfalse                        значим этот операнд через I. Значение I интерпретируется как целое чис-
0x3D          bgt        int32             cgt; brtrue                           ло без знака и сравнивается с N. Если I < N, то управление передается на
0x3E          ble        int32      (int): cgt; brfalse                          I-тую цель в таблице переходов (нумерация целей осуществляется с 0). Ес-
                                    (F):   cgt.un; brfalse
                                                                                       Таблица 3.22. Инструкция switch
0x3F          blt        int32             clt; brtrue
0x40          bne.un     int32             ceq; brfalse
                                                                                 Код           Инструкция Встроенный     Описание
0x41          bge.un     int32      (int): clt.un; brfalse
                                                                                                          операнд
                                    (F):   clt; brfalse
0x42          bgt.un     int32             cgt.un; brtrue                        0x42          switch     unsigned       Осуществляет переход по
0x43          ble.un     int32      (int): cgt.un; brfalse                                                int32,         таблице переходов
                                    (F):   cgt; brfalse                                                   int32 ...      в соответствии со значением
0x44          blt.un     int32             clt.un; brtrue                                                 int32          на вершине стека