Россия |
Генерация MSIL
Работа с указателями в MSIL
Машина MSIL ориентирована на безопасность работы с указателями. Например, правила манипуляции с адресами переменных и полей запрещают хранение адреса в тех ситуациях, когда транслятор не может гарантировать существование объекта, на который ссылается адрес.
На практике это означает, что в безопасном режиме указатели на локальные переменные могут быть только переданы параметрами в другие функции; присваивание их в другие переменные запрещено.
Кроме того, в .NET SDK входит программа PEVerify, которая осуществляет проверку типовой корректности исполняемого модуля.
Команды загрузки в MSIL
Перейдем к рассмотрению основных команд MSIL. Начнем с команд загрузки:
- ldimm <число> - загрузка константы
- ldstr <строка> - загрузка строковой константы
- ldsflda <поле> - загрузка адреса статического поля
- ldloca <# переменной> - загрузка адреса локальной переменной
- ldflda <поле> - загрузка адреса поля объекта
- ldind - косвенная загрузка, берет адрес со стека и помещает на его место значение, размещенное по этому адресу
Поскольку, как правило, нам необходим не адрес переменной, а ее значение, то существуют команды загрузки значения на стек: ldsfld, ldloc, ldfld. Каждая из этих команд эквивалентна паре команд ldxxxa; ldind.
Команды выгрузки в MSIL
Команды выгрузки в основном построены так же, как и команды загрузки (только с противоположным результатом работы), и потому не особо нуждаются в комментариях.
Отметим команду stind, которая берет со стека адрес значения вместе с самим значением и записывает значение по выбранному адресу.
Кроме того, упомянем, что как и в командах загрузки, команды
stloc, stfld, stsfld
эквивалентны следующим парам команд:
ldxxxxa; stind