Основываясь на ответе Эрика, вот некоторые из них, которые я заметил. Где я могу видеть причину, я указал ее, если нет, то я свободно спекулирую. Не стесняйтесь указывать, если эти предположения неверны.
Break
Сигнализирует общеязыковой инфраструктуре (CLI) о том, что отладчику сработала точка останова.
Вы бы сделали это, вызвав System.Diagnostics.Debugger.Break(), похоже, что это не использует эту инструкцию напрямую, а вместо этого использует метод BreakInternal(), встроенный в CLR.
Cpblk
и Cpobj
Копирует указанное число байтов из адреса источника в адрес назначения. Копирует тип значения, расположенный по адресу объекта (тип &, * или собственный int), в адрес целевого объекта (тип &, * или собственный int).
Я предполагаю, что они были добавлены для C++/CLI (ранее Managed C++), но это чисто мое предположение. Они также могут присутствовать в некоторых системных вызовах, но не генерируются нормально компилятором и предоставляют некоторый простор для небезопасных развлечений и игр.
Endfilter
Передает управление от предложения filter исключения обратно обработчику исключений Common Language Infrastructure (CLI).
C# не поддерживает фильтрацию исключений. Однако компилятор VB, несомненно, использует это.
Initblk
Инициализирует указанный блок памяти по определенному адресу до заданного размера и начального значения.
Я собираюсь еще раз предположить, что это потенциально полезно в небезопасном коде и C++/CLI.
Jmp
Выход из текущего метода и переход к указанному методу.
Я предполагаю, что этот вид прыжков на батуте может быть полезен тем, кто хочет избежать хвостовых вызовов. Возможно, DLR использует это?
Tailcall
Выполняет постфиксную инструкцию вызова метода, так что кадр стека текущего метода удаляется до выполнения фактической инструкции вызова.
Подробно обсуждается в другом месте, в настоящее время компилятор С# не генерирует этот код операции.
Unaligned
Указывает, что адрес, находящийся в данный момент на вершине стека оценки, может быть не выровнен по естественному размеру непосредственно следующей инструкции ldind, stind, ldfld, stfld, ldobj, stobj, initblk или cpblk.
C# (и CLR) дает довольно много гарантий относительно выровненного характера большей части полученного кода и данных. Неудивительно, что это не испускается, но я понимаю, почему это должно быть включено.
Unbox
Преобразует упакованное представление типа значения в его неупакованную форму.
Компилятор C# предпочитает использовать инструкцию Unbox_Any
исключительно для этого. цель. Я предполагаю, что, основываясь на добавлении этого к набору инструкций в выпуске 2.0, это делает дженерики либо выполнимыми, либо намного проще. На тот момент использование его во всем коде для всего, дженериков или чего-то еще, было либо безопаснее, либо проще, либо быстрее (или какая-то комбинация всего).
Сноска:
Префикс1, Префикс2, Префикс3, Префикс4, Префикс5, Префикс6, Префикс7, префиксссылка
Инфраструктура. Это зарезервированная инструкция.
Это не инструкции как таковые. Некоторые инструкции IL длиннее других. Эти переменные длины должны начинаться с префиксов, которые никогда не действительны сами по себе, чтобы сделать синтаксический анализ понятным. Эти коды операций префикса зарезервированы для этого, поэтому они больше не используются. Несомненно, кто-то, реализующий синтаксический анализатор на основе оператора switch для последовательности IL, оценит это, чтобы он мог перехватывать их и поддерживать состояние.
person
ShuggyCoUk
schedule
18.08.2011