вторник, 4 декабря 2007 г.

MS IL друг человека

Блин уже 2 года но дот нете а IL так и не изучил. Щас борюсь с этим пробелом. Вот нашел ресурсы по нему(выдрал из одной статейки :-) ).

MSIL reference в DOC формате есть в директории Framework SDK :

Учебник ILDAsm с MSDN и хорошая статейка в выпуске за Май 2001 MSDN Magazine: "ILDASM is Your New Best Friend" John Robbins.

А если вам в лом читать то кратко:

Все работает через стек. регистров нету. Есть локальные переменные. Перед вызовом метода кладем данные в стек после читаем оттуда результат.

MSIL команды для записи в стек называются ld... (load). Команды для извлечения из стека называются st... (store), потомучто значения сторятся в переменных.

И для примера: код на C#

public Int32 add(Int32 a, Int32 b)
{
Int32 i = 1;
Object o = i;
i = (Int32)o;
return i;
}

Тоже самое в ILDASM:

.method public hidebysig instance int32 'add'(int32 a,
int32 b) cil managed Декларация метода
{
// Code size 23 (0x17)
.maxstack 1 Максимальная длина стека. У нас не более одного значения в стеке на все время выполнения
.locals init ([0] int32 i, Переменные
[1] object o,
[2] int32 CS$1$0000) Это переменная которая возвращается
IL_0000: nop Этот ноп(пустая комманда) вставлен так как компилилось без опции оптимайз
IL_0001: ldc.i4.1 Записываем в стек 1
IL_0002: stloc.0 Берем из стека в переменную под номером 0 тоесть i
IL_0003: ldloc.0 сохраняем из нее в стек
IL_0004: box [mscorlib]System.Int32 Выолняем боксинг так как вэлью в обджект
IL_0009: stloc.1 адрес упаковки из стека в переменную под номером 1 (O)
IL_000a: ldloc.1 из переменной под номером 1 в стек
IL_000b: unbox.any [mscorlib]System.Int32 Унбоксинг
IL_0010: stloc.0 из стека значение в переменную
IL_0011: ldloc.0 из переменной в стек
IL_0012: stloc.2 из стека в возвращаемую переменную
IL_0013: br.s IL_0015 хрень какаято :-)
IL_0015: ldloc.2 кладем в стек из возвращаемой переменной
IL_0016: ret Возврат
} // end of method Class1::'add' Конец фильма.

Все что написано тут не имеет никакой связи с реальным миром и является лишь домыслом автора :-)

Комментариев нет:

Linux.org.ru News

Вебпланета - все новости

CNews - Издание о высоких технологиях