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