Разработка компиляторов

       

Арифметические команды MSIL


Арифметические команды позволяют выполнять вычисления. Все они берут аргументы со стека и кладут на их место результат.

Команды целочисленной арифметики существуют в знаковом и беззнаковом (с суффиксом .u) вариантах и могут быть записаны с суффиксом обработки переполнения (.ovf), который порождает исключение при возникновении переполнения. К этим командам относятся: ADD, SUB, MUL, DIV, MOD.

Также есть логические операции, которые не могут быть знаковыми или иметь суффикс контроля за переполнением. Логические операции делятся на бинарные (AND, OR, XOR) и унарные (NOT, NEG).

Наконец, в MSIL есть некоторый набор операций сравнения. Эти операции снимают со стека операнды и помещают на их место результат 0/1. Они могут быть беззнаковыми или знаковыми (с суффиксом .s). Кроме того, существуют специальные варианты сравнения, учитывающие возможность сравнения чисел с плавающей запятой различного порядка (такие операции имеют суффикс .un).

Интересно отметить, что при наличии полного комплекта операций перехода, создатели MSIL не включили в систему команд операций сравнения "<=" и ">=" Это приводит к тому, что для целочисленных значений операцию "<=" приходится эмулировать с помощью следующего набора команд:

cgt; ldc.i4.0; ceq

Соответственно, для вещественных значений операцию "<=" необходимо представлять аналогично, только первая команда должна быть заменена на cgt.un. Тем не менее, с точки зрения конечной программы в машинных кодах это, видимо, несущественно, так как такой набор операций легко соптимизировать в одну ассемблерную команду целевой архитектуры.



Содержание раздела