Как это сделать does.NET JIT определить, как добавлять числа
CIL имеет один опкод для добавления чисел без проверки переполнения - add.
Этот код C#:
int a = 10;
int b = 20;
int c = a + b;
Выдает следующий код IL:
IL_0000: ldc.i4.s 10
IL_0002: stloc.0
IL_0003: ldc.i4.s 20
IL_0005: stloc.1
IL_0006: ldloc.0
IL_0007: ldloc.1
IL_0008: add
IL_0009: stloc.2
Как JIT во время выполнения определяет, какой тип x86-сложения он должен использовать (FPU opcode faddp для поплавков или add для целых чисел)?
1 ответ:
Среда CLR отслеживает типы значений в стеке вычислений, поэтому она знает, что непосредственно перед инструкцией
add
типы двух самых верхних значений в стеке находятся в кодеint32
. Это означает, что он знает, что должен выдать инструкцию для сложения 32-разрядных целых чисел.Если вы пишете код, в котором среда CLR не сможет определить типы операндов
add
, ваш код будет непроверяемым и, вероятно, приведет к мусорному машинному коду.