Опубликован: 23.07.2006 | Доступ: свободный | Студентов: 2213 / 889 | Оценка: 4.28 / 4.17 | Длительность: 21:37:00
Специальности: Системный архитектор
Лекция 14:

Генерация 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