كيف إذا كان يبدو في IL؟
-
01-10-2019 - |
سؤال
ماذا تفعل if
يبدو أن البيان يبدو عندما يتم تجميعه في IL؟
إنه بناء بسيط للغاية في C#. هل يمكن أن يعطيني Sombody تعريفًا أكثر تجريدية لما هو عليه حقًا؟
المحلول
وهنا عدد قليل if
البيانات وكيف تترجم إلى IL:
ldc.i4.s 0x2f var i = 47;
stloc.0
ldloc.0 if (i == 47)
ldc.i4.s 0x2f
bne.un.s L_0012
ldstr "forty-seven!" Console.WriteLine("forty-seven!");
call Console::WriteLine
L_0012:
ldloc.0 if (i > 0)
ldc.i4.0
ble.s L_0020
ldstr "greater than zero!" Console.WriteLine("greater than zero!");
call Console::WriteLine
L_0020:
ldloc.0 bool b = (i != 0);
ldc.i4.0
ceq
ldc.i4.0
ceq
stloc.1
ldloc.1 if (b)
brfalse.s L_0035
ldstr "boolean true!" Console.WriteLine("boolean true!");
call Console::WriteLine
L_0035:
ret
شيء واحد يجب ملاحظته هنا: تعليمات IL هي دائمًا "عكس". if (i > 0)
يترجم إلى شيء يعني بشكل فعال "إذا i <= 0
, ، ثم القفز فوق جسم if
الكتلة".
نصائح أخرى
يتم استخدام تعليمات الفرع التي ستقفز إلى تعليمات مستهدفة اعتمادًا على القيمة (القيم) أعلى المكدس.
brfalse Branch to target if value is zero (false)
brtrue Branch to target if value is non-zero (true)
beq Branch to target if equal
bge Branch to target if greater than or equal to
bgt Branch to target if greater than
ble Branch to target if less than or equal to
blt Branch to target if less than
bne.un Branch to target if unequal or unordered
مثال بسيط:
ldloc.1 // loads first local variable to stack
ldc.i4.0 // loads constant 0 to stack
beq // branch if equal
هذا سيكون مساويا ل
if(i == 0) //if i is the first local variable
سوف تختلف IFS الأخرى ، بما في ذلك الفروع الشرطية. هذا حقًا أكثر من اللازم لشرحه في منشور واحد ، فمن الأفضل أن تبحث عن مقدمة لـ IL-Code.
هناك مقالة لطيفة عن CodeProject بخصوص هذا.
لا تنتمي إلى StackOverflow